【问题标题】:Ring Counters in verilogVerilog 中的环形计数器
【发布时间】:2017-06-21 22:08:10
【问题描述】:

我正在尝试使用 Verilog 中的 D 触发器创建一个 4 位计数器。我正在关注这张图http://i.imgur.com/VR5593a.png。我得到了单个 D 触发器的代码。我遇到的问题是第一个时钟周期中的 D0。我猜我必须首先假设 Q0 为 1,Q1、Q2、Q3 为 0。我不确定如何在代码中只传递一次 D0 的初始值。

module DFlipFlop(CLK, D, Q);
  input CLK, D;
  output Q;
  reg Q;
  always @(posedge CLK) begin
    Q <= D;
      end
endmodule

module RippleMod(CLK, q0, q1, q2, q3);
  input CLK;
  output q0, q1, q2, q3;

  DFlipFlop d1 (CLK,q3,q0);//not sure about q3 there, think I will get X if i do this.
  DFlipFlop d2 (CLK,q0,q1);
  DFlipFlop d3 (CLK,q1,q2);
  DFlipFlop d4 (CLK,q2,q4);
endmodule

【问题讨论】:

    标签: verilog iverilog


    【解决方案1】:

    使用重置信号会对您有所帮助。因此,您只需将 Q3 重置为 1 并将其余信号重置为 0

    【讨论】:

      【解决方案2】:

      你需要做一些事情来设置初始状态。

      对于模拟,您通常可以使用“初始”块来设置寄存器的初始状态。一些综合工具,尤其是那些以 FPGA/CPLD 为目标的综合工具,也支持以这种方式设置初始状态。一些不支持初始模块的综合工具可能支持特定工具设置初始条件的方式。

      另一种选择是在您的触发器中构建一条复位线。这样做的缺点当然是您需要一些东西来触发重置线,无论是您的模拟测试台还是实际实现中的某种硬件。

      【讨论】:

        【解决方案3】:

        verilog 将所有四态变量初始化为“x”。因此,您将永远在循环周围运行一个“x”,而无需任何真正的改变。您需要为您的案例提供意见。类似于以下内容(在 SV 中)

        module RippleMod(CLK, en, in, q0, q1, q2, q3);
          input CLK, en, in;
          output q0, q1, q2, q3;
          logic d1in;
          always_ff @(negedge clk) begin
            if (en)
               d1in <= in;
            else
               d1in <= q3;
          end
        
          DFlipFlop d1 (CLK,d1in,q0);
          DFlipFlop d2 (CLK,q0,q1);
          DFlipFlop d3 (CLK,q1,q2);
          DFlipFlop d4 (CLK,q2,q4);
        endmodule
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多