国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

FPGA的Verilog設(shè)計(jì)(二)——異步FIFO

這篇具有很好參考價(jià)值的文章主要介紹了FPGA的Verilog設(shè)計(jì)(二)——異步FIFO。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


閱讀本文前,建議先閱讀下面幾篇文章:
同步FIFO
二進(jìn)制轉(zhuǎn)格雷碼的實(shí)現(xiàn)

前言

??在上篇文章同步FIFO中簡(jiǎn)要介紹了FIFO的基本概念以及同步FIFO的實(shí)現(xiàn)。本篇文章將重點(diǎn)介紹異步FIFO的工作原理以及硬件實(shí)現(xiàn)。

異步FIFO的工作原理

1. 概述

??異步FIFO的讀寫時(shí)鐘不同,F(xiàn)IFO的讀寫需要進(jìn)行異步處理,異步FIFO常用于多bit數(shù)據(jù)跨時(shí)鐘域處理。異步FIFO一般有復(fù)位rst_n、讀端口和寫端口。讀端口一般包括讀時(shí)鐘(rd_clk)、讀使能(rd_en)、讀數(shù)據(jù)(data_out)、讀空(empty)。寫端口一般包括寫時(shí)鐘(wr_clk)、寫使能(wr_en)、寫數(shù)據(jù)(data_in)、寫滿(wr_full)。

2. 地址的跨時(shí)鐘問題

??實(shí)現(xiàn)異步FIFO難點(diǎn)仍在于如何得到讀空和寫滿信號(hào)。由于異步FIFO的讀寫具有不同的時(shí)鐘,讀寫?yīng)毩ⅲ强諠M信號(hào)的判決仍需要通過讀寫地址(多bit數(shù)據(jù))來實(shí)現(xiàn),這里涉及到了多bit數(shù)據(jù)的跨時(shí)鐘域處理,當(dāng)然這里無法使用異步FIFO來實(shí)現(xiàn)這個(gè)跨時(shí)鐘處理,畢竟我們就是為了做異步FIFO。多bit跨時(shí)鐘處理還可以通過改變編碼方式來降低亞穩(wěn)態(tài)的發(fā)生概率。當(dāng)讀地址由4’b0111向4’b1000變化時(shí),所有位都需要變化,如果寫時(shí)鐘恰好在地址變化時(shí)采樣,寫時(shí)鐘得到的讀地址是不確定的(為0000~1111中任意一個(gè)),因此為了降低該亞穩(wěn)態(tài)的發(fā)生概率,地址采用格雷碼編碼。格雷碼每次只變化一位,可以有效降低亞穩(wěn)態(tài)的發(fā)生概率,同時(shí)單bit又可以采用打兩拍的方法再次降低亞穩(wěn)態(tài)發(fā)生的概率。
??綜上所述,為有效解決地址的跨時(shí)鐘問題,采取格雷碼編碼+打兩拍的方式降低地址變化發(fā)生亞穩(wěn)態(tài)的概率。二進(jìn)制轉(zhuǎn)格雷碼的實(shí)現(xiàn)。

3. 空滿信號(hào)的判決條件

??由于異步FIFO的讀寫地址采用格雷碼,空滿信號(hào)的判決條件不同于同步FIFO。同同步FIFO,可以將讀寫地址擴(kuò)展一位,用于判斷是否讀寫完一輪,即深度為8,地址為4bit。以下為深度為8的異步FIFO進(jìn)行讀寫情況,以下只列舉了四種操作,其余讀寫少于深度個(gè)數(shù)據(jù)的情況也是類似的。
FPGA的Verilog設(shè)計(jì)(二)——異步FIFO,# 常用數(shù)字電路模塊,fpga開發(fā)

??綜上所述,讀空empty信號(hào)拉高的判決條件是讀寫地址的格雷碼相同。寫滿信號(hào)拉高的判決條件是讀寫地址的格雷碼的高2位不同,其余位相同。
??但是上述判決條件可能存在一些問題。由于讀寫地址需要打兩拍,如果打拍期間還有讀寫操作,那讀寫地址又改變了,得到的并不是真正的空滿信號(hào),那會(huì)出現(xiàn)數(shù)據(jù)丟失的情況嗎?舉例說明如下:

  • 判斷空信號(hào):判斷空信號(hào),需要比較rd_clk的讀地址rd_addr從wr_clk打拍到rd_clk的寫地址wr_addr_w2r,如果在打拍過程中,還寫入數(shù)據(jù)(wr_addr增加),那么用于判斷空信號(hào)的wr_addr_w2r會(huì)小于實(shí)際的寫地址wr_addr。如果此時(shí)判斷為空,其實(shí)FIFO并不是真空,只不過此時(shí)FIFO不能再讀出數(shù)據(jù),此種情況并不會(huì)發(fā)生數(shù)據(jù)丟失。并且下一個(gè)時(shí)鐘,空信號(hào)便會(huì)失效,并不會(huì)影響FIFO的正常使用。
  • 判斷滿信號(hào):判斷滿信號(hào),需要比較wr_clk的寫地址wr_addr從rd_clk打拍到wr_clk的讀地址rd_addr_r2w,如果在打拍過程中,還讀出數(shù)據(jù)(rd_addr增加),那么用于判斷滿信號(hào)的rd_addr_r2w會(huì)小于實(shí)際的讀地址rd_addr。如果此時(shí)判斷為滿,其實(shí)FIFO并不是真滿,只不過此時(shí)FIFO不能再寫入數(shù)據(jù),此種情況并不會(huì)發(fā)生數(shù)據(jù)丟失。并且下一個(gè)時(shí)鐘,滿信號(hào)便會(huì)失效,并不會(huì)影響FIFO的正常使用。

異步FIFO的實(shí)現(xiàn)

module async_fifo#(  
    parameter    DEPTH = 16,  
    parameter    WIDTH = 8,
    parameter    ADDR_BIT = 4,      //log2(DEPTH)
    parameter    RAM_STYLE_VAL = "distributed" 
)(  
    input        wr_clk,  
    input        rst_n,  
    input        wr_en,  
    input  [WIDTH-1:0]  data_in,  
    input        rd_clk,  
    input        rd_en,  
    output  [WIDTH-1:0]  data_out,  
    output        full,  
    output        empty
);
	(*ram_style=RAM_STYLE_VAL*)
    reg  [WIDTH-1:0]   mem [DEPTH-1:0];
    reg  [WIDTH-1:0]   data_out_r;
    reg  [ADDR_BIT:0]  wr_addr;
    wire [ADDR_BIT:0]  wr_addr_gray;
    reg  [ADDR_BIT:0]  wr_addr_w2r1;
    reg  [ADDR_BIT:0]  wr_addr_w2r2;
    reg  [ADDR_BIT:0]  rd_addr;
    wire [ADDR_BIT:0]  rd_addr_gray;
    reg  [ADDR_BIT:0]  rd_addr_r2w1;
    reg  [ADDR_BIT:0]  rd_addr_r2w2;
    
    //*********************** Address ***********************//
    //write address
    always @ (posedge wr_clk or negedge rst_n)begin  
    	if(!rst_n)    wr_addr <= 'd0;  
    	else if(wr_en)    wr_addr <= wr_addr + 1;  
    	else    wr_addr <= wr_addr;
    end

    //write address - > gray
    assign  wr_addr_gray = (wr_addr>>1)^wr_addr;
    
    //Write address synchronization to read clock domain
    always @ (posedge wr_clk or negedge rst_n)begin  
    	if(!rst_n)    
    	   {wr_addr_w2r2,wr_addr_w2r1} <= 'd0;
      	else  
      	   {wr_addr_w2r2,wr_addr_w2r1} <= {wr_addr_w2r1,wr_addr_gray};
    end
    //read address
    always @ (posedge rd_clk or negedge rst_n)begin  
    	if(!rst_n)    
    	   rd_addr <= 'd0;  
    	else if(rd_en)   
    	   rd_addr <= rd_addr + 1;  
    	else    
    	   rd_addr <= rd_addr;  
    end
    //write address - > gray
    assign  rd_addr_gray = (rd_addr>>1)^rd_addr;
    //Read address synchronization to write clock domain
    always @ (posedge rd_clk or negedge rst_n)begin  
    	if(!rst_n)    
    	   {rd_addr_r2w2,rd_addr_r2w1} <= 'd0;  
    	else    
    	   {rd_addr_r2w2,rd_addr_r2w1} <= {rd_addr_r2w1,rd_addr_gray};
    end
    //************************* Data *************************//
    //write data
    always @ (posedge wr_clk)begin  
        if(wr_en) 
            mem[wr_addr] <= data_in;
        else      
            mem[wr_addr] <= mem[wr_addr];
    end
    //read data delay 1clk
    assign  data_out = data_out_r;
    always @ (posedge rd_clk or negedge rst_n)begin  
    	if(!rst_n)    
    	   data_out_r <= {WIDTH{1'b0}};  
    	else if(rd_en==1)    
    	   data_out_r <= mem[rd_addr];  
    	else    
    	   data_out_r <= data_out_r;
    end
    //********************** Full/Empty *********************//
    //Empty signal judgment
    assign empty = (wr_addr_w2r2 == rd_addr_gray);
    //Full signal judgment
    assign full  = ({~(rd_addr_r2w2[4:3]),rd_addr_r2w2[2:0]}==wr_addr_gray[4:0]);
    
endmodule

異步FIFO的仿真測(cè)試

module tb_async;
    reg      wr_clk,rd_clk;
    reg      rst_n;
    reg      wr_en;
    reg      rd_en;
    reg  [7:0] data_in;
    wire [7:0] data_out;
    wire    full;
    wire    empty;
    
    parameter WR_PERIOD = 10;
    parameter RD_PERIOD = 20 ;
    
    async_fifo async_fifo(  
        .wr_clk     (wr_clk     ),  
        .rst_n      (rst_n      ),  
        .wr_en      (wr_en      ),  
        .data_in    (data_in    ),  
        .rd_clk     (rd_clk     ),
        .rd_en      (rd_en      ), 
        .data_out   (data_out   ), 
        .full       (full       ),  
        .empty      (empty      )     
        );
        
    initial begin  
        wr_clk = 0;rd_clk=0;rst_n = 0;  
        wr_en <= 0;rd_en <= 0;data_in  = 'd0;    
        #15  rst_n = 1; 
        write_data(16); 
        #100
        read_data(16);
        #100
        $finish;
    end
    always # (WR_PERIOD/2) wr_clk = ~wr_clk;
    always # (RD_PERIOD/2) rd_clk = ~rd_clk;
    
    task  write_data(input [7:0] t);  
    begin
        repeat(t)begin
            @(posedge wr_clk)
            data_in <= {$random}%256;
            wr_en   <= 1;
        end
        @(posedge wr_clk) wr_en <= 0;data_in <= 'd0;
    end
    endtask  
    
    task  read_data(input [7:0] t);  
        integer  i;  
        begin    
            repeat(t)begin
                @(posedge rd_clk)
                rd_en   <= 1;
            end
            @(posedge rd_clk) rd_en <= 0;
        end  
    endtask      
endmodule

??仿真結(jié)果如下,可以發(fā)現(xiàn)該異步fifo邏輯正確。
FPGA的Verilog設(shè)計(jì)(二)——異步FIFO,# 常用數(shù)字電路模塊,fpga開發(fā)文章來源地址http://www.zghlxwxcb.cn/news/detail-759219.html

到了這里,關(guān)于FPGA的Verilog設(shè)計(jì)(二)——異步FIFO的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 異步FIFO(Verilog)

    異步FIFO(Verilog)

    簡(jiǎn)介: ? ? ? ?FIFO(First In First Out)是異步數(shù)據(jù)傳輸時(shí)經(jīng)常使用的存儲(chǔ)器。該存儲(chǔ)器的特點(diǎn)是數(shù)據(jù)先進(jìn)先出(后進(jìn)后出)。其實(shí),多位寬數(shù)據(jù)的異步傳輸問題,無論是從快時(shí)鐘到慢時(shí)鐘域,還是從慢時(shí)鐘到快時(shí)鐘域,都可以使用 FIFO 處理。異步FIFO 是指讀寫時(shí)鐘不一致,讀寫

    2024年02月08日
    瀏覽(22)
  • 【小白入門】Verilog實(shí)現(xiàn)異步FIFO

    【小白入門】Verilog實(shí)現(xiàn)異步FIFO

    ? ?之前也在CSDN上面寫過兩個(gè)FIFO相關(guān)的文章,不過代碼看起來比較復(fù)雜,且注釋也比較少,不利于新手入門。很多時(shí)候都沒有耐心繼續(xù)看下去。 http://t.csdn.cn/0dPX6 http://t.csdn.cn/lYvoY? 因?yàn)樽约罕旧硎且粋€(gè)初學(xué)者,就從初學(xué)者的視角來看待并學(xué)習(xí)FIFO。 為什么選擇學(xué)習(xí)FIFO? 在學(xué)

    2024年02月09日
    瀏覽(25)
  • Verilog學(xué)習(xí)筆記(3):Verilog數(shù)字邏輯電路設(shè)計(jì)方法

    Verilog學(xué)習(xí)筆記(3):Verilog數(shù)字邏輯電路設(shè)計(jì)方法

    例:用Verilog設(shè)計(jì)模256(8bits)計(jì)數(shù)器 (a)可綜合程序描述方式 (b)常見的錯(cuò)誤描述方式 同時(shí)Verilog的電路描述方式具有多樣性,這也決定了對(duì)于電路設(shè)計(jì)的多樣性。 例:用Verilog設(shè)計(jì)數(shù)字多路選擇器 (a)采用真值表形式的代碼 (b)采用邏輯表達(dá)式形式的代碼 (c)采用結(jié)

    2023年04月08日
    瀏覽(34)
  • 數(shù)字集成電路設(shè)計(jì)(四、Verilog HDL數(shù)字邏輯設(shè)計(jì)方法)(二)

    數(shù)字集成電路設(shè)計(jì)(四、Verilog HDL數(shù)字邏輯設(shè)計(jì)方法)(二)

    所有的是時(shí)序邏輯電路都可以拆成組合邏輯電路+存儲(chǔ) (關(guān)于組合邏輯電路的理解可以參考我數(shù)電的博客https://blog.csdn.net/y_u_yu_yu_/article/details/127592466) 可以分成兩個(gè)部分,組合邏輯電路和存儲(chǔ)電路。組合邏輯電路的輸入一個(gè)是x信號(hào)一個(gè)是當(dāng)前的狀態(tài),這兩個(gè)信號(hào)決定了組合

    2024年02月06日
    瀏覽(128)
  • 數(shù)字電路EDA綜合設(shè)計(jì)verilog筆記(持續(xù)更新)

    數(shù)字電路EDA綜合設(shè)計(jì)verilog筆記(持續(xù)更新)

    目錄 1、常用組合電路模塊的設(shè)計(jì) 1、基本門電路(常用3種描述方法) 2、譯碼器與編碼器 (1)譯碼器(decoder) (2)編碼器(encoder) 2、常用時(shí)序電路模塊的設(shè)計(jì) 1、D觸發(fā)器 2、數(shù)據(jù)鎖存器 3、實(shí)用電路設(shè)計(jì) 1、基本門電路 2、譯碼器與編碼器 3、數(shù)據(jù)選擇器 4、奇偶校驗(yàn)產(chǎn)生器

    2024年02月09日
    瀏覽(16)
  • 數(shù)字集成電路設(shè)計(jì)(六、Verilog HDL高級(jí)程序設(shè)計(jì)舉例)

    數(shù)字集成電路設(shè)計(jì)(六、Verilog HDL高級(jí)程序設(shè)計(jì)舉例)

    在我們的數(shù)電,集成電路設(shè)計(jì)里面,一定是層次化設(shè)計(jì)的 在一個(gè)手機(jī)芯片的一個(gè)部分,寫的硬件描述語言的層次都能達(dá)到20幾層,對(duì)于這樣的設(shè)計(jì),我i們就能想到采用底層的設(shè)計(jì),中間層的設(shè)計(jì)和頂層的設(shè)計(jì)。對(duì)于小規(guī)模電路,極小規(guī)模電路,通常想的是先有模塊然后去搭一

    2024年04月16日
    瀏覽(97)
  • 【FPGA】Verilog:組合電路設(shè)計(jì) | 三輸入 | 多數(shù)表決器

    【FPGA】Verilog:組合電路設(shè)計(jì) | 三輸入 | 多數(shù)表決器

    前言: 本章內(nèi)容主要是演示Vivado下利用Verilog語言進(jìn)行電路設(shè)計(jì)、仿真、綜合和下載的示例:表決器(三人表決器)。 功能特性:?采用?Xilinx Artix-7 XC7A35T芯片? 配置方式:USB-JTAG/SPI Flash 高達(dá)100MHz 的內(nèi)部時(shí)鐘速度? 存儲(chǔ)器:2Mbit SRAM ??N25Q064A SPI Flash(樣圖舊款為N25Q032A) 通用

    2023年04月08日
    瀏覽(40)
  • Verilog數(shù)字系統(tǒng)設(shè)計(jì)——10進(jìn)制計(jì)數(shù)器,具有異步復(fù)位功能

    Verilog數(shù)字系統(tǒng)設(shè)計(jì)——10進(jìn)制計(jì)數(shù)器,具有異步復(fù)位功能

    編程實(shí)現(xiàn)10進(jìn)制計(jì)數(shù)器,具有異步復(fù)位功能,十位和個(gè)位用8421BCD碼表示,各端口定義如下圖所示: 仔細(xì)考慮端口定義中每個(gè)端口的含義; 要求完成程序編輯、編譯、時(shí)序仿真; 實(shí)驗(yàn)提交Verilog設(shè)計(jì)文件(.v文件)、仿真波形截圖以及對(duì)于第3個(gè)步驟所提出問題的回答,文件打包

    2024年02月11日
    瀏覽(19)
  • Verilog功能模塊——讀寫位寬不同的異步FIFO

    Verilog功能模塊——讀寫位寬不同的異步FIFO

    FIFO系列文章目錄: Verilog功能模塊——異步FIFO-CSDN博客 Verilog功能模塊——同步FIFO-CSDN博客 Verilog功能模塊——讀寫位寬不同的異步FIFO-CSDN博客 Verilog功能模塊——讀寫位寬不同的同步FIFO-CSDN博客 Verilog功能模塊——標(biāo)準(zhǔn)FIFO轉(zhuǎn)FWFT FIFO-CSDN博客 前面的博文已經(jīng)講了異步FIFO和同步

    2024年02月01日
    瀏覽(25)
  • 【數(shù)字IC手撕代碼】Verilog無毛刺時(shí)鐘切換電路|題目|原理|設(shè)計(jì)|仿真

    【數(shù)字IC手撕代碼】Verilog無毛刺時(shí)鐘切換電路|題目|原理|設(shè)計(jì)|仿真

    芯片設(shè)計(jì)驗(yàn)證社區(qū)·芯片愛好者聚集地·硬件相關(guān)討論社區(qū)·數(shù)字verifier星球 四社區(qū) 聯(lián)合力薦 !近500篇 數(shù)字IC精品文章收錄 ! 【數(shù)字IC精品文章收錄】學(xué)習(xí)路線·基礎(chǔ)知識(shí)·總線·腳本語言·芯片求職·EDA工具·低功耗設(shè)計(jì)Verilog·STA·設(shè)計(jì)·驗(yàn)證·FPGA·架構(gòu)·AMBA·書籍 本系列旨在提

    2023年04月08日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包