什么是同步器
如圖1所示電路結(jié)構(gòu)就叫同步器。左邊為時(shí)鐘域clk1,右邊兩個(gè)FF為時(shí)鐘域clk2,藍(lán)色的為CDC(clock domain cross)路徑。這種電路結(jié)構(gòu)常用于兩個(gè)不同的時(shí)鐘域數(shù)據(jù)傳輸。其實(shí)前面講的異步復(fù)位同步釋放本質(zhì)上也是同步器,只是前面的復(fù)位信號(hào)是復(fù)位端口產(chǎn)生的,不是某個(gè)寄存器打拍過來的,異步復(fù)位信號(hào)也可以視作一個(gè)不同時(shí)鐘域的信號(hào)。由此你也可以知道同步器的作用之一就是消除亞穩(wěn)態(tài)。
圖1. 同步器跨時(shí)鐘域圖
用更直觀的代碼告訴大家,就是如下verilog代碼:
reg [ 1:0] d1;
reg [ 1:0] ql;
reg [ 1:0] q2;
always@(posedge clk1)
begin
if(rst == 1'b1) d1 <= 2'h0;
else d1 <= din;
end
always@(posedge clk2)
begin
if(rst == 1'b1) ql <= 2'h0;
else q1 <= d1
end
always@(posedge clk2)
begin
if(rst == 1'b1) q2 <= 2'h0;
else q2 <= q1;
end
亞穩(wěn)態(tài)及其傳播
重點(diǎn)!
通過兩級(jí)寄存器,即使產(chǎn)生亞穩(wěn)態(tài)也在兩個(gè)寄存器之間,降低傳遞到后級(jí)的概率,從而減輕亞穩(wěn)態(tài)對(duì)后級(jí)影響。
理論上,亞穩(wěn)態(tài)產(chǎn)生后持續(xù)時(shí)長(zhǎng)是隨機(jī)的,意味著永遠(yuǎn)持續(xù)下去也是可能的,然而由于實(shí)際電路中存在的噪聲和能量變化等一定會(huì)讓亞穩(wěn)態(tài)很快產(chǎn)生不平衡,迅速向0或者1靠攏。舉個(gè)例子,就像筆尖上放一個(gè)圓球,理論上可以找一個(gè)位置永遠(yuǎn)平衡,然而實(shí)際上由于一點(diǎn)點(diǎn)的震動(dòng)都會(huì)導(dǎo)致圓球迅速掉下去。如圖2所示,在時(shí)鐘發(fā)射沿到來后,亞穩(wěn)態(tài)產(chǎn)生后持續(xù)時(shí)間為Tmet,在捕獲沿到來時(shí),dout的亞穩(wěn)態(tài)已經(jīng)消除,這樣亞穩(wěn)態(tài)就不會(huì)往后級(jí)傳播,也就是說亞穩(wěn)態(tài)在一個(gè)時(shí)鐘周期內(nèi)穩(wěn)定就可以防止往下一級(jí)傳播。實(shí)際中亞穩(wěn)態(tài)的穩(wěn)定都很快。而同步器打2拍就是為了在時(shí)鐘頻率很高的時(shí)候,捕獲沿采到亞穩(wěn)態(tài)向下一級(jí)傳播的時(shí)候,還有一級(jí)寄存器隔離,然亞穩(wěn)態(tài)在一個(gè)時(shí)鐘周期內(nèi)穩(wěn)定下來。
假設(shè),亞穩(wěn)態(tài)在一個(gè)時(shí)鐘周期內(nèi)穩(wěn)定不下來的概率為P,0
圖2. 亞穩(wěn)態(tài)產(chǎn)生過程
同步器同步n bit數(shù)據(jù)
當(dāng)n=1時(shí),參見上面的亞穩(wěn)態(tài)傳播,1bit數(shù)據(jù)產(chǎn)生亞穩(wěn)態(tài)以后就算錯(cuò)了也是變成0或者1第二拍也會(huì)正確,所以同步1bit數(shù)據(jù)可以采后面幾拍的數(shù)據(jù),這樣就能保證采集過來的數(shù)據(jù)是正確的,后面會(huì)試驗(yàn)給大家看。當(dāng)然,要實(shí)現(xiàn)這點(diǎn)首先是快時(shí)鐘必須是慢時(shí)鐘的好幾倍才行,至少2倍。
多bit數(shù)據(jù)傳輸和1bit數(shù)據(jù)唯一的區(qū)別就是多路對(duì)齊,保證每一路數(shù)據(jù)延遲一致 ,這樣就和傳輸1bit數(shù)據(jù)一樣了。下面給大家推薦一個(gè)約束set_bus_skew,可以約束一條總線上每根線的延遲相差不大。
命令用法——set_bus_skew [-from 寄存器名] [-to 寄存器名] xx ns。比如在圖3中約束src_gray_ff_reg到dest_graysync_ff_reg之間的兩根線延遲保持一致,完整命令如下,保證兩根線延遲都在2.5ns,一個(gè)快時(shí)鐘域周期:
set_bus_skew -from [get_cells src_gray_ff_reg[ ]] -to [get_cells {dest_graysync_ff_reg[0][ ]}] 2.500
圖3. 寄存器圖
同步器傳輸數(shù)據(jù)的情景分析
情景1
同步器只能正確處理同源的兩個(gè)時(shí)鐘域之間的信號(hào),如果不同源,很可能出現(xiàn)發(fā)射沿打出的數(shù)據(jù)還沒穩(wěn)定就被捕獲沿采集到,這樣數(shù)據(jù)就會(huì)出錯(cuò)。
情景2
兩個(gè)時(shí)鐘域的頻率不能太接近,且快時(shí)鐘最好是慢時(shí)鐘的整數(shù)倍,這樣保證邊沿不會(huì)出現(xiàn)捕獲沿不在數(shù)據(jù)不穩(wěn)定的時(shí)候出現(xiàn),不然會(huì)采錯(cuò)數(shù)據(jù)。
下圖是100M和96.34M時(shí)鐘用同步器采集的結(jié)果,err和err1為高電平都是代表數(shù)據(jù)有錯(cuò)的時(shí)候。可以發(fā)現(xiàn)數(shù)據(jù)出錯(cuò)頻繁,而且間隔不均等,本質(zhì)上就是因?yàn)閮蓚€(gè)時(shí)鐘的相位關(guān)系不是像整數(shù)倍一樣規(guī)律,很可能出現(xiàn)捕獲沿采集不穩(wěn)定數(shù)據(jù)。其實(shí)小數(shù)倍的時(shí)候,小數(shù)位數(shù)越多越容易出現(xiàn)這種問題。
圖4. 時(shí)鐘頻率不匹配導(dǎo)致錯(cuò)誤
情景3
快時(shí)鐘最好是慢時(shí)鐘的整數(shù)倍的時(shí)候,不加約束也可以有方法比較穩(wěn)定的正確抓取數(shù)據(jù) 。
下圖是50M時(shí)鐘到200M時(shí)鐘跨時(shí)鐘域同步的結(jié)果,沒有加約束,大家可以看到數(shù)據(jù)在從0x4ef到0x4f0過度的時(shí)候第一拍出錯(cuò)了,出現(xiàn)了1個(gè)0x4f1,而后面的三拍數(shù)據(jù)是對(duì)的,看后面出錯(cuò)的數(shù)據(jù)也是這樣,也就是說,每采集到的4個(gè)數(shù)里面,用出現(xiàn)次數(shù)多的數(shù)覆蓋次數(shù)少的數(shù)就可以了,因?yàn)樵臼?倍關(guān)系,所以理論上連續(xù)的4個(gè)數(shù)是要一致的。
如下圖在兩個(gè)位置的總線都加了set_bus_skew約束5ns后,采集的數(shù)據(jù)一直沒有出錯(cuò),也根本不用覆蓋的方法去剔除錯(cuò)誤數(shù)據(jù)了。
正確傳輸條件總結(jié):
- 只能慢時(shí)鐘到快時(shí)鐘
- 兩時(shí)鐘域必須同源
- 兩時(shí)鐘最好是整數(shù)倍關(guān)系,否則正確與否只能隨緣
- (可選)滿足以上3點(diǎn)情況下,添加set_bus_skew可以保證每次采樣都正確
-
寄存器
+關(guān)注
關(guān)注
31文章
5295瀏覽量
119823 -
CDC
+關(guān)注
關(guān)注
0文章
57瀏覽量
17747 -
同步器
+關(guān)注
關(guān)注
1文章
92瀏覽量
14597 -
時(shí)鐘域
+關(guān)注
關(guān)注
0文章
51瀏覽量
9524
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論