版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Verilog 基本電路設(shè)計(jì)(包括:時(shí)鐘域同步、無縫切換、異步 FIFO、去抖濾波)Verilog 基本電路設(shè)計(jì)共包括四部分:?jiǎn)?bit 跨時(shí)鐘域同步時(shí)鐘無縫切換異步FIFO去抖濾波Verilog 基本電路設(shè)計(jì)之一: 單 bit 跨時(shí)鐘域同步(帖子鏈接: /thread-605419-1-1.html)看到壇子里不少朋友, 對(duì)于基本數(shù)字電路存在這樣那樣的疑惑,本人決定開貼,介紹數(shù)字電路最常見的模塊單元,希望給初學(xué)者帶來幫助,也歡迎大佬們前來拍磚。如果想要做數(shù)字設(shè)計(jì),下面這些電路是一定會(huì)碰到的,也是所有大型IP , SOC 設(shè)計(jì)必不可少的基礎(chǔ),主要包括異步信號(hào)的同步處理,同步 FIFO,異步 F
2、IFO, 時(shí)鐘無縫切換,信號(hào)濾波debounce等等,后面會(huì)根據(jù)大家反饋情況再介紹新電路。首先介紹異步信號(hào)的跨時(shí)鐘域同步問題。一般分為單bit的控制信號(hào)同步,以及多bit的數(shù)據(jù)信號(hào)同步。多bit的信號(hào)同步會(huì)使用異步FIFO 完成,而單 bit 的信號(hào)同步,又是時(shí)鐘無縫切換電路以及異步FIFO電路的設(shè)計(jì)基礎(chǔ),這里先介紹單bit 信號(hào)同步處理。clka 域下的信號(hào)signal_a,向異步的clkb 域傳遞時(shí), 會(huì)產(chǎn)生亞穩(wěn)態(tài)問題。所有的亞穩(wěn)態(tài),歸根結(jié)底就是setup/hold時(shí)間不滿足導(dǎo)致。在同一個(gè)時(shí)鐘域下的信號(hào),綜合以及布線工具可以在data路徑或者clock路徑上插入buffer使得每一個(gè)DFF
3、的 setup/hold時(shí)間都滿足;但是當(dāng)signal_a在 clkb域下使用時(shí),由于clka 與 clkb 異步,它們的相位關(guān)系不確定,那么在clkb 的時(shí)鐘沿到來時(shí),無法確定 signal_a此時(shí)是否處于穩(wěn)定無變化狀態(tài),也即 setup/hold 時(shí)間無法確定,從而產(chǎn)生亞穩(wěn)態(tài)。這種異步信號(hào)在前后端流程里面是無法做時(shí)序分析的,也就是靜態(tài)時(shí)序分析里常說的false_path。消除亞穩(wěn)態(tài),就是采用多級(jí)DFF 來采樣來自另一個(gè)時(shí)鐘域的信號(hào),級(jí)數(shù)越多,同步過來的信號(hào)越穩(wěn)定。對(duì)于頻率很高的設(shè)計(jì),建議至少用三級(jí)DFF ,而兩級(jí)DFF 同步則是所有異步信號(hào)處理的最基本要求。單 bit 的信號(hào)跨時(shí)鐘域同步,
4、又分成電平信號(hào)同步以及脈沖信號(hào)同步。 電平信號(hào), 就是說clka 下的信號(hào)signal_a在 clkb看來,是一個(gè)很寬的信號(hào),會(huì)保持多個(gè)clkb 的時(shí)鐘周期,一定能被clkb采到。這種情況,只需要使用clkb 用至少兩級(jí)DFF連續(xù)抓 signal_a即可, 特別需要強(qiáng)調(diào)的是,此時(shí) signal_a必須是 clka 下的寄存器信號(hào),如果signal_a 是 clka 下的組合邏輯信號(hào),一定要先在clka 下用 DFF 抓一拍,再使用兩級(jí) DFF向 clkb傳遞。這是因?yàn)閏lka 下的組合邏輯信號(hào)會(huì)有毛刺,在clka 下使用時(shí)會(huì)由setup/hold 時(shí)間保證毛刺不會(huì)被clka 采到,但由于異步相
5、位不確定,組合邏輯的毛刺卻極有可能被 clkb 采到。電平信號(hào)的同步處理,一般用于知道確定的時(shí)鐘頻率大小關(guān)系或者極慢時(shí)鐘下的信號(hào)向極快時(shí)鐘域傳遞時(shí)使用,簡(jiǎn)單處理如下:always (posedge clkb ornegedge rst_n)begin if (!rst_n) begin levl_b_d1 levl_b_d2 levl_b_d3endelse beginpuls_b_pos=levl_b_d2&puls_b_neg=levl_b_d3&levl_b_d1 levl_b_d2 levl_b_d3 endendassign(levl_b_d3);assign(levl_b_d2);
6、assign levl_b_out= levl_b_d2;上面三個(gè)輸出分別是經(jīng)過同步之后,clkb 下可以使用的0 變1 脈沖信號(hào), 1 變 0 脈沖信號(hào)以及電平信號(hào)。再次強(qiáng)調(diào):levl_a_in 必須是 clka 的 DFF 信號(hào)!下面是更常見的, clka 下的脈沖信號(hào),同步到 clkb 時(shí)鐘域下,它對(duì)于 clka 與 clkb 的時(shí)鐘頻率關(guān)系沒有任何限制,快到慢,慢到快都沒問題。其主要原理就是先把脈沖信號(hào)在clka 下展寬,變成電平信號(hào),再向clkb 傳遞,當(dāng)確認(rèn)clkb 已經(jīng)“看見”信號(hào)同步過去之后,再清掉clka 下的電平信號(hào)。 脈沖信號(hào)同步處理電路,有兩個(gè)地方使用了上面的電平信號(hào)同
7、步處理原則,請(qǐng)仔細(xì)揣摩原因。詳細(xì)見下面的RTL ,其中省略了信號(hào)定義聲明:module sync_pulse (/ inputrst_n,/ system reset clka,/ clockAclkb,/ clockBpuls_a_in,/ pulse input from clka/ outputpuls_b_out,/ pulse output in clkb levl_b_out/ level output in clkb);parameter DLY =1;/always (posedge clkaor negedge rst_n) beginif (rst_n = 1b0)sign
8、al_aelse if (puls_a_in)signal_aelse if (signal_b1_a2) signal_aelse ;endalways (posedge clkb or negedge rst_n) beginif (rst_n = 1b0)signal_belsesignal_bendalways (posedge clkb or negedge rst_n) beginif (rst_n = 1b0) beginsignal_b_b1 signal_b_b2endelse beginsignal_b_b1 signal_b_b2endendalways (posedge
9、 clka or negedge rst_n)beginif (rst_n = 1b0) begin signal_b1_a1 signal_b1_a2endelse beginsignal_b1_a1 signal_b1_a2endendassign puls_b_out = signal_b_b1 & (signal_b_b2) ; assign levl_b_out = signal_b_b1 ;endmodule下一篇講時(shí)鐘切換電路。留下一個(gè)思考題:clka 下的同一個(gè)寄存器信號(hào)signal_a,電平寬度對(duì)clkb而言足夠長(zhǎng),如果同時(shí)調(diào)用兩個(gè)相同的電平同步模塊向clkb時(shí)鐘傳遞, 分別
10、得到levl_b1 和 levl_b2 ,那么在clkb 時(shí)鐘域下看到的lev_b1 和levl_b2 信號(hào)是否一樣?這個(gè)問題是實(shí)際設(shè)計(jì)中一不小心就會(huì)犯錯(cuò)的,如果能夠想明白正確回答這個(gè)問題,異步信號(hào)的理解就可以過關(guān)了。Verilog 基本電路設(shè)計(jì)之二:時(shí)鐘無縫切換(帖子鏈接: HYPERLINK /thread-605514-1-1.html /thread-605514-1-1.html)時(shí)鐘切換分成兩種方式,普通切換和去毛刺無縫切換。普通切換,就是不關(guān)心切出的時(shí)鐘是否存在毛刺,這種方式電路成本小。如果時(shí)鐘切換時(shí),使用此時(shí)鐘的模塊電路處于非工作狀態(tài),或者模塊內(nèi)電路被全局復(fù)位信號(hào)reset住的
11、,即使切出毛刺也不會(huì)導(dǎo)致 DFF 誤觸發(fā),這樣的模塊可以選擇用此種切換方式。寫法很簡(jiǎn)單assign clk_o = sel_clkb ? clkb : clka ,當(dāng)sel_clkb 為 1 時(shí)選擇 clkb ,否則選擇clka 。不過在實(shí)際設(shè)計(jì)中,建議直接調(diào)用庫(kù)里的MUX單元 set_dont_touch ,不要采用這里的assign 寫法,因?yàn)檫@種寫法最后綜合得到的可能不是 MUX而是復(fù)雜組合邏輯,給前后端流程的時(shí)鐘約束和分析帶來不便。無縫切換, 就是切換時(shí)無毛刺時(shí)鐘平穩(wěn)過渡。在時(shí)鐘切換中,只要出現(xiàn)比clka 或者 clkb 頻率更高的窄脈沖,不論是窄的高電平還是窄的低電平,都叫時(shí)鐘毛刺。
12、工作在切換后時(shí)鐘clk_o 下的電路模塊,綜合約束是在maxclka,clkb頻率下的,也就是說設(shè)計(jì)最后signoff的時(shí)候, 只保證電路可以穩(wěn)定工作的最高頻率是maxclka,clkb,如果切換中出現(xiàn)更高頻的時(shí)鐘毛刺,電路可能出現(xiàn)無法預(yù)知的結(jié)果而出錯(cuò)。無縫切換,一般用在處于工作狀態(tài)的模塊需要調(diào)頻或者切換時(shí)鐘源,比如內(nèi)部系統(tǒng)總線,CPU 等。你剛用手機(jī)打完游戲后馬上關(guān)屏聽音樂,這兩種場(chǎng)景中,CPU 在滿足性能前提下為了控制功耗,其工作頻率會(huì)動(dòng)態(tài)地從很高調(diào)至較低,此時(shí)就可能是在CPU 一直處于工作狀態(tài)下,通過無縫切換時(shí)鐘源頭實(shí)現(xiàn)的。在無縫切換電路中,切換信號(hào)sel_clkb 可以是任意時(shí)鐘域下的
13、信號(hào),包括但不限于clka 或者 clkb 域,但是sel_clkb 必須是一個(gè)DFF 輸出信號(hào); clka與 clkb 的頻率大小相位關(guān)系可以任意。無縫切換需要解決兩個(gè)問題, 一是異步切換信號(hào)的跨時(shí)鐘域同步問題,這里需要使用 Verilog 基本電路設(shè)計(jì)之一里的同步電路原理消除亞穩(wěn)態(tài); 二是同步好了的切換信號(hào)與時(shí)鐘信號(hào)如何做邏輯,才能實(shí)現(xiàn)無毛刺。下面寫出無縫切換電路的主體部分,忽略了內(nèi)部信號(hào)的定義聲明等。module clk_switch (rst_n, clka, clkb, sel_clkb, clk_o);always (posedge clka or negedge rst_n) b
14、eginif (!rst_n) beginsel_clka_d0 sel_clka_d1endelse beginsel_clka_d0 sel_clka_d1endend/ part2/always (posedge clka_n or negedge rst_n) always (posedge clka or negedge rst_n) beginif (!rst_n) beginsel_clka_dly1 sel_clka_dly2 sel_clka_dly3endelse beginsel_clka_dly1 sel_clka_dly2 sel_clka_dly3end end/
15、part3/always (posedge clkb_n or negedge rst_n) always (posedge clkb or negedge rst_n) beginif (!rst_n) beginsel_clkb_d0 sel_clkb_d1endelse beginsel_clkb_d0 sel_clkb_d1endend/ part4/always (posedge clkb_n or negedge rst_n) always (posedge clkb or negedge rst_n) beginif (!rst_n) beginsel_clkb_dly1 sel
16、_clkb_dly2 sel_clkb_dly3endelse beginsel_clkb_dly1 sel_clkb_dly2 sel_clkb_dly3endend/ part5clk_gate_xxx clk_gate_a( .CP(clka), .EN(sel_clka_dly3), .Q(clka_g).TE(1b0) ); clk_gate_xxx clk_gate_b( .CP(clkb), .EN(sel_clkb_dly3), .Q(clkb_g).TE(1b0) );/assign clka_g = clka & sel_clka_dly3 ;/assign clkb_g
17、= clkb & sel_clkb_dly3 ; assign clk_o = clka_g | clkb_g ; endmodule上面是我認(rèn)為比較合理的無縫切換電路,其他切換方式跟這個(gè)會(huì)有些許出入,但基本大同小異原理是一樣的。有幾點(diǎn)說明:1、拋開注釋掉的電路不看,由于 part5 部分直接調(diào)用庫(kù)里的clock gating cell,使得整個(gè)切換電路全部只需要用到時(shí)鐘上升沿,無需額外定義反向時(shí)鐘,精簡(jiǎn)了DC 綜合的時(shí)鐘約束; 直接調(diào)用gating cell的 另一個(gè)好處是,前后端工具會(huì)自動(dòng)檢查 gating cell的 CP 信號(hào)與 EN 信號(hào)的 setup/hold 時(shí)間,使得gatin
18、g后的 Q 時(shí)鐘輸出無毛刺尖峰。TE 端可以根據(jù)實(shí)際需要接上scan測(cè)試模式信號(hào)。如果使用part5 部分的 gating cell實(shí)現(xiàn),前面的part1,2,3,4全部替換成注釋掉的反相時(shí)鐘也是沒有問題。2、part2 和 part4 部分,具體需要多少級(jí) DFF ,甚至完全不要也是可以的,這就回到了 Verilog基本電路設(shè)計(jì)之一里討論的到底多少級(jí)DFF 消除亞穩(wěn)態(tài)才算合理的問題。時(shí)鐘頻率很低可能無所謂,如果時(shí)鐘頻率達(dá)到 GHz ,這部分建議至少保留三級(jí)DFF ,因?yàn)槿?jí)DFF 延時(shí)也僅僅只有 3ns 的時(shí)間裕度。 沒必要為了省這么幾個(gè) DFF 降低電路可靠性,在復(fù)雜 IP 以及大型 SO
19、C 系統(tǒng)中,你會(huì)發(fā)現(xiàn)多幾十個(gè) DFF ,面積上可以忽略, 系統(tǒng)可靠性和穩(wěn)定性才是首要的。 3、如果 part5 部分希望使用注釋掉的兩行“與”邏輯實(shí)現(xiàn)時(shí)鐘gating ,此時(shí)part1與 part3 使用正相或者反相時(shí)鐘都可以,但是必須把part2和 part4 部分改為注釋掉的反相時(shí)鐘實(shí)現(xiàn),目的是初步從RTL 設(shè)計(jì)上避免“與”邏輯的毛刺,同時(shí)還需要后端配合,因?yàn)楹芏嗪蠖斯ぞ邔?duì)時(shí)鐘“與”邏輯的 clock gating check未必會(huì)檢查。用clk 下降沿拍出的en 信號(hào),再跟clk 做與邏輯得到的門控時(shí)鐘,在RTL 仿真階段看到的一定不會(huì)有毛刺,但是布線完成后,如果clk 相對(duì) en后移,
20、那與邏輯得到的門控時(shí)鐘就有毛刺了。這就是用與邏輯做門控的缺點(diǎn),由于后端工具可能不會(huì)去檢查這個(gè)與門的時(shí)序關(guān)系而導(dǎo)致出錯(cuò)。但直接調(diào)用庫(kù)里的gating cell,工具天然就會(huì)去檢查這個(gè)時(shí)序,免去人工確認(rèn)的后顧之憂。最后,請(qǐng)大家仔細(xì)看看sel_clka_d0 (sel_clkb_dly3)和sel_clkb_d0Verilog 基本電路設(shè)計(jì)之三:異步 FIFO(帖子鏈接: HYPERLINK /thread-605632-1-1.html /thread-605632-1-1.html) FIFO用于為匹配讀寫速度而設(shè)置的數(shù)據(jù)緩沖buffer ,當(dāng)讀寫時(shí)鐘異步時(shí), 就是異步FIFO。多 bit 的數(shù)
21、據(jù)信號(hào),并不是直接從寫時(shí)鐘域同步到讀時(shí)鐘域的,而是讀寫時(shí)鐘域分別派遣了一個(gè)信使,去通知對(duì)方時(shí)鐘域,當(dāng)前本方所處的讀寫情況,來判斷還能不能寫以及可不可以讀,這兩個(gè)信使就是讀寫指針。在Verilog基本電路設(shè)計(jì)之一里已討論過,即使單bit 的異步信號(hào),通過兩個(gè)相同的同步電路,達(dá)到 clkb 域時(shí)都可能“長(zhǎng)” 的不是一個(gè)模樣,更加不用說多bit 的異步信號(hào)同時(shí)傳遞到clkb 域會(huì)變成什么五花八門的模樣了。這里讀寫指針不是單bit 信號(hào),它們?nèi)绾蜗驅(qū)Ψ綍r(shí)鐘域去同步呢?格雷碼!它的特點(diǎn)是每次只有一個(gè)bit 發(fā)生變化, 這樣就把多bit 信號(hào)同步轉(zhuǎn)變?yōu)榱藛蝏it信號(hào)同步,這也是為什么多bit的格雷碼信號(hào),
22、 可以類似于單bit信號(hào)那樣,直接使用兩級(jí)DFF去同步的根本原因。下面給出異步FIFO的主體部分,同樣,省略了信號(hào)聲明定義。 module asyn_fifo (/ inputaf_wclk , / async-FIFO clear in write clock af_rclk ,/ async-FIFO clear in read clockrst_n,/ system reset af_wr_en, / async-FIFO write enable af_rd_en, / async-FIFO read enableaf_dati,/ async-FIFO data in/outputa
23、f_full , / Async-FIFO full flag af_empty, / Async-FIFO empty flag af_dato/ Async-FIFO data out);/- data input-assign nxt_wptr_wclk = (af_wr_en & !af_full) ? (wptr_wclk + 1b1) : wptr_wclk ;assign nxt_wptr_gray = (nxt_wptr_wclk 1) nxt_wptr_wclk ;always (posedge af_wclk or negedge rst_n)beginif (rst_n
24、= 1b0) begin wptr_wclk wptr_grayendelse beginwptr_wclk wptr_grayendendreg31:0ram15:0; /always (posedge af_wclk) beginif (af_wr_en = 1b1) ramwptr_wclk3:0else ;end/- data output -assign nxt_rptr_rclk = (af_rd_en & !af_empty) ? (rptr_rclk + 1b1) : rptr_rclk ;assign nxt_rptr_gray = (nxt_rptr_rclk 1) nxt
25、_rptr_rclk ;always (posedge af_rclk or negedge rst_n) beginif (rst_n = 1b0) begin rptr_rclk rptr_grayendelse beginrptr_rclk rptr_grayendendassign af_dato = ramrptr_rclk3:0 ;/ sync read pointer always (posedge af_wclk or negedge rst_n) beginif (rst_n = 1b0) begin rptr_sp1 rptr_sp2endelse beginrptr_sp
26、1 rptr_sp2endend/ sync write pointeralways (posedge af_rclk or negedge rst_n) beginif (rst_n = 1b0) begin wptr_sp1 wptr_sp2endelse beginwptr_sp1 wptr_sp2endendassign af_full= (wptr_gray =rptr_sp24,rptr_sp23,rptr_sp22:0) ;assign af_empty = (rptr_gray = wptr_sp2) ;assignwptr_bin4=wptr_sp24 ;assign wpt
27、r_bin3=(wptr_sp24:3) ;assign wptr_bin2=(wptr_sp24:2) ;assign wptr_bin1=(wptr_sp24:1) ; assign wptr_bin0=(wptr_sp24:0) ;assign rptr_bin4=rptr_sp24 ;assign rptr_bin3=(rptr_sp24:3) ;assign rptr_bin2=(rptr_sp24:2) ;assign rptr_bin1=(rptr_sp24:1) ;assign rptr_bin0=(rptr_sp24:0) ;assign af_wlevel= wptr_wclk - rptr_bin ;assign af_rlevel = wptr_bin - rptr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年跨境電子商務(wù)平臺(tái)合作運(yùn)營(yíng)合同
- 二零二五年度二樓商鋪?zhàn)赓U與節(jié)假日臨時(shí)展覽服務(wù)合同2篇
- 2024年金融機(jī)構(gòu)電腦系統(tǒng)采購(gòu)合同
- 2024收養(yǎng)協(xié)議書范本:收養(yǎng)兒童法律援助服務(wù)3篇
- 2024年度打樁機(jī)租賃與節(jié)能環(huán)保服務(wù)合同3篇
- 2024版充電樁安裝協(xié)議書
- 2024版冠梁承包合同
- 提升保險(xiǎn)資金利用效率的策略
- 2024年簡(jiǎn)明短期汽車租賃合同范例版B版
- 2024年物業(yè)租賃合同(商業(yè)用途)
- 期末試卷(試題)-2024-2025學(xué)年五年級(jí)上冊(cè)數(shù)學(xué)北師大版
- 2024年中國(guó)電信服務(wù)合同標(biāo)準(zhǔn)文本
- 四川省成都市2023-2024學(xué)年高一上學(xué)期語文期末考試試卷(含答案)
- 2024-2025學(xué)年人教版八年級(jí)上冊(cè)數(shù)學(xué)期末必刷壓軸60題(原卷版)
- 投標(biāo)述標(biāo)演講稿
- 企業(yè)名稱:個(gè)人防護(hù)用品(PPE)管理規(guī)定
- 2023年工裝行業(yè)分析報(bào)告及未來五至十年行業(yè)發(fā)展報(bào)告
- 2024年自然資源部東海局所屬事業(yè)單位招聘59人歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- TTAF 238.1-2024 未成年人個(gè)人信息網(wǎng)絡(luò)保護(hù)要求 第1部分:身份核驗(yàn)
- 彈性力學(xué)材料模型:彈塑性材料:彈塑性本構(gòu)關(guān)系技術(shù)教程
- 平山水利樞紐設(shè)計(jì)說明書
評(píng)論
0/150
提交評(píng)論