FPGA 之 DCFIFO IP 核的配置

        首先新建一个单独的 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 ”。

图 1

         下面我们开始进行 FIFO 参数的配置。我们需要先选则框 4 中的“No”将其设置为 DCFIFO 后才能够继续配置其他参数。其中:

        框 1 FIFO 输入数据位宽的选择,可以根据实际需求设置大小,这里我们选择输入为 8bit
        框 2 FIFO 输出数据位宽的选择,可以根据实际需求设置大小,这里我们选择输出为 16bit
        框 3 FIFO 深度的选择,这里的深度是对 FIFO 输入数据来说的,即设置 FIFO 可以存储多少个 8 位宽的数据,这里最小为 4 个,且都是 2 n 次方个,我们选择 FIFO 的深度为 256 ,既然输入数据的个数和位宽、输出数据的位宽都确定了,那么输出数据的个数也就相应的确定了,为 128 个。
        如图 2  所示,配置完成后点击“ Next ”。

图 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”。

图 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 ”。
图 4
        图 5 为设置 FIFO 属性和使用资源的界面,其中:
        框 1 中上面的是普通同步 FIFO 模式,当前读请求有效的下一拍数据才出来;而下面的则是先出数据 FIFO 模式,读请求来到之前第一个数据就已经先出来了,使得当前的请求有效时立刻输出数据,而不会像普通模式那样当前读请求有效后下一拍才会输出数据。后面我们会通过仿真会来对比两者的不同。这里我们选择默认的普通模式。
        框 2 为指定实现 FIFO 使用的存储块类型和 FIFO 的存储深度,具体可选值与使用的 FPGA 芯片有关,默认为 Auto ,我们一般使用默认值就可以了。
        设置完毕后点击“Next ”。

图 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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在异步FIFO IP的调用中,首先需要进行FIFO IP的参数配置。然后,编写顶层模块的FIFO调用代码。这个代码示例如下: module fifo ( input wire sys_clk, input wire sys_clk2, input wire [7:0 pi_data, input wire rd_req, input wire wr_req, output wire empty, output wire full, output wire [7:0 po_data, output wire [7:0 usedw ); dcfifo_8x256 dcfifo_8x256_inst ( .clock1 (sys_clk), .clock2 (sys_clk2), .data (pi_data), .rdreq (rd_req), .wrreq (wr_req), .empty (empty), .full (full), .q (po_data), .usedw (usedw) ); endmodule 在这个顶层模块的FIFO调用代码中,我们使用了异步FIFO IP,其中包括两个时钟信号:sys_clk和sys_clk2。同时,还有输入信号,如写请求信号(wr_req)、读请求信号(rd_req)和输入数据信号(pi_data),以及输出信号,如空状态信号(empty)、满状态信号(full)、输出数据信号(po_data)和已使用字节信号(usedw)。通过这个FIFO调用代码,可以实现对异步FIFO IP的调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [FIFO IP 的调用](https://blog.csdn.net/ziyouruf/article/details/123862569)[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^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [FPGAFIFO IP配置与调用](https://blog.csdn.net/m0_72885897/article/details/128649678)[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^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值