verilog HDLBits刷题“Module fadd”--模块 fadd---加法器2
一、题目
在本练习中,您将创建一个具有两个层次级别的电路。您将实例化 (provided) 的两个副本,每个副本将实例化 (您必须写入) 的 16 个副本。因此,您必须编写两个模块: 和 .
top_module
add16
add1
top_module
add1
喜欢module_add,您将获得一个执行 16 位加法的模块。您必须实例化其中两个才能创建一个 32 位加法器。一个模块计算加法结果的低 16 位,而第二个模块计算结果的高 16 位。您的 32 位加法器不需要处理 carry-in (假设为 0) 或 carry-out (ignored)。
add16
add16
add16
如下图所示,将模块连接在一起。提供的模块具有以下声明:
add16
add16
module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
在每个 中,实例化 16 个完全加法器 (module , not provided) 以实际执行加法。您必须编写具有以下声明的完整 adder 模块:
add16
add1
module add1 ( input a, input b, input cin, output sum, output cout );
回想一下,全加器计算 a+b+cin 的和和并结出。
总之,此设计中有三个模块:
top_module
— 您的顶级模块,其中包含两个...add16
,提供 — 一个 16 位加法器模块,由 16 个...add1
— 一个 1 位全加法器模块。
如果您的提交缺少 ,您将收到一条错误消息,显示 .module add1
Error (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]));
endmodulemodule add1 ( input a, input b, input cin, output sum, output cout );assign {cout,sum}=a+b+cin;endmodule
四、时序