開篇立論
跨時(shí)鐘域信號的打拍處理往往用于單比特信號或類似于格林碼這種信號的跨時(shí)鐘域處理。其邏輯電路很簡單。SpinalHDL提供了BufferCC用于實(shí)現(xiàn)這種跨時(shí)鐘域打拍處理方式:
在日常的電路設(shè)計(jì)里,計(jì)數(shù)器是常見的DFX信號,有些情況下需要將一個(gè)時(shí)鐘域的DFX信號轉(zhuǎn)換到另一個(gè)時(shí)鐘域進(jìn)行HPI讀取,這種情況也可以通過打拍進(jìn)行處理,不過前提是需轉(zhuǎn)換成格林碼,如此在源時(shí)鐘域和目的時(shí)鐘域需分別做一次轉(zhuǎn)換與反轉(zhuǎn)換。但如果計(jì)數(shù)器采用格林碼進(jìn)行計(jì)數(shù)則可以少進(jìn)行一次轉(zhuǎn)換。SpinalHDL有提供一個(gè)GrayCounter方法用于生成格林碼計(jì)數(shù)器:
除了StreamCCByToggle,SpinalHDL里還有一個(gè)FlowCCByToggle。由于Flow類型沒有反壓,因而從低時(shí)鐘域向高時(shí)鐘域進(jìn)行傳輸則沒什么問題,但從高時(shí)鐘域向低時(shí)鐘域進(jìn)行轉(zhuǎn)換則存在丟失數(shù)據(jù)的風(fēng)險(xiǎn)。
FIFO跨時(shí)鐘域緩存
對于高吞吐的多比特信號跨時(shí)鐘域處理,則往往采用FIFO的形式進(jìn)行處理。在SpinalHDL里則有StreamFifoCC供使用:
每一個(gè)做數(shù)字邏輯的都繞不開跨時(shí)鐘域處理,談一談SpinalHDL里用于跨時(shí)鐘域處理的一些手段方法。
打拍處理跨時(shí)鐘域信號的打拍處理往往用于單比特信號或類似于格林碼這種信號的跨時(shí)鐘域處理。其邏輯電路很簡單。SpinalHDL提供了BufferCC用于實(shí)現(xiàn)這種跨時(shí)鐘域打拍處理方式:
BufferCC(input: T, init: T = null, bufferDepth: Int = 2)
bufferDepth可用于指定打拍級數(shù)。input信號的時(shí)鐘域?yàn)樵磿r(shí)鐘域,BUfferCC調(diào)用的地方的時(shí)鐘域?yàn)槟康臅r(shí)鐘域。在日常的電路設(shè)計(jì)里,計(jì)數(shù)器是常見的DFX信號,有些情況下需要將一個(gè)時(shí)鐘域的DFX信號轉(zhuǎn)換到另一個(gè)時(shí)鐘域進(jìn)行HPI讀取,這種情況也可以通過打拍進(jìn)行處理,不過前提是需轉(zhuǎn)換成格林碼,如此在源時(shí)鐘域和目的時(shí)鐘域需分別做一次轉(zhuǎn)換與反轉(zhuǎn)換。但如果計(jì)數(shù)器采用格林碼進(jìn)行計(jì)數(shù)則可以少進(jìn)行一次轉(zhuǎn)換。SpinalHDL有提供一個(gè)GrayCounter方法用于生成格林碼計(jì)數(shù)器:
GrayCounter(width: Int, enable: Bool)
提供一個(gè)小demo,GtayCounter+BufferCC:

:Bool,clockIn:ClockDomain,clockOut:ClockDomain):Bool
握手處理
對于吞吐要求不是特別高的場合,跨時(shí)鐘域信號采用握手形式進(jìn)行處理也是一種不錯的選擇。SpinalHDL有兩個(gè)抽象類型個(gè)人一直很喜歡:Stream,F(xiàn)low。這兩種形式基本囊括了所有的信號交互行為,其也可以說是SpinalHDL lib庫的基石。針對跨時(shí)鐘域的握手處理,SpinalHDL有一個(gè)StreamCCByToggle可以使用:
StreamCCByToggle(input: Stream[T], inputClock: ClockDomain, outputClock: ClockDomain): Stream[T]
其輸入?yún)?shù)包含源時(shí)鐘域信號,源時(shí)鐘域,目的時(shí)鐘域,其返回一個(gè)目的時(shí)鐘域的Stream信號:

除了StreamCCByToggle,SpinalHDL里還有一個(gè)FlowCCByToggle。由于Flow類型沒有反壓,因而從低時(shí)鐘域向高時(shí)鐘域進(jìn)行傳輸則沒什么問題,但從高時(shí)鐘域向低時(shí)鐘域進(jìn)行轉(zhuǎn)換則存在丟失數(shù)據(jù)的風(fēng)險(xiǎn)。
FIFO跨時(shí)鐘域緩存
對于高吞吐的多比特信號跨時(shí)鐘域處理,則往往采用FIFO的形式進(jìn)行處理。在SpinalHDL里則有StreamFifoCC供使用:
val myFifo = StreamFifoCC(dataType = Bits(8 bits),depth = 128,pushClock = clockA,popClock = clockB)<< streamAmyFifo.io.pop>>streamB
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
信號處理
+關(guān)注
關(guān)注
49文章
1160瀏覽量
105267 -
時(shí)鐘
+關(guān)注
關(guān)注
11文章
2000瀏覽量
135276 -
數(shù)字邏輯
+關(guān)注
關(guān)注
0文章
74瀏覽量
17540
原文標(biāo)題:跨時(shí)鐘域那點(diǎn)事兒
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
關(guān)于跨時(shí)鐘域信號的處理方法
我在知乎看到了多bit信號跨時(shí)鐘的問題,于是整理了一下自己對于跨時(shí)鐘域信號的
如何處理好FPGA設(shè)計(jì)中跨時(shí)鐘域間的數(shù)據(jù)
跨時(shí)鐘域處理是FPGA設(shè)計(jì)中經(jīng)常遇到的問題,而如何處理好跨時(shí)
發(fā)表于 07-29 06:19
看看Stream信號里是如何做跨時(shí)鐘域握手的
一些,適用于追求高吞吐的場景。寫在最后邏輯處理里很多總線都是基于Stream這種信號來實(shí)現(xiàn)的(如AXI4家族),通過上面的方法,可以很容易根
發(fā)表于 07-07 17:25
FPGA界最常用也最實(shí)用的3種跨時(shí)鐘域處理的方法
跨時(shí)鐘域處理是FPGA設(shè)計(jì)中經(jīng)常遇到的問題,而如何處理好跨時(shí)
發(fā)表于 11-15 20:08
?1.5w次閱讀
揭秘FPGA跨時(shí)鐘域處理的三大方法
跨時(shí)鐘域處理是 FPGA 設(shè)計(jì)中經(jīng)常遇到的問題,而如何處理好跨
SpinalHDL里時(shí)鐘域中的定制與命名
聊一聊在SpinalHDL里時(shí)鐘域中時(shí)鐘的定制與命名。 相較于Verilog,在SpinalHDL
基于FPGA的跨時(shí)鐘域信號處理——MCU
問題,不過請注意,今后的這些關(guān)于異步信號處理的文 章里將會重點(diǎn)從工程實(shí)踐的角度出發(fā),以一些特權(quán)同學(xué)遇到過的典型案例的設(shè)計(jì)為依托,從代碼的角度來剖析一些特權(quán)同學(xué)認(rèn)為經(jīng)典的
發(fā)表于 11-01 16:24
?11次下載
SpinalHDL里用于跨時(shí)鐘域處理的一些手段方法
評論