我在verilog中实现了有效/准备好的握手信号。我只是想知道我的方法是对的还是有问题的。我很高兴知道有任何改进。一个简单的计数器用作fifo的输入。因此,当fifo几乎已满时,当使用fifo的单词为8时(16个中使用了8个fifo的堆栈),则声明为就绪为零。
这是代码。
module fifohandshake(
input CLK,
input RST,
input [31:0] INPUT,
output [31:0] OUTDATA,
output [3:0] usedword,
output Writereq,
input RDReq,
output Almost_full,
output EMPty,
output FUlL,
output VALID,
output READY
);
reg valid;
reg ready;
reg WRReq;
assign VALID=valid;
assign READY=ready;
assign Writereq=WRReq;
fifoip u0(
.clock(CLK),
.data(INPUT),
.rdreq(RDReq),
.sclr(RST),
.wrreq(WRReq),
.almost_full(Almost_full),
.empty(EMPty),
.full(FUlL),
.q(OUTDATA),
.usedw(usedword)
);
always @(posedge CLK)
begin
if(INPUT)
begin
valid<=1;
end
else
begin
valid<=0;
end
end
always @(posedge CLK)
begin
if(Almost_full)
begin
ready<=0;
end
else
begin
ready<=1;
end
end
always @(posedge CLK)
begin
if(ready)
begin
WRReq<=1;
end
else
begin
WRReq<=0;
end
end
endmodule
我是以正确的方式完成的,还是有什么我需要纠正的?这是波形结果。 enter image description here
对于那些认为我没有在我的研究中付出足够努力的人。有限状态机是实现就绪/有效握手协议的好方法。必须牢记几点
有效信号不依赖于就绪信号。换句话说,如果您将逻辑电路从有效信号跟踪到就绪信号,则不应该存在组合环路。
可以为有效/就绪协议定义三种基本状态。第一个偶像状态,即使从属设备已准备好接受数据,也没有有效数据。然后,准备和有效信号均为高的传输状态。第三种状态是等待状态,我们有效信号为高电平但就绪信号为低电平。
在从机未准备好的情况下,必须在等待状态中使用缓冲区(fifo或简单寄存器)来缓冲有效数据。因此,只要从站再次准备就绪,数据就不会丢失并仍在数据线上。
而已....
这是我试图向社区提出的帮助,但是在过去的几天里,每当我发布有人故意将我的问题标记为-1时。我希望下次不再体验它......