verilog基本電路設計(包括:時鐘域同步、無縫切換、異步fifo、去抖濾波))(精編版)_第1頁
verilog基本電路設計(包括:時鐘域同步、無縫切換、異步fifo、去抖濾波))(精編版)_第2頁
verilog基本電路設計(包括:時鐘域同步、無縫切換、異步fifo、去抖濾波))(精編版)_第3頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、verilog 基本電路設計(包括:時鐘域同步、無縫切換、異步 fifo 、去抖濾波)verilog 基本電路設計共包括四部分:單 bit 跨時鐘域同步時鐘無縫切換異步fifo 去抖濾波verilog 基本電路設計之一: 單 bit 跨時鐘域同步(帖子鏈接: 看到壇子里不少朋友,對于基本數字電路存在這樣那樣的疑惑,本人決定開貼,介紹數字電路最常見的模塊單元,希望給初學者帶來幫助,也歡迎大佬們前來拍磚。如果想要做數字設計,下面這些電路是一定會碰到的,也是所有大型ip,soc 設計必不可少的基礎, 主要包括異步信號的同步處理,同步 fifo , 異步 fifo ,時鐘無縫切換,信號濾波deboun

2、ce等等,后面會根據大家反饋情況再介紹新電路。首先介紹異步信號的跨時鐘域同步問題。一般分為單bit 的控制信號同步,以及多bit 的數據信號同步。多bit 的信號同步會使用異步fifo 完成,而單 bit 的信號同步, 又是時鐘無縫切換電路以及異步fifo 電路的設計基礎,這里先介紹單bit 信號同步處理。clka 域下的信號signal_a ,向異步的 clkb 域傳遞時, 會產生亞穩(wěn)態(tài)問題。所有的亞穩(wěn)態(tài),歸根結底就是setup/hold時間不滿足導致。在同一個時鐘域下的信號,綜合以及布線工具可以在 data 路徑或者 clock 路徑上插入buffer 使得每一個dff 的 setup/h

3、old時間都滿足;但是當signal_a 在 clkb 域下使用時, 由于 clka 與 clkb 異步,它們的相位關系不確定,那么在 clkb 的時鐘沿到來時, 無法確定 signal_a 此時是否處于穩(wěn)定無變化狀態(tài),也即setup/hold時間無法確定,從而產生亞穩(wěn)態(tài)。這種異步信號在前后端流程里面是無法做時序分析的,也就是靜態(tài)時序分析里常說的false_path 。消除亞穩(wěn)態(tài),就是采用多級dff 來采樣來自另一個時鐘域的信號,級數越多,同步過來的信號越穩(wěn)定。對于頻率很高的設計,建議至少用三級dff ,而兩級 dff 同步則是所有異步信號處理的最基本要求。單 bit 的信號跨時鐘域同步,又分

4、成電平信號同步以及脈沖信號同步。 電平信號, 就是說 clka 下的信號 signal_a 在 clkb看來,是一個很寬的信號,會保持多個clkb 的時鐘周期,一定能被 clkb 采到。這種情況,只需要使用clkb 用至少兩級dff 連續(xù)抓 signal_a 即可,特別需要強調的是, 此時 signal_a必須是 clka 下的寄存器信號,如果signal_a 是 clka 下的組合邏輯信號,一定要先在clka 下用 dff 抓一拍,再使用兩級 dff 向 clkb 傳遞。這是因為clka 下的組合邏輯信號會有毛刺,在 clka 下使用時會由setup/hold時間保證毛刺不會被clka 采到

5、,但由于異步相位不確定,組合邏輯的毛刺卻極有可能被 clkb 采到。電平信號的同步處理,一般用于知道確定的時鐘頻率大小關系或者極慢時鐘下的信號向極快時鐘域傳遞時使用,簡單處理如下:always (posedge clkb or negedge rst_n)begin if (!rst_n) begin levl_b_d1 levl_b_d2 levl_b_d3 end else begin levl_b_d1 levl_b_d2 levl_b_d3 endendassign puls_b_pos = levl_b_d2 & (levl_b_d3);assign puls_b_neg =

6、 levl_b_d3 & (levl_b_d2); assign levl_b_out = levl_b_d2; 上面三個輸出分別是經過同步之后,clkb 下可以使用的0 變1 脈沖信號, 1 變 0 脈沖信號以及電平信號。再次強調:levl_a_in 必須是 clka 的 dff 信號!下面是更常見的,clka下的脈沖信號,同步到clkb 時鐘域下,它對于clka 與 clkb的時鐘頻率關系沒有任何限制,快到慢,慢到快都沒問題。其主要原理就是先把脈沖信號在clka 下展寬,變成電平信號,再向 clkb 傳遞,當確認clkb 已經“看見”信號同步過去之后,再清掉 clka 下的電平信號

7、。 脈沖信號同步處理電路,有兩個地方使用了上面的電平信號同步處理原則,請仔細揣摩原因。詳細見下面的rtl ,其中省略了信號定義聲明:module sync_pulse ( / input rst_n, / system reset clka, / clocka clkb, / clockb puls_a_in, / pulse input from clka / output puls_b_out, / pulse output in clkb levl_b_out / level output in clkb );parameter dly = 1; /always (posedge clk

8、a or negedge rst_n) begin if (rst_n = 1b0) signal_a else if (puls_a_in) signal_a else if (signal_b1_a2) signal_a else ; endalways (posedge clkb or negedge rst_n) begin if (rst_n = 1b0) signal_b else signal_b endalways (posedge clkb or negedge rst_n) begin if (rst_n = 1b0) begin signal_b_b1 signal_b_

9、b2 end else begin signal_b_b1 signal_b_b2 end endalways (posedge clka or negedge rst_n) begin if (rst_n = 1b0) begin signal_b1_a1 signal_b1_a2 end else begin signal_b1_a1 signal_b1_a2 end endassign puls_b_out = signal_b_b1 & (signal_b_b2) ; assign levl_b_out = signal_b_b1 ;endmodule 下一篇講時鐘切換電路。留

10、下一個思考題:clka 下的同一個寄存器信號signal_a ,電平寬度對clkb 而言足夠長, 如果同時調用兩個相同的電平同步模塊向clkb 時鐘傳遞, 分別得到levl_b1 和 levl_b2 ,那么在 clkb 時鐘域下看到的lev_b1 和levl_b2 信號是否一樣?這個問題是實際設計中一不小心就會犯錯的,如果能夠想明白正確回答這個問題,異步信號的理解就可以過關了。verilog 基本電路設計之二:時鐘無縫切換(帖子鏈接:http:/ 住的,即使切出毛刺也不會導致 dff 誤觸發(fā),這樣的模塊可以選擇用此種切換方式。寫法很簡單assign clk_o = sel_clkb ? clk

11、b : clka ,當sel_clkb 為 1 時選擇 clkb ,否則選擇clka 。不過在實際設計中,建議直接調用庫里的mux 單元 set_dont_touch ,不要采用這里的assign 寫法,因為這種寫法最后綜合得到的可能不是 mux 而是復雜組合邏輯,給前后端流程的時鐘約束和分析帶來不便。 無縫切換, 就是切換時無毛刺時鐘平穩(wěn)過渡。在時鐘切換中,只要出現比clka 或者 clkb 頻率更高的窄脈沖,不論是窄的高電平還是窄的低電平,都叫時鐘毛刺。工作在切換后時鐘clk_o 下的電路模塊,綜合約束是在maxclka,clkb 頻率下的, 也就是說設計最后signoff 的時候,只保證

12、電路可以穩(wěn)定工作的最高頻率是maxclka,clkb,如果切換中出現更高頻的時鐘毛刺,電路可能出現無法預知的結果而出錯。無縫切換,一般用在處于工作狀態(tài)的模塊需要調頻或者切換時鐘源,比如內部系統(tǒng)總線,cpu 等。你剛用手機打完游戲后馬上關屏聽音樂,這兩種場景中, cpu 在滿足性能前提下為了控制功耗,其工作頻率會動態(tài)地從很高調至較低,此時就可能是在cpu 一直處于工作狀態(tài)下,通過無縫切換時鐘源頭實現的。在無縫切換電路中,切換信號sel_clkb 可以是任意時鐘域下的信號,包括但不限于clka 或者 clkb 域,但是 sel_clkb 必須是一個dff 輸出信號; clka與 clkb 的頻率大

13、小相位關系可以任意。無縫切換需要解決兩個問題,一是異步切換信號的跨時鐘域同步問題,這里需要使用verilog 基本電路設計之一里的同步電路原理消除亞穩(wěn)態(tài);二是同步好了的切換信號與時鐘信號如何做邏輯,才能實現無毛刺。下面寫出無縫切換電路的主體部分,忽略了內部信號的定義聲明等。module clk_switch ( rst_n, clka, clkb, sel_clkb, clk_o ); always (posedge clka or negedge rst_n) begin if (!rst_n) begin sel_clka_d0 sel_clka_d1 end else begin sel

14、_clka_d0 sel_clka_d1 end end/ part2 /always (posedge clka_n or negedge rst_n) always (posedge clka or negedge rst_n) begin if (!rst_n) begin sel_clka_dly1 sel_clka_dly2 sel_clka_dly3 end else begin sel_clka_dly1 sel_clka_dly2 sel_clka_dly3 end end/ part3 /always (posedge clkb_n or negedge rst_n) alw

15、ays (posedge clkb or negedge rst_n) begin if (!rst_n) begin sel_clkb_d0 sel_clkb_d1 end else begin sel_clkb_d0 sel_clkb_d1 end end/ part4 /always (posedge clkb_n or negedge rst_n) always (posedge clkb or negedge rst_n) begin if (!rst_n) begin sel_clkb_dly1 sel_clkb_dly2 sel_clkb_dly3 end else begin

16、sel_clkb_dly1 sel_clkb_dly2 sel_clkb_dly3 end end/ part5 clk_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 = clkb & sel_clkb_dl

17、y3 ; assign clk_o = clka_g | clkb_g ; endmodule 上面是我認為比較合理的無縫切換電路,其他切換方式跟這個會有些許出入,但基本大同小異原理是一樣的。有幾點說明:1、拋開注釋掉的電路不看,由于 part5 部分直接調用庫里的clock gating cell,使得整個切換電路全部只需要用到時鐘上升沿, 無需額外定義反向時鐘, 精簡了 dc 綜合的時鐘約束;直接調用 gating cell的 另一個好處是,前后端工具會自動檢查 gating cell的 cp 信號與 en 信號的 setup/hold時間,使得 gating 后的 q 時鐘輸出無毛刺尖峰

18、。te 端可以根據實際需要接上scan 測試模式信號。如果使用part5 部分的gating cell實現,前面的part1,2,3,4全部替換成注釋掉的反相時鐘也是沒有問題。2、part2 和 part4 部分,具體需要多少級 dff ,甚至完全不要也是可以的,這就回到了verilog基本電路設計之一 里討論的到底多少級dff 消除亞穩(wěn)態(tài)才算合理的問題。時鐘頻率很低可能無所謂,如果時鐘頻率達到 ghz ,這部分建議至少保留三級dff ,因為三級dff 延時也僅僅只有3ns 的時間裕度。 沒必要為了省這么幾個dff降低電路可靠性,在復雜ip 以及大型 soc 系統(tǒng)中,你會發(fā)現多幾十個dff ,

19、面積上可以忽略, 系統(tǒng)可靠性和穩(wěn)定性才是首要的。 3、如果 part5 部分希望使用注釋掉的兩行“與”邏輯實現時鐘gating ,此時 part1 與 part3 使用正相或者反相時鐘都可以,但是必須把part2 和 part4 部分改為注釋掉的反相時鐘實現,目的是初步從rtl 設計上避免“與”邏輯的毛刺,同時還需要后端配合,因為很多后端工具對時鐘“與”邏輯的 clock gating check未必會檢查。用clk 下降沿拍出的en 信號,再跟clk 做與邏輯得到的門控時鐘,在rtl 仿真階段看到的一定不會有毛刺,但是布線完成后,如果clk 相對 en 后移,那與邏輯得到的門控時鐘就有毛刺了

20、。這就是用與邏輯做門控的缺點,由于后端工具可能不會去檢查這個與門的時序關系而導致出錯。但直接調用庫里的gating cell ,工具天然就會去檢查這個時序,免去人工確認的后顧之憂。最后,請大家仔細看看sel_clka_d0 (sel_clkb_dly3) 和sel_clkb_d0 verilog 基本電路設計之三:異步 fifo (帖子鏈接:http:/ 用于為匹配讀寫速度而設置的數據緩沖buffer , 當讀寫時鐘異步時,就是異步 fifo 。多 bit 的數據信號,并不是直接從寫時鐘域同步到讀時鐘域的,而是讀寫時鐘域分別派遣了一個信使,去通知對方時鐘域,當前本方所處的讀寫情況,來判斷還能不

21、能寫以及可不可以讀,這兩個信使就是讀寫指針。在verilog 基本電路設計之一里已討論過,即使單bit 的異步信號,通過兩個相同的同步電路,達到 clkb 域時都可能“長”的不是一個模樣,更加不用說多bit 的異步信號同時傳遞到clkb 域會變成什么五花八門的模樣了。這里讀寫指針不是單bit 信號,它們如何向對方時鐘域去同步呢?格雷碼!它的特點是每次只有一個bit 發(fā)生變化, 這樣就把多bit 信號同步轉變?yōu)榱藛?bit 信號同步,這也是為什么多bit 的格雷碼信號,可以類似于單bit 信號那樣,直接使用兩級dff 去同步的根本原因。下面給出異步fifo 的主體部分,同樣,省略了信號聲明定義。

22、 module asyn_fifo ( / input af_wclk , / async-fifo clear in write clock af_rclk , / async-fifo clear in read clock rst_n, / system reset af_wr_en, / async-fifo write enable af_rd_en, / async-fifo read enable af_dati, / async-fifo data in /output af_full , / async-fifo full flag af_empty, / async-fif

23、o 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) begin if (rst_n = 1b0) begin wptr_wclk wptr_gray end else

24、begin wptr_wclk wptr_gray end endreg 31:0 ram15:0 ; / always (posedge af_wclk) begin if (af_wr_en = 1b1) ramwptr_wclk3:0 else ; 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_rptr_rclk ;always (pose

25、dge af_rclk or negedge rst_n) begin if (rst_n = 1b0) begin rptr_rclk rptr_gray end else begin rptr_rclk rptr_gray end endassign af_dato = ramrptr_rclk3:0 ;/ sync read pointer always (posedge af_wclk or negedge rst_n) begin if (rst_n = 1b0) begin rptr_sp1 rptr_sp2 end else begin rptr_sp1 rptr_sp2 end

26、 end/ sync write pointer always (posedge af_rclk or negedge rst_n) begin if (rst_n = 1b0) begin wptr_sp1 wptr_sp2 end else begin wptr_sp1 wptr_sp2 end endassign af_full = (wptr_gray = rptr_sp24,rptr_sp23,rptr_sp22:0) ; assign af_empty = (rptr_gray = wptr_sp2) ;assign wptr_bin4 = wptr_sp24 ; assign w

27、ptr_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 = wp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論