文章目录
- 1. Modules
- 2. Connecting ports by position
- 3.Connecting ports by name
- 4. Three modules
- 5.Modules and vectors
- 6. Add1
- 7. Add2
- 8. Carry-select adder
- 9.Adder-subractor
1. Modules
只要使用的所有模块都同属一个项目,就可以通过在模块内部实例化,来创建模块的层次结构。
两种方式分别是按位置和按名称连接,
按位置调(简洁但不稳,顺序不能乱),按名称调(顺序可变)
按位置:mod_a instance1 (wa, wb, wc )
按名称:mod_a instance2 (.out(wc), .in1(a), .in2(b))
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
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
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实例。
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 )
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 );
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 );
全加器的逻辑表达式:
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 );
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 );
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