FPGA中同步FIFO的使用小结

更新时间:2024-01-31 12:12:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

FPGA中同步FIFO的使用小结

FPGA中的FIFO,分为同步FIFO,异步FIFO和双向FIFO。同步FIFO一般用于数据的缓存,异步FIFO一般用于跨时钟域的同步上。在这里只讨论同步FIFO的使用。 由于课题中要用FPGA做图像处理,生成3*3的模板。首先我们来分析图像数据的传输方式,线阵CCD1209D为2048个有效像元,经AD采样,每行有2048个图像数据,以串行数据流的形式来传输的,一个时钟周期传输一个像素数据。图像在交由算法模块处理之前要将得到的串行数据变成并行数据,3*3模板就是一个串并转换模块,串行数据经过此模块后变为并行输出。在图像处理算法中的实现过程若选用3*3模板,该滑动窗在某一个时刻读取图像的某个像素和其相邻像素,经过相关的处理后,用处理结果取代模板中间位置的像素值并传送到下一个模块。之后,每校正完一个像素,模板将不断右移或换行,直到将一幅灰度图像的数据阵列中的所有像素全部处理完。为了使窗中的3行3列共9个像素能够在一个时刻同时输出,便于之后的图像处理算法模块进行流水线处理,在3*3模板的硬件设计中,将采用两个FIFO存储器linebuffer1和linebuffer2。其中FIFO地址宽度为图像宽度,这样每个FIFO正好可以存储一行图像数据。模板生成模块的设计框图如下图所示:

这里我们要用到FPGA中的同步FIFO去做linebuffer。选用Verilog HDL语言。

下面介绍使用Quartus II 9.0中的宏模块生成FIFO的过程: 第一步,选megafunctions -> lmp_fifo –> storage ->

然后点OK,

接着,选Verilog语言,点下一步

注意:在这里设置,FIFO的数据位,FIFO的深度以及同步时钟。

接着下一步,

在此处可选择设置如果你前面选择了同步FIFO,那么这一步你需要设置FIFO的握手信号与状态信号有full(满),empty(空),almostfull(几乎满),almostempty(几乎空),Asynchronous clear(异步清零),如果你选择了异步FIFO,那么在读与写两边就要单独设置,读写两边均有 full, empty, usedwide(使用深度)3个信号。

接着点下一步:

一个是FIFO的输出的两种形式,一种是传统的同步方式,即你在有readreq='1'的一个周期后才能读取数取,另一种为show ahead,即为你在readreq='0'时,数据口就一直有一个数据,在读取数据时不用等待一个周期。第二个设置就是综合出FIFO是用一般逻辑单元,还是使用专用的M4K块(当然这需要在该器件有M4K块才可以)。

接着,一直下一步,直到完成,就生成如下所示的一个同步FIFO。

这样的话,主要问题就是读写使能的产生,很关键!!!

图中的L_VA是CCD的行数据标志,为读使能; 写使能是这样的assign rdreq = L_VA && (usedw>2047);

注意:尽量不要使FIFO满,那样很难控制FIFO读写,容易丢数据,如果FPGA存储器允许,FIFO使用4096字节的深度。 最后,希望大家多多实验,不断摸索,不断前进~~~

本文来源:https://www.bwwdw.com/article/0eiw.html

Top