首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

数字逻辑电路半减器

数字逻辑电路半减器

本帖最后由 look_w 于 2017-9-23 16:32 编辑

0x00 废话不多说,直接贴上半减器的真值表如下
    我们来理解一下半减器的原理,我们知道,这是针对于二进制的运算。当0-0=0,此时没有向高位借位,所以对于高位借位则为0。那么0-1呢?我们知道,二级制运算以1当2(也就是10),所以没法减去1,只能向高位进行借位操作,此时对于高位借位则为1,借位之后变成“2”(10),最后运算的结果为1。同理,再分析其他情况的运算也是如此。
    贴上verilog描述
module h_suber(a, b, s, c);    input a, b;    output s, c;    assign s = a ^ b; //输出差值    assign c = b & (~a); //向高位的借位endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
    0x01进一步加深,我们来学习下全减器,在半减器的基础上增加了来自低位的借位,这里可以对比全加器的规则,对于全加器是存在来自低位的“进位”,进行运算的时候也把低位进位考虑其中。所以对于全减器的规则,我们则把低位的借位给减去,再根据被减数和减数来判断高位的借位。也可以这样理解,对于低位的借位,因为是低位向被减数这一位借的,所以被减数应当被减去一位1。
运算公式:A-B-C1=D(C2的值取决于运算的结果是否需要向高位借位)

//被减数x,减数y,低位借位sub_in,高位借位sub_out,差diffr//例化语句实现module f_suber(x, y, sub_in, sub_out, diffr);    input x, y, sub_in;    output sub_out, diffr;    wire net1, net2, net3;    //h_suber(a, b, s, c);    h_suber u1(x, y, net1, net2);    h_suber u2(net1, sub_in, diffr, net3);    or u3(sub_out, net2, net3);endmodule
返回列表