【verilog学习11】HDLBits:Verilog Language_Modules:Hierarchy_Adder1~Adder-subtractor

发布于:2023-02-14 ⋅ 阅读:(481) ⋅ 点赞:(0)

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 后查看