HDLBits答案4-Modules:Hierarchy

文章目录

1. Modules

只要使用的所有模块都同属一个项目,就可以通过在模块内部实例化,来创建模块的层次结构。
两种方式分别是按位置和按名称连接,
按位置调(简洁但不稳,顺序不能乱),按名称调(顺序可变)
按位置:mod_a instance1 (wa, wb, wc )
按名称:mod_a instance2 (.out(wc), .in1(a), .in2(b))
HDLBits答案4-Modules:Hierarchy

module top_module (input a, input b, output out)
	mod_a inst1 (a,b,out);
	//mod_a inst2 (.out(out), .in1(a), .in2(b));
endmodule

2. Connecting ports by position

HDLBits答案4-Modules:Hierarchy

module top_module (
	input a,
	input b,
	input c,
	input d,
	output out1,
	output out2);
	mod_a inst1(out1,out2,a,b,c,d);
endmodule

3.Connecting ports by name

HDLBits答案4-Modules:Hierarchy

module top_module(
	input a,
	input b,
	input c,
	input d,
	output out1,
	output out2);
	mod_a inst1(.out1(out1), .out2(out2), .in1(a), .in2(b), .in3(c), .in4(d));
endmodule

4. Three modules

已有一个模块my_dff,其中有两个输入和一个输出(D触发器)。实例化三个D触发器然后将它们连接在一起,实现一个长度为3的移位寄存器。clk端口需要连接到所有my_dff实例。
HDLBits答案4-Modules:Hierarchy

module top_module(input clk, input d, output q);
	wire w1,w2;
	my_dff inst1(.clk(clk), .d(d), .q(w1));
	my_dff inst2(.clk(clk), .d(w1), .q(w2));
	my_dff inst3(.clk(clk), .d(w2), .q(q));
endmodule

5.Modules and vectors

已有一个模块my_dff8,它具有两个输入和一个输出(实现一组8位的D触发器)。实例化其中的三个,然后将它们连接在一起,实现一个长度为3的8位宽移位寄存器。另外,构造一个4-1多路选择器,根据sel[1:0]选择输出值。本质上,sel选择的是延迟输入的周期.
已有模块:module my_dff8 ( input clk, input [7:0] d, output [7:0] q )
HDLBits答案4-Modules:Hierarchy

module top_module(
	input clk,
	input [7:0] d,
	input [1:0] sel,
	output [7:0] q);
	wire [7:0] w1,w2,w3;
	my_dff8 inst1(.clk(clk), .d(d), .q(w1));
	my_dff8 inst2(.clk(clk), .d(w1), .q(w2));
	my_dff8 inst3(.clk(clk), .d(w2), .q(w3));
	always@(*)begin
	case(sel)
		2'b00:q = d;
		2'b01:q = w1;
		3'b10:q = w2;
		4'b11:q = w3;
	endcase
	end
endmodule

6. Add1

获得一个add16执行 16 位加法的模块。实例化其中两个以创建 32 位加法器。在从第一个加法器接收进位后,一个 add16 模块计算加法结果的低 16 位,而第二个 add16 模块计算结果的高 16 位。您的 32 位加法器不需要处理进位(假设为 0)或进位(忽略),但内部模块需要处理才能正常工作。
已有模块:module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
HDLBits答案4-Modules:Hierarchy

module top_module (
	input [31:0] a,
	input [31:0] b,
	output [31:0] sum);
	wire [15:0] low_out;
	wire [15:0] high_out;
	wire count1,count2;
	add16 low (a[15:0], b[15:0], 0, low_out, count1);
	add16 high (a[31:16], b[31:16], count1, high_out, count2);
	assign sum = {high_out, low_out};
endmodule

7. Add2

在top_module中,实例化两个add16模块(已为您提供),每个add16中实例化16个add1实例(此模块需要您编写)。所以,需要描述两个模块:top_module和add1
已有模块:module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
HDLBits答案4-Modules:Hierarchy
全加器的逻辑表达式:

sum = a ^ b ^ cin;
count = (a&b)|(a&cin)|(b&cin);
module top_module(
	input [31:0] a,
	input [31:0] b,
	input [31:0] sum);
	wire count;
	add16 low ( a[15:0],  b[15:0], 0, sum[15:0], count );
	add16 high ( a[31:16],  b[31:16], count, 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

8. Carry-select adder

已有模块:module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
HDLBits答案4-Modules:Hierarchy

module top_module(
	input [31:0] a,
	input [31:0] b,
	output [31:0] sum);
	wire cout;
	wire [15:0] sum0,sum1;
	add16 low(a[15:0], b[15:0], 1'b0, sum[15:0], cout);
	add16 high1(a[31:16], b[31:16], 1'b0, sum0);
	add16 high2(a[31:16], b[31:16],1'b1, sum1);
	assign sum[31:16] = count?sum1:sum0;
endmodule

9.Adder-subractor

当sub为1时,使用32位的异或门对B进行取反.
异或门也可以看作是可编程的非门,其中一个输入控制是否应该反转另一个.
已有模块:module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );
HDLBits答案4-Modules:Hierarchy

module top_module (
	input [31:0] a,
	input [31:0] b,
	input sub,
	output [31:0] sum);
	wire carry;
	wire [31:0] b_n;
	assign b_n = b ^ {32{sub}};
	add16 a0(a[15:0], b_n[15:0], sub, sum[15:0], carry);
	add16 a1(a[31:16], b_n[31:16], carry, sum[31:16]);
endmodule
上一篇:12、容器内部删除一个元素


下一篇:HDLBits第七章练习及答案