使用dff verilog的移位寄存器
shift register using dff verilog
我想创建一个使用 d 触发器作为基本结构元素的移位寄存器。
代码:
dff:
module dff(d,q,clk,rst);
input d,clk,rst;
output reg q;
always @(posedge clk)
begin:dff_block
if(rst==1'b1)
q=1'b0;
else
q=d;
end
endmodule
移位寄存器:
module shift_register(s1,d,clk,s0,q);
parameter n=3;
input s1,clk;
input [n:0] d;
output s0;
output [n:0] q;
genvar i;
assign d[3]=s1;
generate
for(i=0; i<=n; i=i+1)
dff U1(.d(d[i]),.q(q[i]),.clk(clk));
endgenerate
assign q[3]=d[2];
assign q[2]=d[1];
assign q[1]=d[0];
assign q[0]=s0;
endmodule
测试台:
module tb();
parameter n=3;
reg [n:0] d;
reg s1,clk;
wire [n:0] q;
wire s0;
shift_register UUT(.s1(s1),.d(d),.clk(clk),.q(q),.s0(s0));
initial begin
d=4'b0000;
clk=0;
end
always
begin:clok
#10 clk=~clk; s1=1;
end
endmodule
我认为测试台有 problem.I 尝试在 clk=1 时为每个 #10 给出 s1 值,但同样不起作用。
这段代码没有给我 q 的波形,s0.I 找不到什么 wrong.Any 想法?
你的代码有几个问题。
q
是dff的一个输出reg; q[i]
作为 q
传递给 dff。 q[i]
也在 assign
语句中赋值。因此,您有乘法驱动的 wire q[i]
,它很可能被解析为 x
并且永远不会改变。你的 i/o 在某处交换了。
你没有给s0
分配任何东西,所以它不会改变,也不会产生任何波形。
在这种特殊情况下,翻牌圈内的阻塞分配不会产生任何作用,但通常它们可能会导致不可预测的模拟结果。使用非阻塞。
那里的generate
循环没有多大意义。您可以将完整向量传递给 dff,也可以在 flop 中传递完整向量。
看来您对 assign
语句的方向感到困惑。它意味着方向。 assign q[0] = s0;
表示将 s0
的值分配给线 q[0]
,反之亦然。
我想创建一个使用 d 触发器作为基本结构元素的移位寄存器。 代码:
dff:
module dff(d,q,clk,rst);
input d,clk,rst;
output reg q;
always @(posedge clk)
begin:dff_block
if(rst==1'b1)
q=1'b0;
else
q=d;
end
endmodule
移位寄存器:
module shift_register(s1,d,clk,s0,q);
parameter n=3;
input s1,clk;
input [n:0] d;
output s0;
output [n:0] q;
genvar i;
assign d[3]=s1;
generate
for(i=0; i<=n; i=i+1)
dff U1(.d(d[i]),.q(q[i]),.clk(clk));
endgenerate
assign q[3]=d[2];
assign q[2]=d[1];
assign q[1]=d[0];
assign q[0]=s0;
endmodule
测试台:
module tb();
parameter n=3;
reg [n:0] d;
reg s1,clk;
wire [n:0] q;
wire s0;
shift_register UUT(.s1(s1),.d(d),.clk(clk),.q(q),.s0(s0));
initial begin
d=4'b0000;
clk=0;
end
always
begin:clok
#10 clk=~clk; s1=1;
end
endmodule
我认为测试台有 problem.I 尝试在 clk=1 时为每个 #10 给出 s1 值,但同样不起作用。
这段代码没有给我 q 的波形,s0.I 找不到什么 wrong.Any 想法?
你的代码有几个问题。
q
是dff的一个输出reg;q[i]
作为q
传递给 dff。q[i]
也在assign
语句中赋值。因此,您有乘法驱动的wire q[i]
,它很可能被解析为x
并且永远不会改变。你的 i/o 在某处交换了。你没有给
s0
分配任何东西,所以它不会改变,也不会产生任何波形。在这种特殊情况下,翻牌圈内的阻塞分配不会产生任何作用,但通常它们可能会导致不可预测的模拟结果。使用非阻塞。
那里的
generate
循环没有多大意义。您可以将完整向量传递给 dff,也可以在 flop 中传递完整向量。看来您对
assign
语句的方向感到困惑。它意味着方向。assign q[0] = s0;
表示将s0
的值分配给线q[0]
,反之亦然。