好久木有更新了...囧...
其实一直是在看建模那本书,学完了基础后面看的也比较快了,说实话建模应该是基础,后期的时序因该更认真的看。
下面记录一下FIFO这个神奇而有用的玩意儿。
FIFO可以看作是一个缓冲区域,亦可以称作双口RAM,FIFO就是First input First output的意思。我们把所有的信息缓存到FIFO里,每当下一层的模块完成内部工作以后,可以直接从FIFO里读取信息,用不着缠着上一个模块,等待反馈给予命令然后下达新的操作指令。
(1)首先上一层模块往FIFO里写入大量的操作信息,然后上一层模块可以执行其他的操作,而不必在乎“反馈信息”
(2)当FIFO里存在信息,控制模块会从FIFO里读取信息,信息被过滤后,会转换成命令,故启动模块开始工作。
(3)功能模块会很快工作,在工作完成后会反馈信息给控制模块——我完成了。
(4)当控制模块接受到功能模块的反馈信息后,会从FIFO里读取信息,重复上述工作,直到FIFO里的信息全部读取完毕。
下面以SOS码为例:
beep_control.v
module beep_control(input clk,input rstn,input [7:0]FIFO_Read_Data,
input Empty_Sig,output Read_Req_Sig,input Function_Done_Sig,output [1:0]Function_Start_Sig);
reg [3:0]i;
reg [1:0]rCmd;
reg isRead;
reg [1:0]isStart; //[1]S; [0]O
always @ (posedge clk or negedge rstn)
if(!rstn) begin
i <= 4'd0;
rCmd <= 2'd0;
isRead <= 1'b0;
isStart <= 2'b0;
end
else
case(i)
4'd0:
if(!Empty_Sig)i <= i + 4'd1;
4'd1:
begin isRead <= 1'b1;i <= i + 1'b1 end;
4'd2:
begin isRead <= 1'b0;i <= i + 1'd1 end;
4'd3:
begin if(FIFO_Read_Data == 8'h1B) rCmd <= 2'b10;
else if(FIFO_Read_Data == 8'h44) rCmd <= 2'b01;
else rCmd <= 2'b00;
end
i <= i + 4'b1;
4'd4:
if(rCmd == 2'b00) i<=4'b0;
else i <= i + 4b'1;
4'd5:
if(Function_Done_Sig)begin rCmd <= 2'b00;isStart <= 2'b00;i <= 4'b0;end
else isStart <= rCmd;
endcase
assign Read_Seq_Sig=isRead;
assign Function_Start_Sig=isStart;
endmodule
这是一个FIFO读的实例操作。通过isRead=Read_Seq_Sig命令FIFO_module.v来对FIFO模块进行读操作,脱离了控制模块,不必再等着控制模块给命令。
是一个很有用的模型。