verilog中模块中一个周期的奇怪延迟

时间:2013-12-10 14:07:52

标签: module delay verilog

我是verilog和数字电路的初学者,我在下面的代码中有一个疑问。在这段代码中,我创建了一个状态机,它将“reg”中的值保存到verilog中的另一个模块中。我制作这段代码只是为了解释我的疑问:

//STATE MACHINE

module RegTest(clk,enable,reset, readData1_out);


    parameter State1 = 0;
    parameter State2 = 1;
    parameter State3 = 2;
    parameter State4 = 3;
    parameter State5 = 4;
    parameter State6 = 5;
    parameter State7 = 6;
    parameter State8 = 7; 
    parameter State9 = 8;
    parameter State10 = 9;   
    parameter Beg = 10;
    input clk, enable, reset;
    output readData1_out;



    wire clk,enable, reset;
    reg[5:0] State;
    reg writeEn ;
    reg [15:0] writeData;
    wire [15:0] readData1;
    wire  writeEn_out = writeEn;


    RegFile registrador_component (
        .dataIn(writeData),
        .dataOut(readData1),  
        .clock(clk),
        .writeEnable(writeEn)
        );

    defparam
        registrador_component.WIDTH = 16;



    always @(posedge clk or posedge reset) begin

            if (reset) 
                begin
                    State = Beg;
            end else begin
                    case (State)

                        Beg:
                            begin
                                State = State1;
                            end

                        State1:
                            begin
                                writeEn = 1 ; 
                                writeData = 10;
                                State = State2;
                            end

                        State2:
                            begin
                                writeEn = 0 ; 
                                State = State3;
                            end


                        State3:
                            begin
                                writeEn = 1;
                                writeData = readData1 + 10;
                                State = State4;
                            end

                        State4:
                            begin
                                writeEn = 0 ;
                                State = State5;
                            end

                        State5:
                            begin
                                writeEn = 1 ;
                                writeData = readData1 + 10;
                                State = State6;
                            end

                        State6:
                            begin
                                writeEn = 0 ;
                                State = State7;
                            end

                        State7:
                            begin
                                writeEn = 1 ;
                                writeData = readData1 + 10;
                                State = State8;
                            end

                        State8:
                            begin
                                writeEn = 0 ;
                                State = State9;
                            end




                    endcase
                end

        end

endmodule





//Example of a register file

module RegFile(clock, writeEnable, dataIn, dataOut);
    parameter WIDTH = 16;
    input clock, writeEnable;
    input [WIDTH-1 : 0] dataIn;
    output [WIDTH-1 : 0] dataOut;
    wire [WIDTH-1 : 0] dataOut;
    reg [WIDTH-1 : 0] wha;

    assign dataOut =  wha;

    always@( posedge clock)
        begin
            if (writeEnable)
                wha = dataIn;       
        end 
endmodule

我的疑问是,为什么我需要等待1个周期才能获得存储在RegFile中的值? 为什么我不能跳过State2呢?

1 个答案:

答案 0 :(得分:3)

事实上,您在上面编写的代码中有2个时钟周期的延迟。如果你模拟这个会很有帮助,你可以自己看一下,但我会描述它。

在第一个周期,WriteEnable变高。它需要1个完整的时钟周期才能对逻辑的其他部分有效。所以在第一个时钟周期完成后,WriteEnable将可用于其他地方。

在第二个周期,您的regFile模块可以“看到”WriteEnable之前变高的事实。然后它将dataIn放入wha信号,然后传递给dataOut。所以在第二个时钟周期完成后,dataOut将可用于其他地方。 (它在状态3的第三个时钟周期使用。)

这就是你需要进入状态2的原因。状态2允许RegFile注册输出数据所需的1个额外时钟周期。

时钟周期延迟是一个非常重要的理解概念,因此,当你还是刚开始掌握它的时候,这是一件好事。

有关更多信息,请参阅此教程,它解释了寄存器和时钟周期延迟,对您有用。 Clock Cycle Delays and Registered Logic