verilog HDLBits刷题“Module addsub”--模块 addsub---加法器-减法器
一、题目
可以通过选择性地否定其中一个 inputs,从 adder 构建 adder-subtractor,这相当于反转 input 然后加 1。最终结果是一个可以执行两个作的电路:(a + b + 0) 和 (a + ~b + 1)。如果您想更详细地解释此电路的工作原理,请参阅 Wikipedia。
在下面构建 adder-subtractor。
你得到了一个 16 位的 adder 模块,你需要实例化它两次:
module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
当 sub 为 1 时,使用 32 位宽的 XOR 门反转 b 输入。(这也可以看作是 b[31:0] XOR 和 sub 复制 32 次。看复制作员.).还将 sub input 连接到 adder 的 carry-in。
模块声明
module top_module(input [31:0] a,input [31:0] b,input sub,output [31:0] sum );
二、分析
实现32位加减法,输入sub确定加减
1、未知的线命名为b_mid,c_mid;
2、计算b与sub的异或;
3、例化两个16位加法器。
三、代码实现
module top_module(input [31:0] a,input [31:0] b,input sub,output [31:0] sum
);wire c_mid;wire [31:0]b_mid;assign b_mid=b^{32{sub}};add16 inst1(.a(a[15:0]),.b(b_mid[15:0]),.cin(sub),.cout(c_mid),.sum(sum[15:0]));add16 inst2(.a(a[31:16]),.b(b_mid[31:16]),.cin(c_mid),.cout(),.sum(sum[31:16]));endmodule
四、时序结果