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
相关推荐
风_峰3 天前
Ubuntu Linux SD卡分区操作
嵌入式硬件·ubuntu·fpga开发
FPGA_Linuxer3 天前
FPGA 40 DAC线缆和光模块带光纤实现40G UDP差异
网络协议·fpga开发·udp
风_峰3 天前
Petalinux相关配置——ZYNQ通过eMMC启动
嵌入式硬件·ubuntu·fpga开发
风_峰3 天前
【ZYNQ开发篇】Petalinux和电脑端的静态ip地址配置
网络·嵌入式硬件·tcp/ip·ubuntu·fpga开发
碎碎思3 天前
一块板子,玩转 HDMI、USB、FPGA ——聊聊开源项目 HDMI2USB-Numato-Opsis
fpga开发
ooo-p3 天前
FPGA学习篇——Verilog学习Led灯的实现
学习·fpga开发
嵌入式-老费3 天前
Zynq开发实践(FPGA之选择开发板)
fpga开发
风_峰4 天前
PuTTY软件访问ZYNQ板卡的Linux系统
linux·服务器·嵌入式硬件·fpga开发
电子凉冰4 天前
FPGA入门-状态机
fpga开发
Aczone284 天前
硬件(十)IMX6ULL 中断与时钟配置
arm开发·单片机·嵌入式硬件·fpga开发