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
相关推荐
贝塔实验室9 小时前
FPGA 动态重构配置流程
驱动开发·fpga开发·硬件架构·硬件工程·射频工程·fpga·基带工程
GateWorld10 小时前
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
fpga开发·mipi csi2
思尔芯S2C12 小时前
思尔芯携手Andes晶心科技,加速先进RISC-V 芯片开发
人工智能·科技·fpga开发·risc-v·debugging·prototyping·soc validation
tiantianuser1 天前
RDMA简介5之RoCE v2队列
fpga开发·verilog·fpga·rdma·高速传输·rocev2
碎碎思1 天前
打破延迟极限的 FPGA 机械键盘
fpga开发·计算机外设
hahaha60162 天前
Flash烧录速度和加载配置速度(纯FPGA & ZYNQ)
fpga开发
hahaha60162 天前
ARINC818编解码设计FPGA实现
fpga开发
XMAIPC_Robot2 天前
基于RK3568的多网多串电力能源1U机箱解决方案,支持B码,4G等
linux·fpga开发·能源·边缘计算
迎风打盹儿2 天前
FPGA仿真中阻塞赋值(=)和非阻塞赋值(<=)区别
verilog·fpga·阻塞赋值·非阻塞赋值·testbench仿真
广药门徒2 天前
在使用一些不用驱动大电流的设备就可以用stm32的自己的上下拉但是本身上下拉不就是给iicspi这些他通信给信号的吗中怎么还跟驱动能力扯上了有什么场景嘛
stm32·单片机·fpga开发