只要使用的所有模块都同属一个项目,就可以通过在模块内部实例化,来创建模块的层次结构。
两种方式分别是按位置和按名称连接,
按位置调(简洁但不稳,顺序不能乱),按名称调(顺序可变)
按位置: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
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
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
已有一个模块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
已有一个模块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
获得一个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
在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
已有模块: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
当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