数据FIFO的读写和信息FIFO的基本使用方法

数据FIFO
一、写使能-wr_en,写数据-wdata

//din :8bit
assign      wr_en = din_vld ;//din_vld 为数据有效指示信号
assign      wdata = {din_sop,din_eop,din};//如果是包文形式,可以将sop和eop写入数据FIFO的数据中,可以保证起始和结束条件与数据始终同步

注意:此刻的写使能和写数据均为组合逻辑,如果其中一个使用了时序逻辑,那么基于同步的原则,另一个也必须进行同步处理

always @(posedge clk or negedge rst_n)begin
  if(rst_n==0)begin
       wr_en <= 0;
  end
  else begin
       wr_en <= din_vld;
  end
end

always @(posedge clk or negedge rst_n)begin
  if(rst_n==0)begin
       wdata <= 0;
  end
  else begin
       wdata <= {din_sop,din_eop,din};
  end
end

二、读使能-rd_en,输出的数据-q[7:0]

assign   rd_en = empty == 0;//数据FIFO不为空
//优先使用Show-ahead模式

三、读数据部分(包括din_sop和din_eop)

//dout
always@(posedge clk or negedge rst_n)begin
    if(rst_n == 0)begin
       dout <= 0;
    end
    else begin
      dout <= q[7:0];
    end
end 
assign    dout_sop_tmp  = q[9] && rd_en;
assign    dout_eop_tmp = q[8] && rd_en;
//dout_sop
always@(posedge clk or negedge rst_n)begin
    if(rst_n == 0)begin
       dout_sop <= 0;
    end
    else begin
      dout_sop <= dout_sop_tmp;
    end
end
//dout_eop
always@(posedge clk or negedge rst_n)begin
    if(rst_n == 0)begin
       dout_sop <= 0;
    end
    else begin
      dout_sop <= dout_eop_tmp;
    end
end

always @(posedge clk or negedge rst_n)begin
   if(rst_n == 0)begin
      dout_vld <= 0;
   end
   else begin
     dout_vld <= rd_en;
   end
end

信息FIFO
不需要很大的存储空间,但是可以很方便的告诉数据FIFO什么时候读。例:要求收到eop时输出报文,假如第一个报文长度为200字节,而第二个报文长度小于200字节,若设置读使能为 rd_en = empty == 0 && din_eop;
那么在第一个报文没有输出完时就收到了第二个报文的eop,这时根据rd_en的逻辑该输出下一个报文,但是显然第一个报文并未输出完,就会造成数据的缺失。
根据FIFO的读写隔离原则,使用信息FIFO。
一、写使能和写数据

assign     msg_wr_en       =  din_eop ; //输入一个完整的报文,此处条件可以根据不同需求进行更改
assign     msg_wr_wdata =  1 ;//因为此处只是起到一个标识作用,故存储什么都可以,如果有需要存储的,比如报文的长度可以存入信息FIFO

二、读使能

assign   msg_rd_en  =  msg_empty == 0;//信息FIFO不为空,表明数据FIFO中已经有至少一个完整的报文
  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FIFO(First-In-First-Out)是一种常用的数据结构,用于在数据流中存储和传输数据。它可以在不同的场景中使用,并且使用方法也有所不同。 FIFO使用场景包括但不限于以下几个方面: 1. 数据缓存:FIFO可以用作数据缓存,用于临时存储数据,以便后续处理。在这种情况下,大的FIFO可以使用内部BLOCK RAM资源,而小的FIFO可以使用寄存器资源进行实现\[2\]。 2. 数据传输:FIFO可以用于数据的传输和交换。例如,在通信系统中,FIFO可以用于存储接收到的数据,然后按照一定的顺序进行处理和传输。 3. 数据流控制:FIFO可以用于控制数据流的速率。通过调整FIFO读写速度,可以实现数据的流量控制,以避免数据丢失或溢出。 FIFO使用方法取决于具体的应用场景和需求: 1. 宽度选择:FIFO的宽度是指一次读写操作的数据位数。在单片成品IC中,FIFO的宽度是固定的,但在使用FPGA自己实现FIFO时,宽度可以自己定义\[1\]。 2. 同步与异步:FIFO可以分为同步FIFO和异步FIFO。同步FIFO读写操作使用相同的时钟,而异步FIFO读写操作使用不同的时钟。选择同步FIFO还是异步FIFO取决于具体的设计需求和时钟域的要求\[2\]。 3. 存储和读取:数据可以通过入操作存储到FIFO中,然后通过读取操作从FIFO中读取出来。在设计中,可以根据需要选择合适的存储和读取策略,例如使用大的FIFO作为主缓存,而小的FIFO用于入和读取的控制\[3\]。 总之,FIFO是一种常用的数据结构,可以在不同的场景中使用使用FIFO时,需要根据具体的应用需求选择合适的宽度、同步方式和存储读取策略。 #### 引用[.reference_title] - *1* *2* *3* [fifoFPGA中的应用小结](https://blog.csdn.net/doghan11/article/details/69263945)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值