首先新建一个单独的 dcfifo
工程。然后打开
IP
核配置界面,如图 1
所示,在搜索栏中搜索“fifo
(大小写均可)”就会显示和
FIFO
相关的所有
IP
核,这里我们仍选择 Installed Plug-Ins 目录下的
Memory Compiler
文件夹下的“
FIFO
”。器件选择我们使用的 CycloneIV E,语言选择
Verilog HDL
。然后就是选择
IP
核存放的路径,这里我们将 DCFIFO IP 核放在工程目录的
ipcore_dir
文件夹下。然后是给
IP
核命名,为了能够清晰表达 FIFO
的大小和位宽,这里我们将其命名为“
dcfifo_256x8to128x16
”,让人一看到名字就知道我们调用的 dcfifo
是输入
256
个深度
8
位宽、输出
128
个深度
16
位宽的。以上选择无误后点击“Next
”。
![](https://i-blog.csdnimg.cn/blog_migrate/c72122ae7dc32dab7eb950792f61860c.png)
图 1
下面我们开始进行 FIFO 参数的配置。我们需要先选则框 4 中的“No”将其设置为 DCFIFO 后才能够继续配置其他参数。其中:
框 1
为
FIFO
输入数据位宽的选择,可以根据实际需求设置大小,这里我们选择输入为 8bit
。
框 2
为
FIFO
输出数据位宽的选择,可以根据实际需求设置大小,这里我们选择输出为 16bit
。
框 3
为
FIFO
深度的选择,这里的深度是对
FIFO
输入数据来说的,即设置
FIFO
可以存储多少个 8
位宽的数据,这里最小为
4
个,且都是
2
的
n
次方个,我们选择
FIFO
的深度为 256
,既然输入数据的个数和位宽、输出数据的位宽都确定了,那么输出数据的个数也就相应的确定了,为 128
个。
如图 2
所示,配置完成后点击“
Next
”。
![](https://i-blog.csdnimg.cn/blog_migrate/5250f09840d706633fd4a79b28282a6d.png)
图 2
如图 3
所示,为
DCFIFO
的优化选择界面,其中:
Lowest latency but requires synchronized clocks(最低延迟,但需要同步时钟):该选项使用一个同步阶段,没有亚稳态保护,适用于同步时钟。面积最小,提供良好的性能。
Minimal setting for unsynchronized clocks(最小设置且为异步时钟):该选项使用两个同步阶段,具有良好的亚稳态保护。面积中等,提供良好的性能。
Best metastability protection, best fmax and unsynchronized clocks(提供最佳的亚稳性保 护,最佳的 fmax
且为异步时钟):该选项使用三个或更多的同步阶段,具有最好的亚稳态保护。它的面积是最大的,但给出了最好的性能。
在使用过程中如果工程对速度和稳定性要求较高,同时 FPGA
的资源也比较充分,那么建议选择第三个选项;如果工程资源相对紧张,可以选择使用第一个选项。这里我们选择性能和资源平衡的也是默认的第二个选项,直接点击“Next”。
![](https://i-blog.csdnimg.cn/blog_migrate/537114b70c2f463bbb574e2abcf476fb.png)
图 3
图 4
为
FIFO
输入输出管脚的选择界面,其中:
框 1
为
Read-side
为读端口的
full
、
empty
、
usedw
信号,同步于
rdclk
;
Write-side
为写端口的 full
、
empty
、
usedw
信号,同步于
wrclk
。我们都勾选上。
框 2
中的
Add an extra MSB to usedw ports
为设置将
rdusedw
和
wrusedw
数据位宽增加 1 位,用于保护
FIFO
在写满时不会翻转到
0
。
Asynchronous clear
为异步复位信号,用于清空 FIFO
。这里我们不勾选。
设置完成后点击“Next
”。
![](https://i-blog.csdnimg.cn/blog_migrate/1ee07fb28b57d6c03a3635aa9dea9d73.png)
图 4
图 5 为设置 FIFO
属性和使用资源的界面,其中:
框 1
中上面的是普通同步
FIFO
模式,当前读请求有效的下一拍数据才出来;而下面的则是先出数据 FIFO 模式,读请求来到之前第一个数据就已经先出来了,使得当前的请求有效时立刻输出数据,而不会像普通模式那样当前读请求有效后下一拍才会输出数据。后面我们会通过仿真会来对比两者的不同。这里我们选择默认的普通模式。
框 2
为指定实现
FIFO
使用的存储块类型和
FIFO
的存储深度,具体可选值与使用的 FPGA 芯片有关,默认为
Auto
,我们一般使用默认值就可以了。
设置完毕后点击“Next
”。
![](https://i-blog.csdnimg.cn/blog_migrate/02e826c7de43d695c88d1f822d6ee5b3.png)
图 5
图 6
为
FIFO
速度(性能)选择和是禁用保护电路,其中:
框 1
为选择是否禁止上溢检测和下溢检测的保护电路(上溢检测保护电路主要是用于在 FIFO
存储满时禁止继续写数据;下溢检测保护电路主要是用于
FIFO
被读空时,禁止继续读数据)。如果需要则保持默认,如果不需要可以选择禁用下面的两个选项来提高 FIFO 速度(性能),这里我们没有特殊需求所以保持默认即可。
框 2
为选项使用逻辑单元实现
FIFO
存储器。这里使用默认设置,即用存储块实现 FIFO。
设置完毕后点击“Next
”。
图 6
如图 7
所示,该界面没有什么要配置的参数,但显示了我们在仿真
DCFIFO IP
核时所需要的 Altera
仿真库,这里提示了我们单独使用第三方仿真工具时需要添加名为“altera_mf
”的库。这里保持默认,直接点击“
Next
”。
图 7
最后就能生成我们的实例化模板了。
下面是调用代码:
`timescale 1ns/1ns
module fifo
(
//如果端口信号较多,我们可以将端口信号进行分组
//把相关的信号放在一起,使代码更加清晰
//FIFO写端
input wire wrclk , //同步于FIFO写数据的时钟50MHz
input wire [7:0] pi_data , //输入顶层模块的数据,要写入到FIFO中
//的数据同步于wrclk时钟
input wire pi_flag , //输入数据有效标志信号,也作为FIFO的
//写请求信号,同步于wrclk时钟
//FIFO读端
input wire rdclk , //同步于FIFO读数据的时钟25MHz
input wire rdreq , //FIFO读请求信号,同步于rdclk时钟
//FIFO写端
output wire wrempty , //FIFO写端口空标志信号,高有效,
//同步于wrclk时钟
output wire wrfull , //FIFO写端口满标志信号,高有效,
//同步于wrclk时钟
output wire [7:0] wrusedw , //FIFO写端口中存在的数据个数,
//同步于wrclk时钟
//FIFO读端
output wire [15:0] po_data , //FIFO读出的数据,同步于rdclk时钟
output wire rdempty , //FIFO读端口空标志信号,高有效,
//同步于rdclk时钟
output wire rdfull , //FIFO读端口满标志信号,高有效,
//同步于rdclk时钟
output wire [6:0] rdusedw //FIFO读端口中存在的数据个数,
//同步于rdclk时钟
);
dcfifo_256x8to128x16 dcfifo_256x8to128x16_inst
(
.data (pi_data), //input [7:0] data
.rdclk (rdclk ), //input rdclk
.rdreq (rdreq ), //input rdreq
.wrclk (wrclk ), //input wrclk
.wrreq (pi_flag), //input wrreq
.q (po_data), //output [15:0] q
.rdempty(rdempty), //output rdempty
.rdfull (rdfull ), //output rdfull
.rdusedw(rdusedw), //output [6:0] rdusedw
.wrempty(wrempty), //output wrempty
.wrfull (wrfull ), //output wrfull
.wrusedw(wrusedw) //output [7:0] wrusedw
);
endmodule