杭州專業(yè)網(wǎng)站營銷網(wǎng)絡(luò)營銷的四個特點
?脈沖同步器(快到慢)
描述
sig_a 是 clka(300M)時鐘域的一個單時鐘脈沖信號(高電平持續(xù)一個時鐘clka周期),請設(shè)計脈沖同步電路,將sig_a信號同步到時鐘域 clkb(100M)中,產(chǎn)生sig_b單時鐘脈沖信號(高電平持續(xù)一個時鐘clkb周期)輸出。請用 Verilog 代碼描述。
clka時鐘域脈沖之間的間隔很大,無需考慮脈沖間隔太小的問題。
電路的接口如下圖所示:
輸入描述:
????input?????????????????clka????,?
????input?????????????????clkb????,? ?
????input?????????????????rst_n????????,
????input? ? ? ? ? ? ? ? ?sig_a????????,
輸出描述:
????output???????????????sig_b
解題思路
?在了解脈沖同步器的工作原理之前,我們先來了解“單比特信號同步”的相關(guān)概念:
主要參考以下博文:
“單比特信號同步” 學(xué)習(xí)筆記
單比特信號同步?
概述
- 信號同步的目的是防止新時鐘域中第一級觸發(fā)器的亞穩(wěn)態(tài)信號對下一級邏輯造成影響。簡單的同步器由兩個觸發(fā)器串聯(lián)而成,中間沒有其它組合電路。這種設(shè)計可以保證后面的觸發(fā)器獲得前一個觸發(fā)器輸出時,前一個觸發(fā)器已退出了亞穩(wěn)態(tài),并且其輸出已穩(wěn)定。
信號同步的要求
- 為了使同步工作能正常進(jìn)行,從某個時鐘域傳來的信號應(yīng)先通過原時鐘域上的一個觸發(fā)器,然后不經(jīng)過兩個時鐘域間的任何組合邏輯直接進(jìn)入同步器的第一個觸發(fā)器中。這一要求非常重要,因為同步器的第一級觸發(fā)器對組合邏輯所產(chǎn)生的毛刺非常敏感。如果一個足夠長的毛刺正好滿足建立-保持時間的要求,則同步器的第一級觸發(fā)器會將其放行,給新時鐘域的后續(xù)邏輯送出一個虛假的信號。
同步造成的延時
- 一個經(jīng)同步后的信號在兩個時鐘沿以后就成為新時鐘域中的有效信號。信號的延遲是新時鐘域的一到兩個時鐘周期。一種粗略的估算方法是同步器電路在新時鐘域中造成兩個時鐘周期的延遲,設(shè)計者需要考慮同步延遲對跨時鐘域的信號時序造成的影響。
三種常用的同步器(重點)
- 電平(level signal)同步器
????????在電平同步器中,跨時鐘域的信號在新時鐘域中要保持高電平或低電平兩個時鐘周期以上。同步之后的信號是電平的形式,而該電平所維持的時鐘周期個數(shù)是其在跨時鐘域期間被上升沿檢測到的次數(shù);
? ? ? ? 電平同步器設(shè)計電路如下:
- 邊沿(edge detecting)檢測同步器
? ? ? ? 邊沿檢測同步器在電平同步器的輸出端增加了一個觸發(fā)器。新增觸發(fā)器的輸出經(jīng)反相后和電平同步器的輸出進(jìn)行與操作;
? ? ? ? 該電路會檢測同步器輸入的上升沿,產(chǎn)生一個與時鐘周期等寬、高電平有效的脈沖。
? ? ? ? 如果將與門的兩個輸入端交換使用,就可以構(gòu)成一個檢測輸入信號下降沿的同步器。
????????將與門改為非門可以構(gòu)建一個產(chǎn)生低電平有效脈沖的電路。當(dāng)一個脈沖進(jìn)入更快的時鐘域中時,邊沿檢測同步器可以工作的很好,該電路會產(chǎn)生一個脈沖,用來指示輸入信號上升或下降沿。
? ? ? ? 該電路有一個限制,即輸入脈沖的寬度必須大于同步時鐘周期與第一個同步觸發(fā)器所需保持時間之和。最保險的脈沖寬度是同步器時鐘周期的兩倍。如果輸入是一個單時鐘寬度脈沖進(jìn)入一個較慢的時鐘域,則這種同步器沒有作用,在這種情況下就要采用脈沖同步器。
- 脈沖(Pulse)同步器
?脈沖同步器工作原理
主要參考以下博文:
CDC(二) 單bit 脈沖跨時鐘域處理
verilog設(shè)計-CDC:單bit脈沖快時鐘域到慢時鐘域
?脈沖同步器就是帶邊沿檢測的單bit同步器,基本原理就是把脈沖信號進(jìn)行展寬。
脈沖同步器應(yīng)用場景
- 適用于單bit脈沖信號跨時鐘域。慢到快,快到慢均可,源脈沖間隔至少要為2個目的時鐘周期,否則會被漏采。當(dāng)然,在慢到快時鐘比率大于2倍以上時也是可以實時采樣的。
脈沖同步器原理
- 脈沖同步器的原理為將快時鐘域的脈沖拓展為電平信號,使得該電平的寬度大于慢時鐘域的時鐘周期,從而可以使用兩級同步器進(jìn)行同步,然后在同步后的時鐘域進(jìn)行脈沖恢復(fù),從而完成將信號(尤其是脈沖信號)從快時鐘域傳遞到慢時鐘域。
- 其電路設(shè)計圖如下所示:
脈沖同步器電路特點
- 該電路只能傳遞脈沖信號(也還能傳遞一直是0的信號,只不過工程意義不大)。對于輸入信號一直是1,或是只有0到1的階躍信號,只有1到0的信號均無法正確傳輸;
- 該電路將輸入端的脈沖傳輸給慢時鐘域,無論輸入端的脈沖有多寬,都只能在慢時鐘域恢復(fù)成一個時鐘周期寬度的脈沖;
- 輸入信號的脈沖之間間隔要大于1倍的慢時鐘周期,否則連著的兩個脈沖問題會在慢時鐘域合并成一個脈寬為2個滿時鐘周期的脈沖,導(dǎo)致丟失一個脈沖。
完整代碼如下
`timescale 100ps/100psmodule pulse_detect(input clka , input clkb , input rst_n ,input sig_a ,output sig_b
);reg sig_a_r;reg q_buff0, q_buff1;//1.翻轉(zhuǎn)電路部分(快時鐘域)always @(posedge clka or negedge rst_n) beginif (!rst_n) sig_a_r = 1'b0;else beginif (sig_a) sig_a_r = ~sig_a_r;else sig_a_r = sig_a_r;endend//2.電平同步器部分always @(posedge clkb or negedge rst_n) beginif (!rst_n) begin q_buff0 <= 1'b0; q_buff1 <= 1'b0; endelse begin q_buff0 <= sig_a_r; q_buff1 <= q_buff0; endendreg q_slow;always @(posedge clkb or negedge rst_n) beginif (!rst_n) begin q_slow <= 1'b0; endelse begin q_slow <= q_buff1; endendassign sig_b = q_buff1 ^ q_slow;
endmodule
另一種寫法:單獨例化D觸發(fā)器;
`timescale 100ps/100psmodule pulse_detect(input clka , input clkb , input rst_n ,input sig_a ,output sig_b
);reg sig_a_r;wire q_buff0, q_buff1, q_slow;always @(posedge clka or negedge rst_n) beginif (!rst_n) sig_a_r = 1'b0;else beginif (sig_a) sig_a_r = ~sig_a_r;else sig_a_r = sig_a_r;endendDFF_R D0 (.D(sig_a_r), .clk(clkb), .rst_n(rst_n), .Q(q_buff0));DFF_R D1 (.D(q_buff0), .clk(clkb), .rst_n(rst_n), .Q(q_buff1));DFF_R D2 (.D(q_buff1), .clk(clkb), .rst_n(rst_n), .Q(q_slow));assign sig_b = q_buff1 ^ q_slow;endmodule//帶異步復(fù)位端的D觸發(fā)器
module DFF_R(input D,input clk,input rst_n,output reg Q
);always @(posedge clk or negedge rst_n) beginif (!rst_n) Q <= 1'b0;else Q <= D;end
endmodule