在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

跨異步時(shí)鐘域處理方法大全

FPGA設(shè)計(jì)論壇 ? 來(lái)源:FPGA設(shè)計(jì)論壇 ? 2025-05-14 15:33 ? 次閱讀

方法1 雙觸發(fā)器(打2拍)

該方法只用于慢到快時(shí)鐘域的1bit信號(hào)傳遞。在Xilinx器件中,可以使用(* ASYNC_REG = "TRUE" *)標(biāo)記,將兩個(gè)寄存器盡量靠近綜合,降低 亞穩(wěn)態(tài)因?qū)Ь€延遲太大而傳播到第二個(gè)寄存器的可能性。

moduleff2(  input clk0,//10Minput din,  input clk1,//100Moutputdout );  regdin_r=1'd0;   (* ASYNC_REG ="TRUE"*)  regr0=1'd0;   (* ASYNC_REG ="TRUE"*)  regr1=1'd0;  assigndout = r1;  always@(posedgeclk0)     din_r <= din;//由于不確定前級(jí)是否有觸發(fā)器,這里默認(rèn)加一級(jí)寄存,防止出現(xiàn)毛刺always@(posedge?clk1)begin? ? ?r0 ? ?<= din_r; ? ? ? ? r1 ? ?<= r0; ? ?endendmodule

方法2 雙向握手 傳遞信號(hào)

雙向握手方法使用了5個(gè)觸發(fā)器,右邊3個(gè)與方法1一致。左邊兩個(gè)用于將確認(rèn)信號(hào)同步到寫(xiě)時(shí)鐘域。用戶必須將信號(hào)保持到確認(rèn)信號(hào)置高。
該方法適用于慢到快快到慢1bit信號(hào)傳遞,一般而言,信號(hào)有效值為高電平。

c44907a8-2c8d-11f0-9310-92fbcf53809c.png
可以用一個(gè)非門(mén)、一個(gè)異或門(mén)、一個(gè)與門(mén),和一個(gè)觸發(fā)器(下圖中的reg-2)實(shí)現(xiàn)信號(hào)保持,輸入低速單脈沖,但是不保證輸出單脈沖,可以在輸出端加一個(gè)寄存器,用于上升沿判斷.
c45bc8b6-2c8d-11f0-9310-92fbcf53809c.png
verilog可以用一些簡(jiǎn)單的判斷來(lái)保持信號(hào)。下面是一個(gè)單向信號(hào)異步橋,支持單脈沖輸入,單脈沖輸出,時(shí)鐘速率無(wú)限制
使用時(shí),確保在active置低時(shí),將s_vld給異步橋。

/* *  Name : 單向信號(hào)異步橋 *  Origin: 230406 *  EE  : hel */modulesignalbridge_async(  inputwire        s_clk  ,  inputwire        s_rstn ,  inputwire        s_vld  ,// pulse inputinputwire        d_clk  ,  inputwire        d_rstn ,  outputreg        d_vld  ,// pulse outputoutputwire        active  );reg[1 :0] s_syncer ;reg[1 :0] d_syncer ;wire    ack_d2 = s_syncer[1];wire    req_d2 = d_syncer[1];  reg     req_d3;reg     async_req;wire    async_ack = req_d2;assign   active = async_req | ack_d2 ;// Source clock domainalways@(posedges_clkornegedges_rstn)beginif(!s_rstn)begin    s_syncer  <=?2'd0; ? ?endelsebegin? ? ? ? ?s_syncer ? <= ?{s_syncer[0],async_ack}; ? ?endendalways?@(posedge?s_clk?ornegedge?s_rstn)?beginif?(!s_rstn)?begin? ? ? ? ?async_req ? <=?1'd0; ? ?endelseif(ack_d2)begin? ? ? ? ?async_req ? <=?1'd0; ? ?endelseif(s_vld)begin? ? ? ? ?async_req ? <=?1'd1; ? ?endend// Destination clock domainalways?@(posedge?d_clk?ornegedge?d_rstn)?beginif?(!d_rstn)?begin? ? ? ? ?d_syncer ? <=?2'd0; ? ?endelsebegin? ? ? ? ?d_syncer ? <= ?{d_syncer[0],async_req}; ? ?endendalways?@(posedge?d_clk?ornegedge?d_rstn)?beginif?(!d_rstn)?begin? ? ? ? ?req_d3 ? ? ?<=?1'd0; ? ? ? ? d_vld ? ? ? <=?1'd0; ? ?endelsebegin? ? ? ? ?req_d3 ? ? ?<= req_d2; ? ? ? ? d_vld ? ? ? <= req_d2 & (~req_d3); ? ?endendendmodule

方法3 雙向握手 傳遞數(shù)據(jù)

可以使用請(qǐng)求信號(hào)采樣跨時(shí)鐘域過(guò)來(lái)的多比特?cái)?shù)據(jù),就可以做到數(shù)據(jù)的跨時(shí)鐘域了(數(shù)據(jù)跨時(shí)鐘域,頻率低到高,高到低)如下圖:

c46cca8a-2c8d-11f0-9310-92fbcf53809c.png
圖里沒(méi)有畫(huà)反饋信號(hào),數(shù)據(jù)需要在目的時(shí)鐘采樣時(shí)保持穩(wěn)定。這種單個(gè)數(shù)據(jù)跨時(shí)鐘域傳輸?shù)木帉?xiě)流程如下:

原時(shí)鐘域置高req,置好data

目的時(shí)鐘域?qū)eq打兩拍變成req_d2

目的時(shí)鐘域檢測(cè)到req_d2置高,將data打到寄存器內(nèi),并將ack置高

原時(shí)鐘域檢測(cè)到ack_d2被置高,拉低req

目的時(shí)鐘域檢測(cè)到req_d2被拉低,將ack拉低

通過(guò)上述流程編寫(xiě)的數(shù)據(jù)異步橋如下:
支持單個(gè)數(shù)據(jù)輸入輸出,時(shí)鐘速率無(wú)限制。使用時(shí),確保在active置低時(shí),將s_din和s_vld給異步橋,s_vld必須為單脈沖。

/* *  Name : 單向數(shù)據(jù)異步橋 *  Origin: 230404 *  EE  : hel */moduledatabridge_async #(  parameterDW =8)(  inputwire        s_clk  ,  inputwire        s_rstn ,  inputwire  [DW-1:0]  s_din  ,  inputwire        s_vld  ,// pulse inputinputwire        d_clk  ,  inputwire        d_rstn ,  outputreg  [DW-1:0]  d_dout ,  outputreg        d_vld  ,// pulse outputoutputwire        active  );reg[1 :0] s_syncer ;reg[1 :0] d_syncer ;wire    ack_d2 = s_syncer[1];wire    req_d2 = d_syncer[1];  reg     req_d3;reg[DW-1:0] async_dat;reg     async_req;wire    async_ack = req_d2;assign   active = async_req | ack_d2 ;// Source clock domainalways@(posedges_clkornegedges_rstn)beginif(!s_rstn)begin    s_syncer  <=?2'd0; ? ?endelsebegin? ? ? ? ?s_syncer ? <= ?{s_syncer[0],async_ack}; ? ?endendalways?@(posedge?s_clk?ornegedge?s_rstn)?beginif?(!s_rstn)?begin? ? ? ? ?async_dat ? <= {DW{1'd0}}; ? ?endelseif(s_vld && (!active))begin? ? ? ? ?async_dat ? <= ?s_din; ? ?endendalways?@(posedge?s_clk?ornegedge?s_rstn)?beginif?(!s_rstn)?begin? ? ? ? ?async_req ? <=?1'd0; ? ?endelseif(ack_d2)begin? ? ? ? ?async_req ? <=?1'd0; ? ?endelseif(s_vld)begin? ? ? ? ?async_req ? <=?1'd1; ? ?endend// Destination clock domainalways?@(posedge?d_clk?ornegedge?d_rstn)?beginif?(!d_rstn)?begin? ? ? ? ?d_syncer ? <=?2'd0; ? ?endelsebegin? ? ? ? ?d_syncer ? <= ?{d_syncer[0],async_req}; ? ?endendalways?@(posedge?d_clk?ornegedge?d_rstn)?beginif?(!d_rstn)?begin? ? ? ? ?d_dout ? ? ?<= {DW{1'd0}}; ? ?endelseif(req_d2)begin? ? ? ? ?d_dout ? ? ?<= async_dat; ? ?endendalways?@(posedge?d_clk?ornegedge?d_rstn)?beginif?(!d_rstn)?begin? ? ? ? ?req_d3 ? ? ?<=?1'd0; ? ? ? ? d_vld ? ? ? <=?1'd0; ? ?endelsebegin? ? ? ? ?req_d3 ? ? ?<= req_d2; ? ? ? ? d_vld ? ? ? <= req_d2 & (~req_d3); ? ?endendendmodule

testbench:

`timescale1ns/1psmoduledatabridge_async_tb ();parameterDW =8;regs_clk =0;regs_rstn =0;reg[DW-1:0] s_din =0;regs_vld =0;regd_clk =0;regd_rstn =0;wire[DW-1:0] d_dout;wired_vld;wireactive;reg[DW-1:0]buffer ;realts;realtd;reala;realb;realclkstp;always#(ts) s_clk <= ~s_clk;always#(td)? d_clk <= ~d_clk; databridge_async?#(DW)?databridge_async ( ? ?.s_clk? ?( s_clk ?), ? ?.s_rstn? ( s_rstn ), ? ?.s_din? ?( s_din ?), ? ?.s_vld? ?( s_vld ?), ? ?.d_clk? ?( d_clk ?), ? ?.d_rstn? ( d_rstn ), ? ?.d_dout? ( d_dout ), ? ?.d_vld? ?( d_vld ?), ? ?.active? ( active ) );taskautomatic?gen_trans;input?[DW-1:0]data;begin? ? ?#0? ? ?s_vld ?= ?1; ? ? s_din ?= data; ? ? @(posedge?s_clk); ? ? #0? ? ?s_vld ?= ?0; ? ? s_din ?= ?0;endendtask//automatictaskautomatic?wait_busy;begin? ? ?@(posedge?s_clk);#0; ? ?while?(active)?begin? ? ? ? ?@(posedge?s_clk);#0; ? ?endendendtask//automatictaskautomatic?loop_test;inputinteger?n;integer?i;reg?[63:0]random_dat;beginfor?(i =?0;i

方法4 轉(zhuǎn)為獨(dú)熱碼或格雷碼

如果多bit信號(hào)是簡(jiǎn)單連續(xù)變化(連續(xù)加一或減一),可以將其轉(zhuǎn)為格雷碼,再打2拍到目標(biāo)時(shí)鐘域,最終再解碼為二進(jìn)制編碼。

如果多bit信號(hào)沒(méi)有變化規(guī)律,可以將其轉(zhuǎn)為獨(dú)熱碼,再打2拍到目標(biāo)時(shí)鐘域,最終再解碼為二進(jìn)制編碼。該方法適用于慢到快多bit信號(hào)傳遞。

為什么data不能直接通過(guò)同步器過(guò)域:
c478739e-2c8d-11f0-9310-92fbcf53809c.jpg
多比特?cái)?shù)據(jù)由于存在傳輸路徑延遲,到達(dá)同步器有先后順序,導(dǎo)致同步器采樣到不同電平,輸出錯(cuò)誤數(shù)據(jù)。
根本原因是源端數(shù)據(jù)有多個(gè)bit發(fā)生跳變。如果每次只有一個(gè)bit跳變(連續(xù)變化格雷碼、獨(dú)熱碼),就一定能采樣到正確的數(shù)據(jù)。
假如目的時(shí)鐘非常慢,比原時(shí)鐘慢很多,在慢時(shí)鐘上升沿時(shí)還是能采到正確數(shù)據(jù),可能采到跳變之前的也可能是之后的,但總之都是source的數(shù)據(jù)。如果采到跳變之前的數(shù)據(jù),就會(huì)產(chǎn)生異步FIFO的虛空虛滿。從這個(gè)角度看,異步FIFO是絕對(duì)安全的(忽略同步器失效),異步FIFO兩邊的時(shí)鐘頻率沒(méi)有任何要求。

方法5 深度為2的ASYNC-FIFO

在傳輸信號(hào),不需要較高帶寬時(shí),可以將普通格雷碼異步FIFO特化為2-deep ASYNC-FIFO,該方法適用于慢到快快到慢多bit信號(hào)傳遞。一般很少使用2deep-FIFO,而是使用雙向握手來(lái)傳遞單個(gè)多比特?cái)?shù)據(jù)。
c4822e0c-2c8d-11f0-9310-92fbcf53809c.png

方法6 ASYNC-FIFO

該方法適用于慢到快快到慢多bit數(shù)據(jù)傳遞。

moduleasync_fifo//(First_Word_Fall_Through FIFO,數(shù)據(jù)提前輸出,可能不利于時(shí)序收斂)#(  parameterintegerDATA_WIDTH =16,  parameterintegerADDR_WIDTH =8//深度只能是2**ADDR_WIDTH) (  inputwire        wr_rst ,    inputwire        wr_clk ,    inputwire        wr_ena ,    inputwire[DATA_WIDTH-1:0] wr_dat ,   outputwire        wr_full ,  inputwire        rd_rst ,   inputwire        rd_clk ,    inputwire        rd_ena ,    outputwire[DATA_WIDTH-1:0] rd_dat ,   outputwire        rd_empty );reg [DATA_WIDTH-1:0]mem[0:2**ADDR_WIDTH-1];reg [ADDR_WIDTH :0]wrptr;reg [ADDR_WIDTH :0]rdptr;wire[ADDR_WIDTH-1:0]wraddr = wrptr[ADDR_WIDTH-1:0];wire[ADDR_WIDTH-1:0]rdaddr = rdptr[ADDR_WIDTH-1:0];wire[ADDR_WIDTH :0]wrptr_gray = (wrptr>>1)^wrptr;wire[ADDR_WIDTH :0]rdptr_gray = (rdptr>>1)^rdptr;reg [ADDR_WIDTH :0]wrptr_gray_r0;reg [ADDR_WIDTH :0]wrptr_gray_r1;reg [ADDR_WIDTH :0]rdptr_gray_r0;reg [ADDR_WIDTH :0]rdptr_gray_r1;assignwr_full = (wrptr_gray == {~rdptr_gray_r1[ADDR_WIDTH:ADDR_WIDTH-1],rdptr_gray_r1[ADDR_WIDTH-2:0]});assignrd_empty = (rdptr_gray == wrptr_gray_r1);//在有些設(shè)計(jì)中,full和empty提早一個(gè)時(shí)鐘出現(xiàn),并加了一級(jí)寄存,這有助于收斂always@(posedgewr_clkorposedgewr_rst)beginif(wr_rst)begin    rdptr_gray_r0 <=?'d0; ? ? ? ? rdptr_gray_r1 <=?'d0; ? ?endelsebegin? ? ? ? ?rdptr_gray_r0 <= rdptr_gray; ? ? ? ? rdptr_gray_r1 <= rdptr_gray_r0; ? ?endendalways?@(posedge?rd_clk?orposedge?rd_rst)?beginif?(rd_rst)?begin? ? ? ? ?wrptr_gray_r0 <=?'d0; ? ? ? ? wrptr_gray_r1 <=?'d0; ? ?endelsebegin? ? ? ? ?wrptr_gray_r0 <= wrptr_gray; ? ? ? ? wrptr_gray_r1 <= wrptr_gray_r0; ? ?endendalways?@(posedge?wr_clk?orposedge?wr_rst)?beginif?(wr_rst)?begin? ? ? ? ?mem[0] ? ? ?<=?'d0; ? ? ? ? wrptr ? ? ? <=?'d0; ? ?endelseif?(wr_ena&&(!wr_full))?begin? ? ? ? ?mem[wraddr] <= wr_dat; ? ? ? ? wrptr ? ? ? <= wrptr +?1'd1; ? ?endelsebegin? ? ? ? ?mem[wraddr] <= mem[wraddr]; ? ? ? ? wrptr ? ? ? <= wrptr; ? ?endendalways?@(posedge?rd_clk?orposedge?rd_rst)?beginif?(rd_rst)?begin? ? ? ? ?rdptr ? ? ? <=?'d0; ? ?endelseif?(rd_ena&&(!rd_empty))?begin? ? ? ? ?rdptr ? ? ? <= rdptr +?1'd1; ? ?endelsebegin? ? ? ? ?rdptr ? ? ? <= rdptr; ? ?endendassign?rd_dat = mem[rdaddr];endmodule

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

    關(guān)注

    31

    文章

    5425

    瀏覽量

    123559
  • Xilinx
    +關(guān)注

    關(guān)注

    73

    文章

    2183

    瀏覽量

    124488
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    2033

    瀏覽量

    61930
  • 時(shí)鐘域
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    9738

原文標(biāo)題:跨異步時(shí)鐘域的6種方法

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    關(guān)于時(shí)鐘信號(hào)的處理方法

    我在知乎看到了多bit信號(hào)時(shí)鐘的問(wèn)題,于是整理了一下自己對(duì)于時(shí)鐘信號(hào)的處理
    的頭像 發(fā)表于 10-09 10:44 ?6998次閱讀

    如何處理好FPGA設(shè)計(jì)中時(shí)鐘問(wèn)題?

    以手到擒來(lái)。這里介紹的三種方法時(shí)鐘處理方法如下:打兩拍;
    發(fā)表于 09-22 10:24

    探尋FPGA中三種時(shí)鐘處理方法

    以手到擒來(lái)。這里介紹的三種方法時(shí)鐘處理方法如下:打兩拍;
    發(fā)表于 10-20 09:27

    三種時(shí)鐘處理方法

    的三種方法時(shí)鐘處理方法如下:  1. 打兩拍;  2.
    發(fā)表于 01-08 16:55

    三種FPGA界最常用的時(shí)鐘處理法式

    時(shí)鐘處理方法如下:打兩拍;異步雙口RAM;格雷碼轉(zhuǎn)換。01方法一:打兩拍大家很清楚,
    發(fā)表于 02-21 07:00

    FPGA初學(xué)者的必修課:FPGA時(shí)鐘處理3大方法

    時(shí)鐘處理方法如下:打兩拍;異步雙口RAM;格雷碼轉(zhuǎn)換。01方法一:打兩拍大家很清楚,
    發(fā)表于 03-04 09:22

    如何處理好FPGA設(shè)計(jì)中時(shí)鐘間的數(shù)據(jù)

    介紹3種時(shí)鐘處理方法,這3種方法可以說(shuō)是FPGA界最常用也最實(shí)用的
    發(fā)表于 07-29 06:19

    FPGA界最常用也最實(shí)用的3種時(shí)鐘處理方法

    介紹3種時(shí)鐘處理方法,這3種方法可以說(shuō)是FPGA界最常用也最實(shí)用的
    發(fā)表于 11-15 20:08 ?1.4w次閱讀

    cdc路徑方案幫您解決時(shí)鐘難題

    這一章介紹一下CDC也就是時(shí)鐘可能存在的一些問(wèn)題以及基本的時(shí)鐘
    的頭像 發(fā)表于 11-30 06:29 ?7534次閱讀
    cdc路徑方案幫您解決<b class='flag-5'>跨</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b>難題

    如何解決異步FIFO時(shí)鐘亞穩(wěn)態(tài)問(wèn)題?

    時(shí)鐘的問(wèn)題:前一篇已經(jīng)提到要通過(guò)比較讀寫(xiě)指針來(lái)判斷產(chǎn)生讀空和寫(xiě)滿信號(hào),但是讀指針是屬于讀時(shí)鐘的,寫(xiě)指針是屬于寫(xiě)
    的頭像 發(fā)表于 09-05 14:29 ?6289次閱讀

    揭秘FPGA時(shí)鐘處理的三大方法

    時(shí)鐘處理方法,這三種方法可以說(shuō)是 FPGA 界最常用也最實(shí)用的
    的頭像 發(fā)表于 12-05 16:41 ?1918次閱讀

    介紹3種方法時(shí)鐘處理方法

    介紹3種時(shí)鐘處理方法,這3種方法可以說(shuō)是FPGA界最常用也最實(shí)用的
    的頭像 發(fā)表于 09-18 11:33 ?2.3w次閱讀
    介紹3種<b class='flag-5'>方法</b><b class='flag-5'>跨</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b><b class='flag-5'>處理</b><b class='flag-5'>方法</b>

    三種時(shí)鐘處理方法

    時(shí)鐘處理是FPGA設(shè)計(jì)中經(jīng)常遇到的問(wèn)題,而如何處理時(shí)
    的頭像 發(fā)表于 10-18 09:12 ?9062次閱讀

    時(shí)鐘電路設(shè)計(jì)總結(jié)

    時(shí)鐘操作包括同步時(shí)鐘操作和異步
    的頭像 發(fā)表于 05-18 09:18 ?965次閱讀
    <b class='flag-5'>跨</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b>電路設(shè)計(jì)總結(jié)

    FPGA時(shí)鐘處理方法(二)

    上一篇文章已經(jīng)講過(guò)了單bit時(shí)鐘處理方法,這次解說(shuō)一下多bit的
    的頭像 發(fā)表于 05-25 15:07 ?1276次閱讀
    FPGA<b class='flag-5'>跨</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b><b class='flag-5'>處理</b><b class='flag-5'>方法</b>(二)
    主站蜘蛛池模板: 在线播放91灌醉迷j高跟美女 | 国内真实实拍伦视频在线观看 | 国产手机在线国内精品 | 人人揉揉香蕉大青草 | 天天槽任我槽免费 | 中文字幕一区二区三区乱码aⅴ | 天天操天天干天天 | 在线免费国产 | 色妞影视| 天天综合天天看夜夜添狠狠玩 | 天天色天天操天天 | 三级毛片免费 | 亚洲精品美女在线观看 | 国产色中色 | 成人三级视频 | 国模私拍视频在线观看 | 五月婷婷综合激情网 | 卡一卡二卡三国色天香永不失联 | 亚洲精品午夜久久aaa级久久久 | 四虎最新紧急更新地址 | 狠狠的操 | 婷婷免费高清视频在线观看 | 国产精品三级a三级三级午夜 | bt天堂磁力搜索 | 国产无遮挡床戏视频免费 | 亚洲精品91香蕉综合区 | 国产在线色视频 | 五月天精品在线 | 四虎影院在线观看免费 | 天天干天天色综合 | 国产三级在线视频观看 | 色综合久久丁香婷婷 | 男女草逼视频 | 就去色综合 | 欧美三j片 | 亚洲爱爱图片 | 亚洲精品美女在线观看 | 成人观看天堂在线影片 | yy8090韩国日本三理论免费 | 免费网站啪啪大全 | 亚洲天堂导航 |