本练习是module_shift.模块端口不再只是单个引脚,我们现在有以向量作为端口的模块,您将连接导线矢量而不是普通导线。与Verilog中的其他任何地方一样,端口的矢量长度不必与连接到它的导线相匹配,但这将导致矢量的零填充或截断。本练习不使用矢量长度不匹配的连接。
您将获得一个具有两个输入和一个输出的模块(实现一组8 D触发器)。实例化其中的三个,然后将它们链接在一起,形成长度为 3 的 8 位宽移位寄存器。此外,创建一个4对1多路复用器(未提供),该多路复用器选择输出内容取决于:输入d处的值,第一个D之后,第二个多路复用器之后,或第三个D触发器之后的值。(实质上,选择延迟输入的周期数,从零到三个时钟周期。my_dff8
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] q1,q2,q3;
my_dff8 inst1 (clk,d,q1);
my_dff8 inst2 (clk,q1,q2);
my_dff8 inst3 (clk,q2,q3);
always@(*)//忘记了这种用(*)表示所有信号
begin
case(sel[1:0])//也要指明位宽
2'b00: q <= d[7:0];
2'b01: q <= q1[7:0];
2'b10: q <= q2;//!必须指明sel赋值的位宽2'b,不指明,就是错的!;
//而q的位宽不指明是没有问题的(最好写上);
2'b11: q <= q3[7:0];//时序逻辑采用非阻塞赋值
default: q = 0;
endcase//case语句要以endcase结束
end
endmodule