verilog HDLBits刷题“Module fadd”--模块 fadd---加法器2

📅 2026/7/17 13:47:11 👁️ 阅读次数 📝 编程学习
verilog HDLBits刷题“Module fadd”--模块 fadd---加法器2

一、题目

在本练习中,您将创建一个具有两个层次级别的电路。您将实例化 (provided) 的两个副本,每个副本将实例化 (您必须写入) 的 16 个副本。因此,您必须编写两个模块: 和 .top_moduleadd16add1top_moduleadd1

喜欢module_add,您将获得一个执行 16 位加法的模块。您必须实例化其中两个才能创建一个 32 位加法器。一个模块计算加法结果的低 16 位,而第二个模块计算结果的高 16 位。您的 32 位加法器不需要处理 carry-in (假设为 0) 或 carry-out (ignored)。add16add16add16

如下图所示,将模块连接在一起。提供的模块具有以下声明:add16add16

module add16 ( input[15:0]a, input[15:0]b, inputcin, output[15:0]sum, outputcout);

在每个 中,实例化 16 个完全加法器 (module , not provided) 以实际执行加法。您必须编写具有以下声明的完整 adder 模块:add16add1

module add1 ( input a, input b, input cin, output sum, output cout );

回想一下,全加器计算 a+b+cin 的和和并结出。

总之,此设计中有三个模块:

  • top_module— 您的顶级模块,其中包含两个...
  • add16,提供 — 一个 16 位加法器模块,由 16 个...
  • add1— 一个 1 位全加法器模块。


如果您的提交缺少 ,您将收到一条错误消息,显示 .module add1Error (12006): Node instance "user_fadd[0].a1" instantiates undefined entity "add1"

模块声明

module top_module ( input [31:0] a, input [31:0] b, output [31:0] sum );

二、分析

在顶层例化子模块,应该是只需要例化与顶层模块直接相连的子模块add16,实例化两个16位全加器实现不带进位输出的32位加法器。

在模块add1中,实现的是一位的全加器。

三、代码实现

module top_module ( input [31:0] a, input [31:0] b, output [31:0] sum );// wire c_mid; add16 inst1(.a(a[15:0]),.b(b[15:0]),.cin(1'b0),.cout(c_mid),.sum(sum[15:0])); add16 inst2(.a(a[31:16]),.b(b[31:16]),.cin(c_mid),.cout(),.sum(sum[31:16])); endmodule module add1 ( input a, input b, input cin, output sum, output cout ); assign {cout,sum}=a+b+cin; endmodule 或者 module top_module ( input [31:0] a, input [31:0] b, output [31:0] sum );// wire cout1; add16 instance1(a[15:0],b[15:0],1'b0,sum[15:0],cout1); add16 instance2(a[31:16],b[31:16],cout1,sum[31:16],); endmodule module add1 ( input a, input b, input cin, output sum, output cout ); assign sum=a+b+cin; assign cout=(a&b)|(a&cin)|(cin&b); endmodule

四、时序