0

我正在尝试使用 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
4

3 回答 3

2

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

于 2015-11-02T08:19:47.110 回答
0

verilog 将所有 4 状态变量初始化为“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
于 2017-06-21T14:08:10.807 回答
0

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

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

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

于 2017-06-21T02:12:30.970 回答