我是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呢?
答案 0 :(得分:3)
事实上,您在上面编写的代码中有2个时钟周期的延迟。如果你模拟这个会很有帮助,你可以自己看一下,但我会描述它。
在第一个周期,WriteEnable变高。它需要1个完整的时钟周期才能对逻辑的其他部分有效。所以在第一个时钟周期完成后,WriteEnable将可用于其他地方。
在第二个周期,您的regFile模块可以“看到”WriteEnable之前变高的事实。然后它将dataIn放入wha信号,然后传递给dataOut。所以在第二个时钟周期完成后,dataOut将可用于其他地方。 (它在状态3的第三个时钟周期使用。)
这就是你需要进入状态2的原因。状态2允许RegFile注册输出数据所需的1个额外时钟周期。
时钟周期延迟是一个非常重要的理解概念,因此,当你还是刚开始掌握它的时候,这是一件好事。
有关更多信息,请参阅此教程,它解释了寄存器和时钟周期延迟,对您有用。 Clock Cycle Delays and Registered Logic