使用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 想法?

你的代码有几个问题。

  1. q是dff的一个输出reg; q[i] 作为 q 传递给 dff。 q[i] 也在 assign 语句中赋值。因此,您有乘法驱动的 wire q[i],它很可能被解析为 x 并且永远不会改变。你的 i/o 在某处交换了。

  2. 你没有给s0分配任何东西,所以它不会改变,也不会产生任何波形。

  3. 在这种特殊情况下,翻牌圈内的阻塞分配不会产生任何作用,但通常它们可能会导致不可预测的模拟结果。使用非阻塞。

  4. 那里的generate循环没有多大意义。您可以将完整向量传递给 dff,也可以在 flop 中传递完整向量。

  5. 看来您对 assign 语句的方向感到困惑。它意味着方向。 assign q[0] = s0; 表示将 s0 的值分配给线 q[0],反之亦然。