数字逻辑电路基础-组合逻辑电路之4位加减法器

文章目录

    • 一、4位加减法器
    • 二、verilog源码
    • 三、综合及仿真结果


一、4位加减法器

本文在上一篇加法器的基础上,更进一步介绍如何实现4位加减法器。

在计算机中如何表示负数呢?通常使用补码方式进行表示,比如-7,它的4位二进制补码为1001,如何得到呢?将7的4位二进制0111,先取反,再加1就可以得到-7的二进制补码1001。1011与0111两者互为补码。

先看一下4位二进制加法器,在1位二进制加法器基础上,我们通过级联,将低位进位接入到高位进位输入,最终形成4位二进制加法器。

数字逻辑电路基础-组合逻辑电路之4位加减法器_第1张图片

有了4位二进制加法器,我们怎么实现减法器呢?比如a-b,我们可以写成:a-b=a+(-b)=a+(~b)+1, ~b表示对b取反,我们只需要通过增加一个减法控制信号sub实现是否对b取反还是保持原值。当sub=1时,b^sub= ~b,当sub=0时, b ^sub=b。

数字逻辑电路基础-组合逻辑电路之4位加减法器_第2张图片


二、verilog源码


// sub_adder
module sub_adder(a, b, cin, sub, s, cout);

   input [3:0] a, b;
   input sub, cin;
   output [3:0] s;
   output cout;

   wire citmp = cin ^ sub;
   wire [3:0] btmp = b ^ {4{sub}};
   wire [2:0] cotmp;
   
   full_adder u0(a[0], btmp[0], citmp, s[0], cotmp[0]);
   full_adder u1(a[1], btmp[1], cotmp[0], s[1], cotmp[1]);
   full_adder u2(a[2], btmp[2], cotmp[1], s[2], cotmp[2]);
   full_adder u3(a[3], btmp[3], cotmp[2], s[3], cout);
endmodule // sub_adder

module full_adder(a, b, cin, s, cout);

   input a, b, cin;
   output s, cout;

   assign s = a ^ b ^ cin;
   assign cout = (a & b) | ((a ^ b) & cin);
endmodule // full_adder


	

三、综合及仿真结果

本文使用的综合工具为quartus13.1,软件的使用请搜索相关教程。综合生成的RTL层次网表如下,可以看出它生成的门级电路和上面的图相同。
数字逻辑电路基础-组合逻辑电路之4位加减法器_第3张图片

仿真结果如下:

数字逻辑电路基础-组合逻辑电路之4位加减法器_第4张图片

你也可以试着修改上述的输入值或者添加更多的输入值进行试验,观察仿真结果是否和你预期的一致!


转载请注明出处!

你可能感兴趣的:(数字电路,fpga开发)