1.先入先出(First In First Out ,FIFO)
(1)根据下图讲解FIFO涉及的各引脚
①根据使用的资源类型不同,FIFO可分为两类,一种是使用BRAM(Block RAM)的FIFO,另一种是使用DRAM(Distribute RAM)的FIFO。
其中BRAM支持FIFO读写位宽不相同(最常用);
而DRAM读写位宽必须相同。
②如图所示,FIFO大体可分为”写模块(Write Clock Domain)“与”读模块(Read Clock Domain)“两部分
③具体引脚定义如下:
- rst::总复位;
- wr_rst:写复位;
- rd_rst:读复位;
- wr_en:写使能;
- full:写满信号,FIFO被写满时拉高;
- almost_full:即将写满信号,在写满之前的一个时钟拉高;
- Prog_full:可编程的写满信号,即给定一个值,在写数据达到给定值时,该标志拉高;
- din[n:0]:自定义位宽为n的写入数据;
- wr_ack:写反馈,对于每个时钟的数据写入,成功后均提供一次反馈值(信号拉高)
- overflow:写溢出,这个信号用来指示在前一个时钟周期的写请求(wr_en)被拒绝,因为FIFO已经满了;
- wr_data_count:这个值表明FIFO中已经写入的数据的数目,该信号在写入数据时被触发(在FIFO同步时钟与位宽相同的情况下,该值与rd_data_count的值相等,——注意理解这句话);
- prog_full_thresh_assert:动态调整prog_full的值;(暂时不太理解具体使用场景)
- prog_full_thresh_negate:门限值失效;
- prog_full_thresh:用来设定prog_full的有效时的数据数目,和无效时的数据数目;
- injectsbiterr:注入单bit错误,略,基本用不上;
- injectdbiterr:注入双bit错误,略,基本用不上;
- rd_en:读使能;
- empty:读空信号,FIFO可读数据为0时拉高;
- almost_empty:即将读空信号,在FIFO被读空之前的一个时钟拉高;
- Prog_empty:可编程的读空信号,即给定一个值,在可读数据大于给定值时,该信号拉高;
- dout[n:0]:自定义位宽为n的读出数据
- valid:数据有效标志,表示FIFO读出的信号是否有效,有效则拉高;
- underflow:表明前一次读操作被拒绝了,因为FIFO已经空了;
- rd_data_count:这个值表明FIFO中可以读取的数据的数目,在读操作的时候,通过对这个数据进 行判断,可以保证当FIFO中没有数据的时候,停止读操作。当发生一次读操作时,会在下一个时钟的上升沿对rd_data_count进行改变。即写入一个数据的时候rd_data_count+1,当读出一个数据的时候,rd_data_count-1;
- prog_empty_thresh_assert:动态调整prog_empty的值;
- prog_empty_thresh_negate:门限值失效;
- prog_empty_thresh:用来设定prog_empty的有效时的数据数目,和无效时的数据数目;
- sbiterr:配合injectsbiterr使用,略,基本用不上;
- dbitter:配合injectdbiterr使用,略,基本用不上。