什么是同步器
如圖1所示電路結構就叫同步器。左邊為時鐘域clk1,右邊兩個FF為時鐘域clk2,藍色的為CDC(clock domain cross)路徑。這種電路結構常用于兩個不同的時鐘域數據傳輸。其實前面講的異步復位同步釋放本質上也是同步器,只是前面的復位信號是復位端口產生的,不是某個寄存器打拍過來的,異步復位信號也可以視作一個不同時鐘域的信號。由此你也可以知道同步器的作用之一就是消除亞穩態。
圖1. 同步器跨時鐘域圖
用更直觀的代碼告訴大家,就是如下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
亞穩態及其傳播
重點!
通過兩級寄存器,即使產生亞穩態也在兩個寄存器之間,降低傳遞到后級的概率,從而減輕亞穩態對后級影響。
理論上,亞穩態產生后持續時長是隨機的,意味著永遠持續下去也是可能的,然而由于實際電路中存在的噪聲和能量變化等一定會讓亞穩態很快產生不平衡,迅速向0或者1靠攏。舉個例子,就像筆尖上放一個圓球,理論上可以找一個位置永遠平衡,然而實際上由于一點點的震動都會導致圓球迅速掉下去。如圖2所示,在時鐘發射沿到來后,亞穩態產生后持續時間為Tmet,在捕獲沿到來時,dout的亞穩態已經消除,這樣亞穩態就不會往后級傳播,也就是說亞穩態在一個時鐘周期內穩定就可以防止往下一級傳播。實際中亞穩態的穩定都很快。而同步器打2拍就是為了在時鐘頻率很高的時候,捕獲沿采到亞穩態向下一級傳播的時候,還有一級寄存器隔離,然亞穩態在一個時鐘周期內穩定下來。
假設,亞穩態在一個時鐘周期內穩定不下來的概率為P,0
圖2. 亞穩態產生過程
同步器同步n bit數據
當n=1時,參見上面的亞穩態傳播,1bit數據產生亞穩態以后就算錯了也是變成0或者1第二拍也會正確,所以同步1bit數據可以采后面幾拍的數據,這樣就能保證采集過來的數據是正確的,后面會試驗給大家看。當然,要實現這點首先是快時鐘必須是慢時鐘的好幾倍才行,至少2倍。
多bit數據傳輸和1bit數據唯一的區別就是多路對齊,保證每一路數據延遲一致 ,這樣就和傳輸1bit數據一樣了。下面給大家推薦一個約束set_bus_skew,可以約束一條總線上每根線的延遲相差不大。
命令用法——set_bus_skew [-from 寄存器名] [-to 寄存器名] xx ns。比如在圖3中約束src_gray_ff_reg到dest_graysync_ff_reg之間的兩根線延遲保持一致,完整命令如下,保證兩根線延遲都在2.5ns,一個快時鐘域周期:
set_bus_skew -from [get_cells src_gray_ff_reg[ ]] -to [get_cells {dest_graysync_ff_reg[0][ ]}] 2.500
圖3. 寄存器圖
同步器傳輸數據的情景分析
情景1
同步器只能正確處理同源的兩個時鐘域之間的信號,如果不同源,很可能出現發射沿打出的數據還沒穩定就被捕獲沿采集到,這樣數據就會出錯。
情景2
兩個時鐘域的頻率不能太接近,且快時鐘最好是慢時鐘的整數倍,這樣保證邊沿不會出現捕獲沿不在數據不穩定的時候出現,不然會采錯數據。
下圖是100M和96.34M時鐘用同步器采集的結果,err和err1為高電平都是代表數據有錯的時候。可以發現數據出錯頻繁,而且間隔不均等,本質上就是因為兩個時鐘的相位關系不是像整數倍一樣規律,很可能出現捕獲沿采集不穩定數據。其實小數倍的時候,小數位數越多越容易出現這種問題。
圖4. 時鐘頻率不匹配導致錯誤
情景3
快時鐘最好是慢時鐘的整數倍的時候,不加約束也可以有方法比較穩定的正確抓取數據 。
下圖是50M時鐘到200M時鐘跨時鐘域同步的結果,沒有加約束,大家可以看到數據在從0x4ef到0x4f0過度的時候第一拍出錯了,出現了1個0x4f1,而后面的三拍數據是對的,看后面出錯的數據也是這樣,也就是說,每采集到的4個數里面,用出現次數多的數覆蓋次數少的數就可以了,因為原本是4倍關系,所以理論上連續的4個數是要一致的。
如下圖在兩個位置的總線都加了set_bus_skew約束5ns后,采集的數據一直沒有出錯,也根本不用覆蓋的方法去剔除錯誤數據了。
正確傳輸條件總結:
- 只能慢時鐘到快時鐘
- 兩時鐘域必須同源
- 兩時鐘最好是整數倍關系,否則正確與否只能隨緣
- (可選)滿足以上3點情況下,添加set_bus_skew可以保證每次采樣都正確
-
寄存器
+關注
關注
31文章
5372瀏覽量
121282 -
CDC
+關注
關注
0文章
57瀏覽量
17864 -
同步器
+關注
關注
1文章
98瀏覽量
14723 -
時鐘域
+關注
關注
0文章
52瀏覽量
9582
發布評論請先 登錄
相關推薦
同步器原理電路
![<b class='flag-5'>同步器</b>原理電路](https://file1.elecfans.com//web2/M00/A5/F3/wKgZomUMOvOAZo97AAALgTdb8Us986.jpg)
感應同步器介紹
感應同步器的基本結構
![感應<b class='flag-5'>同步器</b>的基本結構](https://file1.elecfans.com//web2/M00/A5/56/wKgZomUMN_iAOxxEAABdA-wGcKg688.jpg)
感應同步器的工作原理
![感應<b class='flag-5'>同步器</b>的工作原理](https://file1.elecfans.com//web2/M00/A5/56/wKgZomUMN_iAFz99AAAPCmI8o7s363.gif)
感應同步器的應用
![感應<b class='flag-5'>同步器</b>的應用](https://file1.elecfans.com//web2/M00/A5/56/wKgZomUMN_iAcbAUAAAAgZFVsK4593.gif)
評論