问题19 Module
下图显示了一个带有子模块的简单的电路。在本练习中,创建模块 mod_a 的一个实例,然后将模块的三个引脚(in1、in2 和 out)连接到顶层模块的三个端口(线 a、b 和 out)。模块 mod_a 是为您提供的——您必须实例化它。
将信息连接到端口
将物理电线连接到端口有两种常用的方法: by position or by name. 按位置或按名称。
By position
按位置将电线连接到端口的语法应该很熟悉,因为它使用类似 C 的语法。实例化模块时,端口根据模块的声明从左到右连接。例如:
mod_a instance1 (wa,wb,wc);
这会实例化一个 mod_a
类型的模块,并给它一个实例名称“instance1
”,然后将信号 wa
(在新模块外部)连接到新模块的第一个端口(in1
),将 wb
连接到第二个端口(in2
),然后wc
到第三个端口(out
)。
By name
按名称将信号连接到模块的端口可以使电线保持正确连接,即使端口列表发生更改。然而,这种语法更加冗长。
mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) );
上面的行实例化了一个名为“instance2”的 mod_a 类型的模块,然后将信号 wa(模块外部)连接到名为 in1 的端口,将 wb 连接到名为 in2 的端口,将 wc 连接到名为 out 的端口。请注意,端口的顺序在这里是不相关的,因为无论其在子模块的端口列表中的位置如何,都将连接到正确的名称。还要注意此语法中端口名称前面的句点。
module top_module ( input a, input b, output out ); mod_a instance2 (.out(out), .in1(a), .in2(b) ); endmodule
问题20 Connecting ports by position(Module pos)
这个问题和上一个问题19类似。您将获得一个名为 mod_a 的模块,该模块按顺序具有 2 个输出和 4 个输入。您必须按位置将 6 个端口按顺序连接到顶层模块的端口 out1、out2、a、b、c 和 d。
您将获得以下模块:
module mod_a ( output, output, input, input, input, input );
module top_module ( input a, input b, input c, input d, output out1, output out2 ); mod_a mod_a ( out1, out2, a, b, c, d ); endmodule
问题21 Connecting ports by name(Module name)
您将获得一个名为 mod_a
的模块,该模块按某种顺序具有 2
个输出和 4
个输入。您必须按名称将 6
个端口连接到顶层模块的端口:
您将获得以下模块:
module mod_a ( output out1, output out2, input in1, input in2, input in3, input in4); • 1
module top_module ( input a, input b, input c, input d, output out1, output out2 ); mod_a mod_a( .in1(a), .in2(b), .in3(c), .in4(d), .out1(out1), .out2(out2) ); endmodule
问题22 Three modules(Module shift)
您将获得一个带有两个输入和一个输出的模块 my_dff
(实现 D
触发器)。将其中三个实例化,然后将它们链接在一起以制成长度为 3 的移位寄存器。 clk
端口需要连接到所有实例。
提供给你的模块是:
module my_dff(input clk, input d, output q); • 1
请注意,要建立内部连接,您需要声明一些连线。命名你的连线和模块实例时要小心:名称必须是唯一的。
module top_module ( input clk, input d, output q ); wire w1_2; wire w2_3; my_dff dff1( .clk(clk), .d(d), .q(w1_2) ); my_dff dff2( .clk(clk), .d(w1_2), .q(w2_3) ); my_dff dff3( .clk(clk), .d(w2_3), .q(q) ); endmodule
问题23 Modules and vectors(Module shift8)
本练习是 module_shift 的扩展。模块端口不再只是单个引脚,我们现在有带有向量作为端口的模块,您将连接线向量而不是普通线。与 Verilog 中的其他任何地方一样,端口的向量长度不必与连接到它的导线相匹配,但这会导致向量的零填充或截断。本练习不使用向量长度不匹配的连接。
您将获得一个带有两个输入和一个输出的模块 my_dff8(实现一组 8 个 D 触发器)。实例化其中三个,然后将它们链接在一起,形成一个长度为3的8位宽移位寄存器。此外,创建一个4对1多路复用器(未提供),该多路复用器根据sel[1:0]:输入d处、第一个d触发器之后、第二个d触发器之后或第三个d触发器之后的值来选择要输出的内容。(本质上,sel选择延迟输入的周期数,从零到三个时钟周期。)
提供给你的模块是:
module my_dff8(input clk, input [7:0] d, output [7:0] q); • 1
未提供多路复用器。一种可能的编写方法是在一个带有 case
语句的 always 块中。 (另见:mux9to1v)
module top_module ( input clk, //clock signal input [7:0] d, //Enter 8 groups of data input [1:0] sel, //2-bit selector output [7:0] q //8-bit output ); wire [7:0] w1_1,w1_2,w1_3; //8-bit output my_dff8 my_dff81( .clk(clk), .d(d), .q(w1_1) ); my_dff8 my_dff82( .clk(clk), .d(w1_1), .q(w1_2) ); my_dff8 my_dff83( .clk(clk), .d(w1_2), .q(w1_3) ); always @(*) begin case(sel) 0: begin q <= d; end 1: begin q <= w1_1; end 2: begin q <= w1_2; end 3: begin q <= w1_3; end endcase end endmodule