本练习是module_shift.模块端口不是只有单个引脚,我们现在有以矢量作为端口的模块,您将在其上附加线矢量而不是普通线。与 Verilog 中的其他位置一样,端口的矢量长度不必与连接到它的导线匹配,但这会导致矢量的零填充或截断。本练习不使用矢量长度不匹配的连接。
您将获得一个具有两个输入和一个输出的模块(实现一组 8 D 触发器)。实例化其中三个,然后将它们链接在一起,形成长度为 8 的 3 位宽移位寄存器。此外,创建一个 4 对 1 多路复用器(未提供),该多路复用器根据以下条件选择要输出的内容:输入 d 处的值、第一个 d 字拖之后、第二个之后或第三个 D 触发器之后的值。(实质上,选择延迟输入的周期数,从零到三个时钟周期。my_dff8
sel[1:0]
sel
提供给您的模块是:module my_dff8 ( input clk, input [7:0] d, output [7:0] q );
未提供多路复用器。一种可能的编写方法是在带有语句的块内。(另请参阅:always
case
多路复用9to1V)
Module Declaration
module top_module (
input clk,
input [7:0] d,
input [1:0] sel,
output [7:0] q
);
module top_module (
input clk,
input [7:0] d,
input [1:0] sel,
output [7:0] q
);
wire [7:0] q1;
wire [7:0] q2;
wire [7:0] q3;
my_dff8 block1 ( .clk(clk),.d(d),.q(q1));
my_dff8 block2 ( .clk(clk),.d(q1),.q(q2));
my_dff8 block3 ( .clk(clk),.d(q2),.q(q3));
always @(*)
begin
case(sel)
2'b00 : q = d;
2'b01 : q = q1;
2'b10 : q = q2;
2'b11 : q = q3;
endcase
end
endmodule
总结:
首先:第一步设置内部wire型向量的三根导线;设置成q1,q2,q3;
第二步:将结构进行命名,我采用的是名字命名引用的方式:更为清晰;
第三步:进行选择always语句设置敏感源设置,敏感列表过多元素的话可以采用@*的形式
第四步:用case语句进行选择生成对应的电路,本题是实现的四选一的功能,输入对应那个根据选择,则输出也对应那根导线所连接的状态;