FIFO介绍:
FIFO表示先进先出的意思。是基于RAM的存储模块,一般多是用于缓冲数据。以代码中声明端口为例,对于一个FIFO来讲,通常具有时钟信号clk,复位信号rst,读写命令, 数据写入和数据读出。
当写信号write_to_fifo拉高时且此时fifo未写满,fifo应该继续写入数据 data_in,当读信号read_from_fifo拉高且此时fifo不为空时,从fifo中读出数据data_out,write_to_fifo必须拉高数据才能写入,一旦FIFO写满,那么就会输出一个写满信号full;read必须拉高,数据才能被读出,一旦FIFO读空,就会拉高一个空信号empty。
判断空满
对于fifo来说,最重要的是如何去判断空满标志。
当fifo为空时,读写指针指向同一个地址
write_point表示下一个将要去写的地址,比如现在还没开始,它就会一直停在00的位置等待
read_fifo表示下一个去读的地址
所以可以看出,当读写指针地址指向同一个地址时,fifo为空。那么如何判断fifo写满呢?这里我们给指针多赋值一位,当写指针写完一轮时,会回到第一个位置,此时最高位加1,所以当写指针的最高位和读指针的最高位不相等,后面的位的值相等时,此时fifo为满状态。
代码
下面给出设计代码,以深度为8的8位fifo为例:
module sync_fifo (clk, rst, read_from_fifo, write_to_fifo, data_in, data_out);
input clk, rst;
input write_to_fifo, read_from_fifo;//write and read signal
input data_in;
output data_out;
reg [7:0] data_in;
reg [7:0] data_out;
reg [3:0] write_p;//write point
reg [3:0] read_p;
reg [7:0]ram[7:0];//deep 8, bit 8 register
wire full, empty;
//full of empty?
assign full = ((write_p[3] ^ read_p[3]) && (write_p[2:0] == read_p[2:0]));
assign empty = (write_p[3:0] == read_p[3:0]);
//write
always @(posedge clk or negedge rst) begin
if (!rst)
write_p <= 4'b0;
else if (write_to_fifo && !full) begin
ram[write_p[3:0]] <= data_in;
write_p <= write_p + 1;
end
end
//read
always @(posedge clk or negedge rst) begin
if (!rst)
read_p <= 4'b0;
else if (read_from_fifo && !empty) begin
data_out <= ram[read_p[3:0]];
read_p <= read_p +1;
end
end
endmodule