91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

利用XILINX提供的FIFO IP進行讀寫測試

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2022-02-08 17:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者: ALINX

適用于板卡型號:
AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG

實驗Vivado工程為“fifo_test”。

FIFO是FPGA應用當中非常重要的模塊,廣泛用于數(shù)據(jù)的緩存,跨時鐘域數(shù)據(jù)處理等。學好FIFO是FPGA的關鍵,靈活運用好FIFO是一個FPGA工程師必備的技能。本章主要介紹利用XILINX提供的FIFO IP進行讀寫測試。

1.實驗原理

FIFO: First in, First out代表先進的數(shù)據(jù)先出,后進的數(shù)據(jù)后出。Xilinx在VIVADO里為我們已經(jīng)提供了FIFO的IP核, 我們只需通過IP核例化一個FIFO,根據(jù)FIFO的讀寫時序來寫入和讀取FIFO中存儲的數(shù)據(jù)。

其實FIFO是也是在RAM的基礎上增加了許多功能,F(xiàn)IFO的典型結(jié)構如下,主要分為讀和寫兩部分,另外就是狀態(tài)信號,空和滿信號,同時還有數(shù)據(jù)的數(shù)量狀態(tài)信號,與RAM最大的不同是FIFO沒有地址線,不能進行隨機地址讀取數(shù)據(jù),什么是隨機讀取數(shù)據(jù)呢,也就是可以任意讀取某個地址的數(shù)據(jù)。而FIFO則不同,不能進行隨機讀取,這樣的好處是不用頻繁地控制地址線。

o4YBAGAJi7qAAp71AABTmac2MoU816.jpg

雖然用戶看不到地址線,但是在FIFO內(nèi)部還是有地址的操作的,用來控制RAM的讀寫接口。其地址在讀寫操作時如下圖所示,其中深度值也就是一個FIFO里最大可以存放多少個數(shù)據(jù)。初始狀態(tài)下,讀寫地址都為0,在向FIFO中寫入一個數(shù)據(jù)后,寫地址加1,從FIFO中讀出一個數(shù)據(jù)后,讀地址加1。此時FIFO的狀態(tài)即為空,因為寫了一個數(shù)據(jù),又讀出了一個數(shù)據(jù)。

pIYBAGAJi_iAPrtaAABH8SIbtTU552.jpg

可以把FIFO想象成一個水池,寫通道即為加水,讀通道即為放水,假如不間斷的加水和放水,如果加水速度比放水速度快,那么FIFO就會有滿的時候,如果滿了還繼續(xù)加水就會溢出overflow,如果放水速度比加水速度快,那么FIFO就會有空的時候,所以把握好加水與放水的時機和速度,保證水池一直有水是一項很艱巨的任務。也就是判斷空與滿的狀態(tài),擇機寫數(shù)據(jù)或讀數(shù)據(jù)。

根據(jù)讀寫時鐘,可以分為同步FIFO(讀寫時鐘相同)和異步FIFO(讀寫時鐘不同)。同步FIFO控制比較簡單,不再介紹,本節(jié)實驗主要介紹異步FIFO的控制,其中讀時鐘為75MHz,寫時鐘為100MHz。實驗中會通過VIVADO集成的在想邏輯分析儀ila,我們可以觀察FIFO的讀寫時序和從FIFO中讀取的數(shù)據(jù)。

2. 創(chuàng)建Vivado工程
2.1 添加FIFO IP核

在添加FIFO IP之前先新建一個fifo_test的工程, 然后在工程中添加FIFO IP,方法如下:

2.1.1點擊下圖中IP Catalog,在右側(cè)彈出的界面中搜索fifo,找到FIFO Generator,雙擊打開。

pIYBAGAJjDiAcVjnAACIqTgAy3U223.jpg

2.1.2 彈出的配置頁面中,這里可以選擇讀寫時鐘分開還是用同一個,一般來講我們使用FIFO為了緩存數(shù)據(jù),通常兩邊的時鐘速度是不一樣的。所以獨立時鐘是最常用的,我們這里選擇“Independent Clocks Block RAM”,然后點擊“Next”到下一個配置頁面。

o4YBAGAJjHiAa4MTAACqO0XMJ_o468.jpg

2.1.3 切換到Native Ports欄目下,選擇數(shù)據(jù)位寬16;FIFO深選擇512,實際使用大家根據(jù)需要自行設置就可以。Read Mode有兩種方式,一個Standard FIFO,也就是平時常見的FIFO,數(shù)據(jù)滯后于讀信號一個周期,還有一種方式為First Word Fall Through,數(shù)據(jù)預取模式,簡稱FWFT模式。也就是FIFO會預先取出一個數(shù)據(jù),當讀信號有效時,相應的數(shù)據(jù)也有效。我們首先做標準FIFO的實驗。

pIYBAGAJjL6ADsfOAABnSiJw5sE934.jpg

2.1.4 切換到Data Counts欄目下,使能Write Data Count(已經(jīng)FIFO寫入多少數(shù)據(jù))和Read Data Count(FIFO中有多少數(shù)據(jù)可以讀),這樣我們可以通過這兩個值來看FIFO內(nèi)部的數(shù)據(jù)多少。點擊OK,Generate生成FIFO IP。

pIYBAGAJjPyAH_GBAACWnsqqP7M930.jpg

2.2 FIFO的端口定義與時序

pIYBAGAJjTuALD9oAAA8IT4wu0c489.png

FIFO的數(shù)據(jù)寫入和讀出都是按時鐘的上升沿操作的,當wr_en信號為高時寫入FIFO數(shù)據(jù),當almost_full信號有效時,表示FIFO只能再寫入一個數(shù)據(jù),一旦寫入一個數(shù)據(jù)了,full信號就會拉高,如果在full的情況下wr_en仍然有效,也就是繼續(xù)向FIFO寫數(shù)據(jù),則FIFO的overflow就會有效,表示溢出。

pIYBAGAJjXmAHnzVAACKyV16h2g989.jpg

標準FIFO寫時序

當rd_en信號為高時讀FIFO數(shù)據(jù),數(shù)據(jù)在下個周期有效。valid為數(shù)據(jù)有效信號,almost_empty表示還有一個數(shù)據(jù)讀,當再讀一個數(shù)據(jù),empty信號有效,如果繼續(xù)讀,則underflow有效,表示下溢,此時讀出的數(shù)據(jù)無效。

pIYBAGAJjcCAcVlpAAB7eGMlgwo632.jpg

標準FIFO讀時序

而從FWFT模式讀數(shù)據(jù)時序圖可以看出,rd_en信號有效時,有效數(shù)據(jù)D0已經(jīng)在數(shù)據(jù)線上準備好有效了,不會再延后一個周期。這就是與標準FIFO的不同之處。

pIYBAGAJjf6AcGZoAAB7qgk7TUk107.jpg

FWFT FIFO讀時序

關于FIFO的詳細內(nèi)容可參考pg057文檔,可在xilinx官網(wǎng)下載。

3. FIFO測試程序編寫

我們按照異步FIFO進行設計,用PLL產(chǎn)生出兩路時鐘,分別是100MHz和75MHz,用于寫時鐘和讀時鐘,也就是寫時鐘頻率高于讀時鐘頻率。

`timescale1ns/1ps ////////////////////////////////////////////////////////////////////////////////// module fifo_test ( input clk, //25MHz時鐘 input rst_n //復位信號,低電平有效 ); reg [15:0] w_data ; //FIFO寫數(shù)據(jù) wire wr_en ; //FIFO寫使能 wire rd_en ; //FIFO讀使能 wire[15:0] r_data ; //FIFO讀數(shù)據(jù) wire full ; //FIFO滿信號 wire empty ; //FIFO空信號 wire[8:0] rd_data_count ; //可讀數(shù)據(jù)數(shù)量 wire[8:0] wr_data_count ; //已寫入數(shù)據(jù)數(shù)量 wire clk_100M ; //PLL產(chǎn)生100MHz時鐘 wire clk_75M ; //PLL產(chǎn)生100MHz時鐘 wire locked ; //PLL lock信號,可作為系統(tǒng)復位信號,高電平表示lock住 wire fifo_rst_n ; //fifo復位信號, 低電平有效 wire wr_clk ; //寫FIFO時鐘 wire rd_clk ; //讀FIFO時鐘 reg [7:0] wcnt ; //寫FIFO復位后等待計數(shù)器 reg [7:0] rcnt ; //讀FIFO復位后等待計數(shù)器 wire clkbuf ; BUFG BUFG_inst ( .O(clkbuf),// 1-bit output: Clock output. .I(clk)// 1-bit input: Clock input. ); //例化PLL,產(chǎn)生100MHz和75MHz時鐘 clk_wiz_0 fifo_pll ( // Clock out ports .clk_out1(clk_100M), // output clk_out1 .clk_out2(clk_75M), // output clk_out2 // Status and control signals .reset(~rst_n), // input reset .locked(locked), // output locked // Clock in ports .clk_in1(clkbuf) // input clk_in1 ); assign fifo_rst_n = locked ; //將PLL的LOCK信號賦值給fifo的復位信號 assign wr_clk = clk_100M ; //將100MHz時鐘賦值給寫時鐘 assign rd_clk = clk_75M ; //將75MHz時鐘賦值給讀時鐘 /* 寫FIFO狀態(tài)機 */ localparam W_IDLE =1 ; localparam W_FIFO =2 ; reg[2:0] write_state; reg[2:0] next_write_state; always@(posedge wr_clk ornegedge fifo_rst_n) begin if(!fifo_rst_n) write_state <= W_IDLE; else write_state <= next_write_state; end always@(*) begin case(write_state) W_IDLE: begin if(wcnt ==8'd79)//復位后等待一定時間,safety circuit模式下的最慢時鐘60個周期 next_write_state <= W_FIFO; else next_write_state <= W_IDLE; end W_FIFO: next_write_state <= W_FIFO; //一直在寫FIFO狀態(tài) default: next_write_state <= W_IDLE; endcase end //在IDLE狀態(tài)下,也就是復位之后,計數(shù)器計數(shù) always@(posedge wr_clk ornegedge fifo_rst_n) begin if(!fifo_rst_n) wcnt <=8'd0; elseif(write_state == W_IDLE) wcnt <= wcnt +1'b1; else wcnt <=8'd0; end //在寫FIFO狀態(tài)下,如果不滿就向FIFO中寫數(shù)據(jù) assign wr_en =(write_state == W_FIFO)?~full :1'b0; //在寫使能有效情況下,寫數(shù)據(jù)值加1 always@(posedge wr_clk ornegedge fifo_rst_n) begin if(!fifo_rst_n) w_data <=16'd1; elseif(wr_en) w_data <= w_data +1'b1; end /* 讀FIFO狀態(tài)機 */ localparam R_IDLE =1 ; localparam R_FIFO =2 ; reg[2:0] read_state; reg[2:0] next_read_state; ///產(chǎn)生FIFO讀的數(shù)據(jù) always@(posedge rd_clk ornegedge fifo_rst_n) begin if(!fifo_rst_n) read_state <= R_IDLE; else read_state <= next_read_state; end always@(*) begin case(read_state) R_IDLE: begin if(rcnt ==8'd59) //復位后等待一定時間,safety circuit模式下的最慢時鐘60個周期 next_read_state <= R_FIFO; else next_read_state <= R_IDLE; end R_FIFO: next_read_state <= R_FIFO ; //一直在讀FIFO狀態(tài) default: next_read_state <= R_IDLE; endcase end //在IDLE狀態(tài)下,也就是復位之后,計數(shù)器計數(shù) always@(posedge rd_clk ornegedge fifo_rst_n) begin if(!fifo_rst_n) rcnt <=8'd0; elseif(write_state == W_IDLE) rcnt <= rcnt +1'b1; else rcnt <=8'd0; end //在讀FIFO狀態(tài)下,如果不空就從FIFO中讀數(shù)據(jù) assign rd_en =(read_state == R_FIFO)?~empty :1'b0; //----------------------------------------------------------- //實例化FIFO fifo_ip fifo_ip_inst ( .rst (~fifo_rst_n ),// input rst .wr_clk (wr_clk ),// input wr_clk .rd_clk (rd_clk ),// input rd_clk .din (w_data ),// input [15 : 0] din .wr_en (wr_en ),// input wr_en .rd_en (rd_en ),// input rd_en .dout (r_data ),// output [15 : 0] dout .full (full ),// output full .empty (empty ),// output empty .rd_data_count (rd_data_count ),// output [8 : 0] rd_data_count .wr_data_count (wr_data_count )// output [8 : 0] wr_data_count ); //寫通道邏輯分析儀 ila_m0 ila_wfifo ( .clk (wr_clk ), .probe0 (w_data ), .probe1 (wr_en ), .probe2 (full ), .probe3 (wr_data_count ) ); //讀通道邏輯分析儀 ila_m0 ila_rfifo ( .clk (rd_clk ), .probe0 (r_data ), .probe1 (rd_en ), .probe2 (empty ), .probe3 (rd_data_count ) ); endmodule

在程序中采用PLL的lock信號作為fifo的復位,同時將100MHz時鐘賦值給寫時鐘,75MHz時鐘賦值給讀時鐘。

pIYBAGAJjjyAH08SAABEWaLyBm0354.jpg

有一點需要注意的是,F(xiàn)IFO設置默認為采用safety circuit,此功能是保證到達內(nèi)部RAM的輸入信號是同步的,在這種情況下,如果異步復位后,則需要等待60個最慢時鐘周期,在本實驗中也就是75MHz的60個周期,那么100MHz時鐘大概需要(100/75)x60=80個周期。

pIYBAGAJjnuAIvdcAAEoJdFqP94664.jpg

因此在寫狀態(tài)機中,等待80個周期進入寫FIFO狀態(tài)

pIYBAGAJjsaAYLkIAACPaD2xz70893.jpg

在讀狀態(tài)機中,等待60個周期進入讀狀態(tài)

pIYBAGAJjwiAY-OnAACNns1gSpM714.jpg

如果FIFO不滿,就一直向FIFO寫數(shù)據(jù)

o4YBAGAJj0aAGqzQAAAjl8EkLiQ835.jpg

如果FIFO不空,就一直從FIFO讀數(shù)據(jù)

pIYBAGAJj4SAK9ulAAAk-WCVGPE540.jpg

例化兩個邏輯分析儀,分別連接寫通道和讀通道的信號

o4YBAGAJj8KAKqc3AABUidEQL1c430.jpg

4. 仿真

以下為仿真結(jié)果,可以看到寫使能wr_en有效后開始寫數(shù)據(jù),初始值為0001,從開始寫到empty不空,是需要一定周期的,因為內(nèi)部還要做同步處理。在不空后,開始讀數(shù)據(jù),讀出的數(shù)據(jù)相對于rd_en滯后一個周期。

在后面可以看到如果FIFO滿了,根據(jù)程序的設計,滿了就不向FIFO寫數(shù)據(jù)了,wr_en也就拉低了。為什么會滿呢,就是因為寫時鐘比讀時鐘快。如果將寫時鐘與讀時鐘調(diào)換,也就是讀時鐘快,就會出現(xiàn)讀空的情況,大家可以試一下。

如果將FIFO的Read Mode改成First Word Fall Through

pIYBAGAJkISAR0CsAABrbYldnA8618.jpg

仿真結(jié)果如下,可以看到rd_en有效的時候數(shù)據(jù)也有效,沒有相差一個周期

5. 板上驗證

生成好bit文件,下載bit文件,會出現(xiàn)兩個ila,先來看寫通道的,可以看到full信號為高電平時,wr_en為低電平,不再向里面寫數(shù)據(jù)。

pIYBAGAJkQGAbZcuAACJYRezMtQ940.jpg

而讀通道也與仿真一致

pIYBAGAJkT-AUdkZAACCU7BrZzs651.jpg

如果以rd_en上升沿作為觸發(fā)條件,點擊運行,然后按下復位,也就是我們綁定的PL KEY1,會出現(xiàn)下面的結(jié)果,與仿真一致,標準FIFO模式下,數(shù)據(jù)滯后rd_en一個周期。

審核編輯:何安

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

    關注

    1660

    文章

    22415

    瀏覽量

    636556
  • 測試
    +關注

    關注

    9

    文章

    6214

    瀏覽量

    131383
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    FIFO存儲器的種類、IP配置及應用

    FIRST IN FIRST OUT (先入先出)。顧名思義,FIFO是一個數(shù)據(jù)具有先進先出的存儲器。
    的頭像 發(fā)表于 01-13 15:15 ?388次閱讀
    <b class='flag-5'>FIFO</b>存儲器的種類、<b class='flag-5'>IP</b>配置及應用

    RDMA設計6:IP架構2

    擁塞處理及流量控制機制,如 ECN 協(xié)議或 PFC 協(xié)議。CMAC 集成塊模塊用以實現(xiàn)網(wǎng)絡連接的物理層。CMAC 集成塊是由 Xilinx 公司提供的用于 100Gb Ethernet 的高帶寬、可
    發(fā)表于 11-26 10:24

    使用AXI4接口IP進行DDR讀寫測試

    本章的實驗任務是在 PL 端自定義一個 AXI4 接口的 IP 核,通過 AXI_HP 接口對 PS 端 DDR3 進行讀寫測試,讀寫的內(nèi)存
    的頭像 發(fā)表于 11-24 09:19 ?3747次閱讀
    使用AXI4接口<b class='flag-5'>IP</b>核<b class='flag-5'>進行</b>DDR<b class='flag-5'>讀寫</b><b class='flag-5'>測試</b>

    Xilinx高性能NVMe Host控制器IP+PCIe 3.0軟核控制器IP,純邏輯實現(xiàn),AXI4和AXI4-Stream DMA接口,支持PCIe 3.0和4.0

    讀寫、DMA讀寫和數(shù)據(jù)擦除功能,提供用戶一個簡單高效的接口實現(xiàn)高性能存儲解決方案。NVMe AXI4 Host Controller IP讀寫
    發(fā)表于 11-14 22:40

    Xilinx BRAM IP核配置及其例化

    口RAM,一口讀一口寫,可以實現(xiàn)同時讀寫 Simple Port RAM,單口RAM,無法實現(xiàn)同時讀寫。 True Dual Port RAM,真雙口RAM ,每個端口都可以進行讀和寫。 其中
    發(fā)表于 10-24 06:10

    如何利用Verilog HDL在FPGA上實現(xiàn)SRAM的讀寫測試

    本篇將詳細介紹如何利用Verilog HDL在FPGA上實現(xiàn)SRAM的讀寫測試。SRAM是一種非易失性存儲器,具有高速讀取和寫入的特點。在FPGA中實現(xiàn)SRAM讀寫
    的頭像 發(fā)表于 10-22 17:21 ?4365次閱讀
    如何<b class='flag-5'>利用</b>Verilog HDL在FPGA上實現(xiàn)SRAM的<b class='flag-5'>讀寫</b><b class='flag-5'>測試</b>

    FPGA利用DMA IP核實現(xiàn)ADC數(shù)據(jù)采集

    本文介紹如何利用FPGA和DMA技術處理來自AD9280和AD9708 ADC的數(shù)據(jù)。首先,探討了這兩種ADC的特點及其與FPGA的接口兼容性。接著,詳細說明了使用Xilinx VIVADO環(huán)境下
    的頭像 發(fā)表于 07-29 14:12 ?5114次閱讀

    【RK3568+PG2L50H開發(fā)板實驗例程】FPGA部分 | ROM、RAM、FIFO 的使用

    提供 A 和 B 兩個端口,兩個端口均可以獨立進行讀寫 注意,當使用真雙端口時,要避免出現(xiàn)同時讀寫同個地址,這會造成寫入失敗,在邏輯設計上需要避開這個情況。 以下給出比較常用的 RA
    發(fā)表于 07-10 10:37

    cy7c68013a異步slave fifo模式,外部mcu無法讀寫fifo怎么解決?

    cy7c68013a 異步slave fifo 模式,外部mcu無法讀寫fifo 上位機發(fā)送bulk數(shù)據(jù),flag標志是對的,SLCS也拉低了,是設置的低有效, 檢測到了flag不為空的標志后
    發(fā)表于 06-03 10:49

    Xilinx Shift RAM IP概述和主要功能

    Xilinx Shift RAM IP 是 AMD Xilinx 提供的一個 LogiCORE IP 核,用于在 FPGA 中實現(xiàn)高效的移位
    的頭像 發(fā)表于 05-14 09:36 ?1087次閱讀

    AN65974示例如何鏈接fifo_slave_block 和 video_out的IP塊?

    您好,我正在研究 AN65974 pdf 用于視頻數(shù)據(jù)傳輸,但無法正確應用。 我有用于生成 1280x720x30fps 測試圖像的 ip 核心塊,并且我可以在顯示器上看到,所以我確信 hdmi
    發(fā)表于 05-12 07:31

    智多晶FIFO_Generator IP介紹

    FIFO_Generator是智多晶設計的一款通用型FIFO IP。當前發(fā)布的FIFO_Generator IP是2.0版本,相比之前的1.
    的頭像 發(fā)表于 04-25 17:24 ?1824次閱讀
    智多晶<b class='flag-5'>FIFO</b>_Generator <b class='flag-5'>IP</b>介紹

    詳解Xilinx的10G PCS PMA IP

    如果要在Xilinx的FPGA上使用萬兆以太網(wǎng)通信,大致有三種方法構建協(xié)議棧。第一種使用GTX等Serdes作為底層的PHY,上層通過HDL實現(xiàn)構建MAC和IP層,這種方式難度會比較大,底層需要完成PHY層的設計,最終我想通過這種方式實現(xiàn)萬兆以太網(wǎng)的搭建。
    的頭像 發(fā)表于 04-18 15:16 ?1998次閱讀
    詳解<b class='flag-5'>Xilinx</b>的10G PCS PMA <b class='flag-5'>IP</b>

    快問快答:防護等級IP68和IP67的有什么區(qū)別?如何有效進行防水等級測試

    IP68與IP67,代表電子設備頂級防水防塵能力,是高品質(zhì)的象征。IP68更強悍,可長時深潛;IP67亦卓越,能短時浸泡。精誠工科氣密性檢測儀,精準模擬
    的頭像 發(fā)表于 03-17 11:01 ?7765次閱讀
    快問快答:防護等級<b class='flag-5'>IP</b>68和<b class='flag-5'>IP</b>67的有什么區(qū)別?如何有效<b class='flag-5'>進行</b>防水等級<b class='flag-5'>測試</b>

    AXI接口FIFO簡介

    AXI接口FIFO是從Native接口FIFO派生而來的。AXI內(nèi)存映射接口提供了三種樣式:AXI4、AXI3和AXI4-Lite。除了Native接口FIFO支持的應用外,AXI
    的頭像 發(fā)表于 03-17 10:31 ?2141次閱讀
    AXI接口<b class='flag-5'>FIFO</b>簡介