【HDLBits】Verilog Language_Modules:Hierarchy_Adder1~Adder-subtractor
I. Adder1 (module add)
1.代码编写
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
wire cin2;
add16 instance1(.a(a[15:0]),.b(b[15:0]),.cin(1'b0),.sum(sum[15:0]),.cout(cin2));
add16 instance2(.a(a[31:16]),.b(b[31:16]),.cin(cin2),.sum(sum[31:16]),.cout());
endmodule
2.提交结果
3.题目分析
.b(b[15:0]) //将部分位[15:0]连到该实例的b端口。
.cin(1'b0) //cin连接一个常数信号
.cout() //不连接
II. Adder2 (module fadd)
1.代码编写
module top_module (
input [31:0] a,
input [31:0] b,
output [31:0] sum
);//
wire cin2;
add16 instance1(.a(a[15:0]),.b(b[15:0]),.cin(1'b0),.sum(sum[15:0]),.cout(cin2));
add16 instance2(.a(a[31:16]),.b(b[31:16]),.cin(cin2),.sum(sum[31:16]),.cout());
endmodule
module add1 ( input a, input b, input cin, output sum, output cout );
// Full adder module here
assign sum=a^b^cin;
assign cout=a&b | a&cin | b&cin;
endmodule
2.提交结果
3.题目分析
In this exercise, you will create a circuit with two levels of hierarchy. Your top_module will instantiate two copies of add16 (provided), each of which will instantiate 16 copies of add1 (which you must write). Thus, you must write two modules: top_module and add1.
adder16是写好的,它由16个adder1实例化形成,adder1没有给出,需要自己写,其他方面与前面的题目没什么区别。
III. Carry-select Adder (module cseladd)
1.代码编写
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
wire sel;
wire [15:0] sum0,sum2,sum3,sum4;
add16 instance1(.a(a[15:0]),.b(b[15:0]),.cin(1'b0),.sum(sum4),.cout(sel));
add16 instance2(.a(a[31:16]),.b(b[31:16]),.cin(1'b0),.sum(sum0),.cout());
add16 instance3(.a(a[31:16]),.b(b[31:16]),.cin(1'b1),.sum(sum2),.cout());
assign sum3=(sel)?sum2:sum0;
assign sum={sum3,sum4};
endmodule
2.提交结果
3.题目分析
之前设计的一直是行波进位加法器(carry-ripple adder),这里设计一个选择进位加法器(carry-select adder)。
行波进位加法器计算较慢,在第一级加法器运算结束之前,第二级加法器无法开始计算。
所以提出了选择进位加法器:计算出所有carry为0/1状态下的输出,再根据真实的carry去选择。
IV. Adder-subtractor (module addsub)
这道题在Verilog Language_Modules:Hierarchy_Adder Subtractor
1.代码编写
module top_module(
input [31:0] a,
input [31:0] b,
input sub,
output [31:0] sum
);
wire cout2;
wire [31:0] b2;
assign b2=(sub)?~b:b;
add16 instance1(.a(a[15:0]),.b(b2[15:0]),.cin(sub),.sum(sum[15:0]),.cout(cout2) );
add16 instance2(.a(a[31:16]),.b(b2[31:16]),.cin(cout2),.sum(sum[31:16]),.cout() );
endmodule
2.提交结果
3.题目分析
The net result is a circuit that can do two operations: (a + b + 0)(when sub=0) and (a + ~b + 1)(when sub=1)
特别的,这种情况下的XOR门可以看作一个反相器+Mux2to1组成。
本文含有隐藏内容,请 开通VIP 后查看