0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FIFO IP核的使用教程

FPGA設(shè)計(jì)論壇 ? 來源:CSDN技術(shù)社區(qū)LuBake ? 2025-01-03 09:36 ? 次閱讀

引言

在數(shù)字設(shè)計(jì)中,利用FIFO進(jìn)行數(shù)據(jù)處理是非常普遍的應(yīng)用,例如,實(shí)現(xiàn)時(shí)鐘域交叉、低延時(shí)存儲(chǔ)器緩存、總線位寬調(diào)整等。下圖給出了FIFO生成器支持的一種可能配置。

b6ad08ce-c8ce-11ef-9310-92fbcf53809c.png

設(shè)計(jì)中有兩個(gè)獨(dú)立的時(shí)鐘域并且讀數(shù)據(jù)總線的位寬是寫數(shù)據(jù)總線位寬的2倍。使用FIFO生成器可以快速實(shí)現(xiàn)這種配置,從而在Xilinx FPGA芯片上實(shí)現(xiàn)特定的設(shè)計(jì)要求。

實(shí)際應(yīng)用案例:本案例背景是將信號(hào)處理系統(tǒng)中ADC采集到的數(shù)據(jù)寫入FPGA芯片外掛的DDR3,完成采樣數(shù)據(jù)的存儲(chǔ)。ADC采樣率設(shè)定為96Mhz,兩個(gè)采樣點(diǎn)(兩個(gè)16bit數(shù)據(jù)拼接成一個(gè)32bit)為單位,DDR讀寫時(shí)鐘速率為150Mhz,總線數(shù)據(jù)位寬64bit,二者時(shí)鐘域、位寬均不同,故需在中間加入一級(jí)FIFO,從而實(shí)現(xiàn)時(shí)鐘域的交叉以及總線位寬的調(diào)整。

下面將從FIFO IP核的創(chuàng)建,模塊程序編寫,功能仿真驗(yàn)證等三個(gè)方面完成本案例的介紹:

1)FIFO IP核的創(chuàng)建:打開Vivado軟件(本例程基于Vivado 2018.3版本)IP catalog一欄,輸入FIFO,雙擊進(jìn)入如下界面,第一個(gè)Basic選項(xiàng)卡主要是設(shè)置FIFO接口類型,可設(shè)置為正常的Native模式或AXI總線接口,一般我們選擇Native即可。然后選擇FIFO實(shí)現(xiàn)的類型:讀寫使用獨(dú)立時(shí)鐘還是同一時(shí)鐘,實(shí)現(xiàn)時(shí)使用分布式RAM、Block RAM還是專用的FIFO等等,這里我們選擇Independent Clocks Block RAM,即獨(dú)立時(shí)鐘塊RAM的FIFO。

b6b44080-c8ce-11ef-9310-92fbcf53809c.png

切換至第二個(gè)Native Ports選項(xiàng)卡,這個(gè)界面主要是設(shè)置讀寫數(shù)據(jù)位寬、深度以及一些端口的使能、端口復(fù)位值等的設(shè)置。結(jié)合本案例的應(yīng)用,設(shè)置寫位寬為32bit,深度設(shè)置為1024,讀位寬設(shè)置為64bit。使能復(fù)位管腳,設(shè)置滿信號(hào)(Full Flags)的復(fù)位值為0,讀數(shù)據(jù)(Dout)復(fù)位值為0。

b6cd359a-c8ce-11ef-9310-92fbcf53809c.png

然后切換至第三個(gè)Status Flags選項(xiàng)卡,本選項(xiàng)卡是設(shè)置其余一些可選的標(biāo)志信號(hào),本案例需使用本界面下的Programmable Flags,即可編程的標(biāo)志信號(hào),設(shè)置滿標(biāo)志門限置位值(Full Threshold Assert Value),可使FIFO寫入的數(shù)據(jù)總數(shù)大于等于該值后將prog_full(可編程滿標(biāo)志信號(hào))拉高,相比full信號(hào)使用起來更靈活。DDR讀寫采用Burst方式(突發(fā)傳輸),一次連續(xù)寫入256個(gè)數(shù),這里設(shè)置Full Threshold Assert Value為512(256*2,2是FIFO讀寫位寬的比值),當(dāng)FIFO寫入512個(gè)數(shù)后,prog_full拉高,進(jìn)行FIFO讀操作,一次連續(xù)讀256個(gè)64bit的數(shù)(對(duì)應(yīng)寫的512個(gè)32bit數(shù))存入DDR。

b6e399f2-c8ce-11ef-9310-92fbcf53809c.png

切換至第四個(gè)Data Counts選項(xiàng)卡,本選項(xiàng)卡主要是選擇是否使用讀寫數(shù)據(jù)計(jì)數(shù),本案例不使用計(jì)數(shù),此頁面保持默認(rèn)設(shè)置。

b6f7db1a-c8ce-11ef-9310-92fbcf53809c.png

最后Summary選項(xiàng)卡是FIFO設(shè)置后的各項(xiàng)信息,可核對(duì)FIFO設(shè)置是否正確及設(shè)計(jì)是否滿足要求。

b714d850-c8ce-11ef-9310-92fbcf53809c.png

2)模塊程序的編寫

頂層模塊:FIFO_test.v

module FIFO_test(

input rst,

input wr_clk,

input rd_clk,

input [31:0] din,

input wr_en,

input rd_en,

output [63:0] dout,

output full,

output empty,

output prog_full,

output wr_rst_busy,

output rd_rst_busy

);

fifo_generator_0 U_fifo (

.rst(rst), // input wire rst

.wr_clk(wr_clk), // input wire wr_clk

.rd_clk(rd_clk), // input wire rd_clk

.din(din), // input wire [31 : 0] din

.wr_en(wr_en), // input wire wr_en

.rd_en(rd_en), // input wire rd_en

.dout(dout), // output wire [63 : 0] dout

.full(full), // output wire full

.empty(empty), // output wire empty

.prog_full(prog_full), // output wire prog_full

.wr_rst_busy(wr_rst_busy), // output wire wr_rst_busy

.rd_rst_busy(rd_rst_busy) // output wire rd_rst_busy

);

endmodule

TestBench模塊:FIFO_sim

module FIFO_sim;

reg rst;

reg wr_clk;

reg rd_clk;

reg [31:0] din;

reg wr_en;

reg rd_en;

wire [63:0] dout;

wire full;

wire empty;

wire prog_full;

wire wr_rst_busy;

wire rd_rst_busy;

initial begin

rst = 1;

wr_clk = 0;

wr_en = 0;

rd_clk = 0;

rd_en = 0;

din = 0;

#1000

rst = 0;

end

always #10.4167 wr_clk = ~wr_clk;

always #3.3333 rd_clk = ~rd_clk;

always @(posedge wr_clk) begin

if(!wr_rst_busy && !rst) begin

wr_en <= 1'b1;

din <= din + 1'b1;

end

end

reg [1:0] RD_state = 2'b01;

reg [15:0] rd_count = 'd0;

always @(posedge rd_clk) begin

case(RD_state)

2'b01: begin

if(!rd_rst_busy && prog_full) RD_state <= 2'b10;

end

2'b10: begin

if(rd_count >= 'd256) begin

RD_state <= 2'b01;

rd_count <= 'd0;

rd_en <= 1'b0;

end

else begin

rd_count <= rd_count + 1'b1;

rd_en <= 1'b1;??

end

end

default: begin

RD_state <= 2'b01;

end

endcase

end

FIFO_test U_FIFO_test(

.rst(rst),

.wr_clk(wr_clk),

.rd_clk(rd_clk),

.din(din),

.wr_en(wr_en),

.rd_en(rd_en),

.dout(dout),

.full(full),

.empty(empty),

.prog_full(prog_full),

.wr_rst_busy(wr_rst_busy),

.rd_rst_busy(rd_rst_busy)

);

endmodule

編寫TestBench時(shí),寫時(shí)鐘為48Mhz,讀時(shí)鐘為150MHz。寫是連續(xù)的,使能一直打開,表示AD是一直連續(xù)工作的,寫入夠512個(gè)數(shù)后,prog_full拉高,進(jìn)行一次FIFO讀操作,連續(xù)讀出256個(gè)數(shù),然后等待下一次prog_full為高的到來,如此周而復(fù)始。

3)波形功能仿真

點(diǎn)擊Run simulation,啟動(dòng)功能仿真,可以看到FIFO一開始復(fù)位結(jié)束后,進(jìn)行寫操作,每寫夠512個(gè)數(shù)后,prog_full拉高,進(jìn)行一次讀操作,連續(xù)讀出256個(gè)數(shù)后,停止讀操作,等待下一次prog_full拉高時(shí)刻的到來。將讀出的數(shù)據(jù)和寫入的數(shù)據(jù)對(duì)比,完全一致,不存在丟數(shù)的情況,因此驗(yàn)證了功能的正確性。

b72f02a2-c8ce-11ef-9310-92fbcf53809c.png

總結(jié):通過本案例代碼程序的編寫以及波形功能仿真,可以熟悉并掌握FIFO的基本功能和常用用法:數(shù)據(jù)跨時(shí)鐘域及總線位寬調(diào)整。本例程是我自己在一個(gè)項(xiàng)目中用到的,結(jié)合自己的需求進(jìn)行編寫的,并不具有普適性,寫此博客的初衷也是讓一些不熟悉FIFO用法的讀者能快速入門,可能并不能直接幫助到所有的讀者。希望大家可以在此基礎(chǔ)上,結(jié)合自己的工程應(yīng)用實(shí)例,完成自己相應(yīng)的設(shè)計(jì)。

原文鏈接:https://blog.csdn.net/qq_43622265/article/details/113497121

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21782

    瀏覽量

    604982
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    389

    瀏覽量

    43799
  • IP核
    +關(guān)注

    關(guān)注

    4

    文章

    331

    瀏覽量

    49573
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    319

    瀏覽量

    21073

原文標(biāo)題:FIFO IP核的使用

文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    #FPGA點(diǎn)撥 生成FIFOIP

    fpgaIP
    電子技術(shù)那些事兒
    發(fā)布于 :2022年10月12日 21:52:56

    #硬聲創(chuàng)作季 #FPGA FPGA-27-04 Quartus中fifo IP介紹與仿真測試-1

    fpgafifoIP
    水管工
    發(fā)布于 :2022年10月29日 02:28:30

    #硬聲創(chuàng)作季 #FPGA FPGA-27-04 Quartus中fifo IP介紹與仿真測試-2

    fpgafifoIP
    水管工
    發(fā)布于 :2022年10月29日 02:28:50

    #硬聲創(chuàng)作季 #FPGA FPGA-27-04 Quartus中fifo IP介紹與仿真測試-3

    fpgafifoIP
    水管工
    發(fā)布于 :2022年10月29日 02:29:13

    #硬聲創(chuàng)作季 #FPGA FPGA-27-04 Quartus中fifo IP介紹與仿真測試-4

    fpgafifoIP
    水管工
    發(fā)布于 :2022年10月29日 02:29:34

    求助:用fifo ip作延時(shí)輸出數(shù)據(jù)

    同上,如何用fifo ip作延時(shí)輸出數(shù)據(jù),想輸入一組數(shù)據(jù),大概300個(gè),clk上升沿輸出一個(gè),想延遲128個(gè)數(shù)據(jù)輸出的時(shí)間后,將這一組數(shù)據(jù)通過fifo輸出,求大神指點(diǎn)代碼該怎么寫,大
    發(fā)表于 04-26 11:37

    求助 FPGA 異步FIFO IP

    各位大神: 異步FIFO的空 滿信號(hào)為什么都是高?描述如下:always @(posedge DFIFO_clk or negedge rst_n )beginif(!rst_n)beginWRITE_req
    發(fā)表于 07-01 01:51

    ISE中,調(diào)用FIFO IP遇到的問題?

    fifo IP fifo_uart fifo_uut(.clk(clk), // input clk.rst(rst_n), // inp
    發(fā)表于 09-14 11:36

    XILINX FIFO IP調(diào)用問題

    工程利用ISE自帶的FIFO將32位的并行數(shù)據(jù)經(jīng)過緩存以單bit輸出,讀寫時(shí)鐘相同,首先將32位數(shù)據(jù)經(jīng)過FIFO1變成8位輸出,再將8位數(shù)據(jù)經(jīng)過FIFO2變成1位輸出,對(duì)程序仿真結(jié)果
    發(fā)表于 12-23 12:53

    以MIPI項(xiàng)目為例講解Diamond FIFO生成和例化全過程

    在MIPI多路攝像頭拼接項(xiàng)目中,需要使用到FIFOIP來進(jìn)行數(shù)據(jù)的緩存與時(shí)鐘域的交互,下面我來介紹一下Diamond FIFO IP
    發(fā)表于 12-12 15:54

    FIFO IP的使用

    一、原理介紹FIFO即First in, First out。代表著先進(jìn)的數(shù)據(jù)先出,后進(jìn)的數(shù)據(jù)后出。FIFO實(shí)在RAM的基礎(chǔ)上增加了許多功能,主要分為讀和寫兩部分。與RAM最大的不同時(shí),FIFO沒有
    發(fā)表于 04-12 22:44

    FIFO是什么?有什么用?FIFO IP應(yīng)該如何使用?

    FIFO是英文First In First Out 的縮寫,是一種先進(jìn)先出的數(shù)據(jù)緩存器,他與普通存儲(chǔ)器的區(qū)別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點(diǎn)就是只能順序?qū)懭霐?shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫指針自動(dòng)加1完成,不能像普通存儲(chǔ)器那樣可以由地址線決定讀取或?qū)懭肽硞€(gè)指定的地址。
    發(fā)表于 07-20 08:00 ?22次下載
    <b class='flag-5'>FIFO</b>是什么?有什么用?<b class='flag-5'>FIFO</b> <b class='flag-5'>IP</b><b class='flag-5'>核</b>應(yīng)該如何使用?

    講解幾點(diǎn)關(guān)于FIFO IP使用時(shí)的注意事項(xiàng)

    FIFO?還是FIFO IP?這也需要寫總結(jié)嗎?太容易了吧。如果我是一個(gè)正在處于面試找工作中的年輕人,肯定關(guān)注的是如何手撕FIFO,這也是
    發(fā)表于 06-21 14:22 ?1619次閱讀
    講解幾點(diǎn)關(guān)于<b class='flag-5'>FIFO</b> <b class='flag-5'>IP</b><b class='flag-5'>核</b>使用時(shí)的注意事項(xiàng)

    如何在Vivado中配置FIFO IP

    Vivado IP提供了強(qiáng)大的FIFO生成器,可以通過圖形化配置快速生成FIFO IP。
    的頭像 發(fā)表于 08-07 15:36 ?4516次閱讀
    如何在Vivado中配置<b class='flag-5'>FIFO</b> <b class='flag-5'>IP</b><b class='flag-5'>核</b>

    FPGA學(xué)習(xí)筆記:FIFO IP的使用方法

    FIFO(First In First Out, 先入先出 ),是一種數(shù)據(jù)緩沖器,用來實(shí)現(xiàn)數(shù)據(jù)先入先出的讀寫方式。數(shù)據(jù)按順序?qū)懭?FIFO,先被寫入的數(shù)據(jù)同樣在讀取的時(shí)候先被讀出,所以 FIFO存儲(chǔ)器沒有地址線,有一個(gè)寫端口和一
    的頭像 發(fā)表于 09-07 18:30 ?3831次閱讀
    FPGA學(xué)習(xí)筆記:<b class='flag-5'>FIFO</b> <b class='flag-5'>IP</b><b class='flag-5'>核</b>的使用方法