欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

如何設計異步時鐘之間的接口電路

FPGA之家 ? 來源:fpga之家 ? 作者:fpga之家 ? 2022-11-15 09:29 ? 次閱讀

一、FIFO簡介

FIFO是英文First In First Out 的縮寫,是一種先進先出的數(shù)據(jù)緩存器,它與普通存儲器的區(qū)別是沒有外部讀寫地址線,這樣使用起來非常簡單,但缺點就是只能順序寫入數(shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫指針自動加1完成,不能像普通存儲器那樣可以由地址線決定讀取或寫入某個指定的地址。

用途1:

異步FIFO讀寫分別采用相互異步的不同時鐘。在現(xiàn)代集成電路芯片中,隨著設計規(guī)模的不斷擴大,一個系統(tǒng)中往往含有數(shù)個時鐘,多時鐘域帶來的一個問題就是,如何設計異步時鐘之間的接口電路。異步FIFO是這個問題的一種簡便、快捷的解決方案,使用異步FIFO可以在兩個不同時鐘系統(tǒng)之間快速而方便地傳輸實時數(shù)據(jù)。

用途2:

對于不同寬度的數(shù)據(jù)接口也可以用FIFO,例如單片機位8位數(shù)據(jù)輸出,而DSP可能是16位數(shù)據(jù)輸入,在單片機與DSP連接時就可以使用FIFO來達到數(shù)據(jù)匹配的目的。

二、分類

同步FIFO是指讀時鐘和寫時鐘為同一個時鐘,在時鐘沿來臨時同時發(fā)生讀寫操作;

異步FIFO是指讀寫時鐘不一致,讀寫時鐘是互相獨立的。

三、FIFO的常見參數(shù)

FIFO的寬度:即FIFO一次讀寫操作的數(shù)據(jù)位;

FIFO的深度:指的是FIFO可以存儲多少個N位的數(shù)據(jù)(如果寬度為N)。

滿標志:FIFO已滿或將要滿時由FIFO的狀態(tài)電路送出的一個信號,以阻止FIFO的寫操作繼續(xù)向FIFO中寫數(shù)據(jù)而造成溢出(overflow)。

空標志:FIFO已空或將要空時由FIFO的狀態(tài)電路送出的一個信號,以阻止FIFO的讀操作繼續(xù)從FIFO中讀出數(shù)據(jù)而造成無效數(shù)據(jù)的讀出(underflow)。

讀時鐘:讀操作所遵循的時鐘,在每個時鐘沿來臨時讀數(shù)據(jù)。

寫時鐘:寫操作所遵循的時鐘,在每個時鐘沿來臨時寫數(shù)據(jù)。

===============================分 隔 符 ==============================

讀寫指針的工作原理

讀指針:總是指向下一個將要被寫入的單元,復位時,指向第1個單元(編號為0)。

寫指針:總是指向當前要被讀出的數(shù)據(jù),復位時,指向第1個單元(編號為0)

FIFO的“空”/“滿”檢測

FIFO設計的關鍵:產(chǎn)生可靠的FIFO讀寫指針和生成FIFO“空”/“滿”狀態(tài)標志。

當讀寫指針相等時,表明FIFO為空,這種情況發(fā)生在復位操作時,或者當讀指針讀出FIFO中最后一個字后,追趕上了寫指針時,如下圖所示:

當讀寫指針再次相等時,表明FIFO為滿,這種情況發(fā)生在,當寫指針轉了一圈,折回來(wrapped around)又追上了讀指針,如下圖:

為了區(qū)分到底是滿狀態(tài)還是空狀態(tài),可以采用以下方法:

方法1:在指針中添加一個額外的位(extra bit),當寫指針增加并越過最后一個FIFO地址時,就將寫指針這個未用的MSB加1,其它位回零。對讀指針也進行同樣的操作。此時,對于深度為2n的FIFO,需要的讀/寫指針位寬為(n+1)位,如對于深度為8的FIFO,需要采用4bit的計數(shù)器,0000~1000、1001~1111,MSB作為折回標志位,而低3位作為地址指針。

如果兩個指針的MSB不同,說明寫指針比讀指針多折回了一次;如r_addr=0000,而w_addr = 1000,為滿。

如果兩個指針的MSB相同,則說明兩個指針折回的次數(shù)相等。其余位相等,說明FIFO為空;

3.二進制FIFO指針的考慮

將一個二進制的計數(shù)值從一個時鐘域同步到另一個時鐘域的時候很容易出現(xiàn)問題,因為采用二進制計數(shù)器時所有位都可能同時變化,在同一個時鐘沿同步多個信號的變化會產(chǎn)生亞穩(wěn)態(tài)問題。而使用格雷碼只有一位變化,因此在兩個時鐘域間同步多個位不會產(chǎn)生問題。所以需要一個二進制到gray碼的轉換電路,將地址值轉換為相應的gray碼,然后將該gray碼同步到另一個時鐘域進行對比,作為空滿狀態(tài)的檢測。

4.

使用gray碼進行對比,如何判斷“空”與“滿”

使用gray碼解決了一個問題,但同時也帶來另一個問題,即在格雷碼域如何判斷空與滿。

對于“空”的判斷依然依據(jù)二者完全相等(包括MSB);

而對于“滿”的判斷,如下圖,由于gray碼除了MSB外,具有鏡像對稱的特點,當讀指針指向7,寫指針指向8時,除了MSB,其余位皆相同,不能說它為滿。因此不能單純的只檢測最高位了,在gray碼上判斷為滿必須同時滿足以下3條:

wptr和同步過來的rptr的MSB不相等,因為wptr必須比rptr多折回一次。

wptr與rptr的次高位不相等,如上圖位置7和位置15,轉化為二進制對應的是0111和1111,MSB不同說明多折回一次,111相同代表同一位置。

剩下的其余位完全相等。

5.總體實現(xiàn)

系統(tǒng)的總體框圖如下:

1)頂層模塊

moduleAsyncFIFO

 #(parameter ASIZE = 4,    //地址位寬
   parameter DSIZE = 8)    //數(shù)據(jù)位寬
 (
    input  [DSIZE-1:0] wdata,
    input              winc, wclk, wrst_n,  //寫請求信號,寫時鐘,寫復位
    input              rinc, rclk, rrst_n,  //讀請求信號,讀時鐘,讀復位
    output [DSIZE-1:0] rdata,
    output             wfull,
    output             rempty
 );
wire [ASIZE-1:0] waddr, raddr;
wire [ASIZE:0]   wptr, rptr, wq2_rptr, rq2_wptr;        /************************************************************
* In order to perform FIFO full and FIFO empty tests using 
* this FIFO style, the read and write pointers must be
* passed to the opposite clock domain for pointer comparison
*************************************************************/
/*在檢測“滿”或“空”狀態(tài)之前,需要將指針同步到其它時鐘域時,使用格雷碼,可以降低同步過程中亞穩(wěn)態(tài)出現(xiàn)的概率*/
sync_r2w I1_sync_r2w(
    .wq2_rptr(wq2_rptr), 
    .rptr(rptr),
    .wclk(wclk), 
    .wrst_n(wrst_n));
sync_w2r I2_sync_w2r (
    .rq2_wptr(rq2_wptr), 
    .wptr(wptr),
    .rclk(rclk), 
    .rrst_n(rrst_n));
/*
*  DualRAM 
*/
DualRAM #(DSIZE, ASIZE) I3_DualRAM(
    .rdata(rdata), 
    .wdata(wdata),
    .waddr(waddr), 
    .raddr(raddr),
    .wclken(winc), 
    .wclk(wclk));
    
/*
*  空、滿比較邏輯
*/
rptr_empty #(ASIZE) I4_rptr_empty(
    .rempty(rempty),
    .raddr(raddr),
    .rptr(rptr), 
    .rq2_wptr(rq2_wptr),
    .rinc(rinc), 
    .rclk(rclk),
    .rrst_n(rrst_n));
wptr_full #(ASIZE) I5_wptr_full(
    .wfull(wfull), 
    .waddr(waddr),
    .wptr(wptr), 
    .wq2_rptr(wq2_rptr),
    .winc(winc), 
    .wclk(wclk),
    .wrst_n(wrst_n));
endmodule

2)DualRAM模塊

module DualRAM
#(
    parameter DATA_SIZE = 8,   // 數(shù)據(jù)位寬
    parameter ADDR_SIZE = 4   // 地址位寬
)
(
    input                       wclken,wclk,
    input      [ADDR_SIZE-1:0]  raddr,     //RAM read address
    input      [ADDR_SIZE-1:0]  waddr,     //RAM write address
    input      [DATA_SIZE-1:0]  wdata,    //data input
    output     [DATA_SIZE-1:0]  rdata      //data output
);    
localparam RAM_DEPTH = 1 << ADDR_SIZE;   //RAM深度 = 2^ADDR_WIDTH
        reg [DATA_SIZE-1:0] Mem[RAM_DEPTH-1:0];
        always@(posedge wclk)
begin
     if(wclken)
         Mem[waddr] <= wdata;
end
assign rdata =  Mem[raddr];
endmodule

3)同步模塊

module sync_r2w 
#(parameter ADDRSIZE = 4)
(
    output reg [ADDRSIZE:0] wq2_rptr,
    input      [ADDRSIZE:0] rptr,
    input                       wclk, wrst_n
);
reg [ADDRSIZE:0] wq1_rptr;
always @(posedge wclk or negedge wrst_n)
    if (!wrst_n) 
        {wq2_rptr,wq1_rptr} <= 0;
    else 
        {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr};
endmodule

4)同步模塊2

module sync_w2r 
#(parameter ADDRSIZE = 4)
(
    output reg  [ADDRSIZE:0] rq2_wptr,
    input         [ADDRSIZE:0] wptr,
    input         rclk, rrst_n
);        reg [ADDRSIZE:0] rq1_wptr;
always @(posedge rclk or negedge rrst_n)
    if (!rrst_n)
        {rq2_wptr,rq1_wptr} <= 0;
    else 
        {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr};
endmodule

5)空判斷邏輯

module rptr_empty 
#(parameter ADDRSIZE = 4)
(
    output reg rempty,
    output     [ADDRSIZE-1:0] raddr,
    output reg [ADDRSIZE :0]  rptr,
    input       [ADDRSIZE :0] rq2_wptr,
    input       rinc, rclk, rrst_n);


reg  [ADDRSIZE:0] rbin;
wire [ADDRSIZE:0] rgraynext, rbinnext;
wire  rempty_val;
//-------------------
// GRAYSTYLE2 pointer: gray碼讀地址指針
//-------------------
always @(posedge rclk or negedge rrst_n)
    if (!rrst_n) 
        begin 
            rbin <= 0;
            rptr <= 0;
        end
    else
        begin
            rbin <= rbinnext ; 
            rptr <= rgraynext;
        end
// gray碼計數(shù)邏輯
assign rbinnext = !rempty ? (rbin + rinc) : rbin;
assign rgraynext = (rbinnext>>1) ^ rbinnext;      //二進制到gray碼的轉換
        assign raddr = rbin[ADDRSIZE-1:0];
//---------------------------------------------------------------
// FIFO empty when the next rptr == synchronized wptr or on reset
//---------------------------------------------------------------
/*
*   讀指針是一個n位的gray碼計數(shù)器,比FIFO尋址所需的位寬大一位
*   當讀指針和同步過來的寫指針完全相等時(包括MSB),說明二者折回次數(shù)一致,FIFO為空
*     
*/
assign rempty_val = (rgraynext == rq2_wptr);
        always @(posedge rclk or negedge rrst_n)
if (!rrst_n) 
    rempty <= 1'b1;
else 
    rempty <= rempty_val;
endmodule

6)滿判斷邏輯

module wptr_full 
#(
    parameter ADDRSIZE = 4
)
(
    output reg                wfull,
    output     [ADDRSIZE-1:0] waddr,
    output reg [ADDRSIZE :0]  wptr,
    input      [ADDRSIZE :0]  wq2_rptr,
    input                     winc, wclk, wrst_n);        

reg  [ADDRSIZE:0] wbin;
wire [ADDRSIZE:0] wgraynext, wbinnext;
wire wfull_val;
// GRAYSTYLE2 pointer
always @(posedge wclk or negedge wrst_n)
    if (!wrst_n) 
    begin
        wbin <= 0;
        wptr <= 0;
    end
    else 
    begin
        wbin <= wbinnext;
         wptr <= wgraynext;
    end
//gray 碼計數(shù)邏輯    
assign wbinnext  = !wfull ? wbin + winc : wbin;
assign wgraynext = (wbinnext>>1) ^ wbinnext;
        assign waddr = wbin[ADDRSIZE-1:0];
        /*由于滿標志在寫時鐘域產(chǎn)生,因此比較安全的做法是將讀指針同步到寫時鐘域*/
/**/
//------------------------------------------------------------------
// Simplified version of the three necessary full-tests:
// assign wfull_val=((wgnext[ADDRSIZE] !=wq2_rptr[ADDRSIZE] ) &&
// (wgnext[ADDRSIZE-1] !=wq2_rptr[ADDRSIZE-1]) &&
// (wgnext[ADDRSIZE-2:0]==wq2_rptr[ADDRSIZE-2:0]));
//------------------------------------------------------------------
assign wfull_val = (wgraynext=={~wq2_rptr[ADDRSIZE:ADDRSIZE-1],
                    wq2_rptr[ADDRSIZE-2:0]});
always @(posedge wclk or negedge wrst_n)
if (!wrst_n) 
    wfull <= 1'b0;
else 
    wfull <= wfull_val;
endmodule

P.S : 在quartus中有異步FIFO IP核,為安全起見推薦使用IP核定制FIFO,本文的目的只是作為思路參考。

審核編輯:郭婷

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

    關注

    456

    文章

    51241

    瀏覽量

    427499
  • 存儲器
    +關注

    關注

    38

    文章

    7529

    瀏覽量

    164371
  • fifo
    +關注

    關注

    3

    文章

    389

    瀏覽量

    43875

原文標題:異步FIFO的FPGA實現(xiàn)

文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    異步串行接口有哪些,異步串行接口為何需要波特率

    在現(xiàn)代電子通信領域,異步串行接口作為數(shù)據(jù)交換的一種基本方式,廣泛應用于各種嵌入式系統(tǒng)、計算機設備以及遠程通信網(wǎng)絡中。本文將深入探討異步串行接口的主要類型,并解析為何波特率在
    的頭像 發(fā)表于 01-29 14:47 ?138次閱讀

    總線接口的類型與選擇指南

    ) 類型:異步、全雙工串口總線。 特性:有兩根線,一根TXD用于發(fā)送,一根RXD用于接收。不需要時鐘信號來同步傳輸,而是依賴于發(fā)送設備和接收設備之間預定義的配置。 I2C總線 類型:同步、半雙工雙向的兩線式串口總線。 特性:由串
    的頭像 發(fā)表于 12-31 10:06 ?372次閱讀

    計算機接口位于什么之間

    計算機接口是計算機硬件和軟件之間、計算機與外部設備之間以及計算機各部件之間傳輸數(shù)據(jù)、控制信息和狀態(tài)信息的硬件設備和軟件程序。它在計算機系統(tǒng)中起著至關重要的作用,確保數(shù)據(jù)和信息在不同組件
    的頭像 發(fā)表于 10-14 14:02 ?563次閱讀

    scsi接口是什么之間接口

    SCSI(Small Computer System Interface)是一種用于計算機和智能設備之間(如硬盤驅動器、磁帶驅動器、CD-ROM驅動器等)的數(shù)據(jù)傳輸接口標準。SCSI接口在20世紀
    的頭像 發(fā)表于 10-14 10:29 ?1593次閱讀

    pcm1794能否支持異步時鐘模式?

    MCLK接在pcm2706c上的12Mhz輸出上面,則正常出聲。。手頭還有一塊es9023 dac,可以支持49.152Mhz輸入到MCLK工作在異步模式,但是pcm1794不行,我想問一下pcm1794能否支持異步時鐘模式?
    發(fā)表于 09-29 06:56

    隔離式調制器與MCU之間的數(shù)字接口時鐘邊沿延遲補償

    電子發(fā)燒友網(wǎng)站提供《隔離式調制器與MCU之間的數(shù)字接口時鐘邊沿延遲補償.pdf》資料免費下載
    發(fā)表于 09-06 11:18 ?0次下載
    隔離式調制器與MCU<b class='flag-5'>之間</b>的數(shù)字<b class='flag-5'>接口</b>的<b class='flag-5'>時鐘</b>邊沿延遲補償

    記一次JSF異步調用引起的接口可用率降低

    前言 本文記錄了由于JSF異步調用超時引起的接口可用率降低問題的排查過程,主要介紹了排查思路和JSF異步調用的流程,希望可以幫助大家了解JSF的異步調用原理以及提供一些問題排查思路。本
    的頭像 發(fā)表于 08-05 13:40 ?298次閱讀
    記一次JSF<b class='flag-5'>異步</b>調用引起的<b class='flag-5'>接口</b>可用率降低

    開源芯片系列講座第22期:異步電路機制為RISC-V處理器賦能

    隨著芯片規(guī)模增大和半導體工藝進步,同步電路時鐘所帶來的問題日益突出。與其相比,異步電路不依賴全局時鐘,通過
    的頭像 發(fā)表于 07-31 08:37 ?451次閱讀
    開源芯片系列講座第22期:<b class='flag-5'>異步</b><b class='flag-5'>電路</b>機制為RISC-V處理器賦能

    異步置零和同步置零的區(qū)別在哪里

    異步置零和同步置零是數(shù)字電路設計中兩種不同的置零方法。它們在實現(xiàn)方式、性能和應用場景上有所不同。 實現(xiàn)方式: 異步置零:異步置零是指在數(shù)字電路
    的頭像 發(fā)表于 07-23 11:09 ?2697次閱讀

    同步電路異步電路怎么判斷正負極

    統(tǒng)一的時鐘信號進行工作,各個部分的輸出與輸入之間存在固定的時序關系。同步電路通常用于數(shù)據(jù)傳輸、存儲器、處理器等高速電子系統(tǒng)中。 異步電路(A
    的頭像 發(fā)表于 07-22 17:37 ?575次閱讀

    同步電路異步電路的優(yōu)缺點

    同步電路異步電路是數(shù)字電路設計中的兩種基本類型。它們在設計方法、性能、功耗、可靠性等方面存在顯著差異。 同步電路 定義 同步
    的頭像 發(fā)表于 07-22 17:35 ?1600次閱讀

    同步電路異步電路的優(yōu)缺點有哪些

    同步電路異步電路是數(shù)字電路設計中的兩種基本類型,它們在設計方法、性能特點和應用領域等方面存在顯著差異。 同步電路 定義 同步
    的頭像 發(fā)表于 07-22 17:01 ?1376次閱讀

    直播預告 |開源芯片系列講座第22期:異步電路機制為RISC-V處理器賦能

    簡介隨著芯片規(guī)模增大和半導體工藝進步,同步電路時鐘所帶來的問題日益突出。與其相比,異步電路不依賴全局時鐘,通過
    的頭像 發(fā)表于 07-18 08:37 ?356次閱讀
    直播預告 |開源芯片系列講座第22期:<b class='flag-5'>異步</b><b class='flag-5'>電路</b>機制為RISC-V處理器賦能

    FPGA異步信號處理方法

    FPGA(現(xiàn)場可編程門陣列)在處理異步信號時,需要特別關注信號的同步化、穩(wěn)定性以及潛在的亞穩(wěn)態(tài)問題。由于異步信號可能來自不同的時鐘域或外部設備,其到達時間和頻率可能不受FPGA內(nèi)部時鐘
    的頭像 發(fā)表于 07-17 11:10 ?1294次閱讀

    verilog同步和異步的區(qū)別 verilog阻塞賦值和非阻塞賦值的區(qū)別

    Verilog中同步和異步的區(qū)別,以及阻塞賦值和非阻塞賦值的區(qū)別。 一、Verilog中同步和異步的區(qū)別 同步傳輸和異步傳輸是指數(shù)據(jù)在電路中傳輸?shù)膬煞N方式,它們
    的頭像 發(fā)表于 02-22 15:33 ?1841次閱讀