Verilog刷题[hdlbits] :Module add

题目:Module add

You are given a module add16 that performs a 16-bit addition. Instantiate two of them to create a 32-bit adder. One add16 module computes the lower 16 bits of the addition result, while the second add16 module computes the upper 16 bits of the result, after receiving the carry-out from the first adder. Your 32-bit adder does not need to handle carry-in (assume 0) or carry-out (ignored), but the internal modules need to in order to function correctly. (In other words, the add16 module performs 16-bit a + b + cin, while your module performs 32-bit a + b).

  • 您将获得一个执行16位加法的模块add16。实例化其中两个以创建一个32位加法器。一个add16模块计算加法结果的下16位,而第二个add16模块在接收到第一个加法器的执行后计算结果的上16位。您的32位加法器不需要处理低位向本位的进位输入信号(假设为0)或本位向高位的进位输出信号(忽略),但内部模块需要这样做才能正常工作。(换句话说,add16模块执行16位a + b + cin,而您的模块执行32位a + b)。

Connect the modules together as shown in the diagram below. The provided module add16 has the following declaration:

  • 将模块连接在一起,如下图所示。所提供的模块add16有以下声明:
    module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
objectivec 复制代码
module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    //定义低16位加法器的输入与输出信号
    wire [15:0] add1_a;
    wire [15:0] add1_b;
    wire        cout1; //进位信号
    
   //定义高16位加法器的输入与输出信号
    wire [15:0] add2_a;
    wire [15:0] add2_b;
   	
    //对应进行赋值
    assign add1_a = a[15:0];
    assign add1_b = b[15:0];
    
    assign add2_a = a[31:16];
    assign add2_b = b[31:16];
    
    //低16位
    add16 add16_init_1(
        .a(add1_a),
        .b(add1_b),
        .cin(1'b0),
        .sum(sum[15:0]),
        .cout(cout1)
    );
    
    //高16位 
    add16 add16_init_2(
        .a(add2_a),
        .b(add2_b),
        .cin(cout1),
        .sum(sum[31:16])
    );
    
endmodule

上面的代码定义了 wire型变量使代码更加明了,但也可以使用下面的方法,只需定义一个进位信号即可。

objectivec 复制代码
module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
  
    wire        cout1; //进位信号
    //低16位
    add16 add16_init_1(
        .a(a[15:0]),
        .b(b[15:0]),
        .cin(1'b0),
        .sum(sum[15:0]),
        .cout(cout1)
    );
    
    //高16位 
    add16 add16_init_2(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(cout1),
        .sum(sum[31:16])
    );
    
endmodule
相关推荐
第二层皮-合肥7 小时前
基于FPGA的雷达信号处理设计工具包分享
fpga开发·信号处理
美好的事情总会发生7 小时前
FPGA的LVDS接口电压
嵌入式硬件·fpga开发·硬件工程·智能硬件
卡奥斯开源社区官方12 小时前
量子计算“平价革命”深度解析:AMD破局FPGA方案+中国千比特云服务,技术拐点已至?
fpga开发·量子计算
贝塔实验室15 小时前
译码器的结构
驱动开发·算法·网络安全·fpga开发·硬件工程·信息与通信·信号处理
bnsarocket1 天前
Verilog和FPGA的自学笔记9——呼吸灯
笔记·fpga开发·verilog·自学·硬件编程
国科安芯1 天前
基于AS32A601型MCU芯片的屏幕驱动IC方案的技术研究
服务器·人工智能·单片机·嵌入式硬件·fpga开发
cmc10281 天前
145.vivado采信号时ILA用一个probe要比用多个节约资源
fpga开发
白又白、2 天前
数据cdc (clock domain cross)
fpga开发
FakeOccupational2 天前
fpga系列 HDL : Microchip FPGA开发软件 Libero 中导出和导入引脚约束配置
fpga开发
贝塔实验室2 天前
LDPC 码的构造方法
算法·fpga开发·硬件工程·动态规划·信息与通信·信号处理·基带工程