verilog HDLBits刷题“Module addsub”--模块 addsub---加法器-减法器

📅 2026/7/17 16:25:12
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, inputcin, output[15:0]sum, outputcout);当 sub 为 1 时使用 32 位宽的 XOR 门反转 b 输入。这也可以看作是 b[310] 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_midb^{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 或者 module top_module( input [31:0] a, input [31:0] b, input sub, output [31:0] sum ); wire [31:0]b_sub; wire cout1; assign b_subb^{32{sub}}; add16 instance1(a[15:0],b_sub[15:0],sub,sum[15:0],cout1); add16 instance2(a[31:16],b_sub[31:16],cout1,sum[31:16],); endmodule四、时序结果