问题24 Adder 1(Module add)
您将获得一个执行16位加法的模块add16。实例化其中两个以创建32位加法器。一个add16模块计算加法结果的低16位,而第二个add16模块在从第一个加法器接收进位后计算结果的高16位。您的32位加法器不需要处理进位(假设为0)或进位(忽略),但内部模块需要处理才能正常工作。(换句话说,add16模块执行16位a+b+cin,而您的模块执行32位a+b)。
如下图所示将模块连接在一起。提供的模块 add16 具有以下声明:
module add16(input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout);
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/a3998a0a74924f95b124ef6d2e63c827.png
module top_module( input [31:0] a, input [31:0] b, output [31:0] sum ); parameter z = 0; wire w; add16 add161( .a(a[15:0]), .b(b[15:0]), .cin(z), .cout(w), .sum(sum[15:0]) ); add16 add162( .a(a[31:16]), .b(b[31:16]), .cin(w), .sum(sum[31:16]) ); endmodule
问题25 Adder 2(Module fadd)
在本练习中,您将创建具有两个层次结构的电路。您的 top_module
将实例化 add16 的两个副本(已提供),每个副本将实例化 add1 的 16 个副本(您必须编写)。
与module\u add一样,您也会得到一个执行16位加法的module add16。必须实例化其中的两个才能创建32位加法器。一个add16模块计算加法结果的低16位,而第二个add16模块计算结果的高16位。您的32位加法器不需要处理进位(假定为0)或进位(忽略)。
如下图所示将 add16 模块连接在一起。提供的模块 add16 具有以下声明:
module add16(input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout);
在每个 add16
中,实例化了 16
个全加器(模块 add1
,未提供)以实际执行加法。您必须编写具有以下声明的完整加法器模块:
module add1( input a, input b, input cin, output sum, output cout ); • 1
总之,本题中一共有三个模块:
top_module
:包含两个16
位加法器的顶层模块;add16
(已给出):一个16bit
的加法器,由16
个全加器构成;
3.add
(未给出):1bit
全加器。
module top_module ( input [31:0] a, input [31:0] b, output [31:0] sum );// wire w; add16 add161( .a(a[15:0]), .b(b[15:0]), .cin(1'b0), .cout(w), .sum(sum[15:0]) ); add16 add162( .a(a[31:16]), .b(b[31:16]), .cin(w), .sum(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) | (b & cin); endmodule