同步fifo设计

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

仿真波形

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

借问众神明.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值