2015-11-02 183 views
0

我想在Verilog中使用D触发器创建一个4位计数器。我按照这个图http://i.imgur.com/VR5593a.png。我得到了个人D触发器的代码。我遇到的问题是D0在第一个时钟周期。我猜我必须假设Q0为1,Q1,Q2,Q3最初为0。我不知道如何在代码中只传递一次D0的初始值。verilog中的环形计数器

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 

回答

2

使用复位信号会帮助你。所以你只需要重置Q3到和其余的信号到。

0

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

对于仿真,您通常可以使用“初始”块来设置寄存器的初始状态。一些综合工具,特别是针对FPGA/CPLD的综合工具也支持以这种方式设置初始状态。一些不支持初始块的综合工具可能支持设置初始条件的工具特定方法。

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

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