版權(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í)鐘域同步、無(wú)縫切換、異步 fifo 、去抖濾波) )verilog基本電路設(shè)計(jì)共包括四部分:?jiǎn)?bit跨時(shí)鐘域同步時(shí)鐘無(wú)縫切換異步fifo去抖濾波verilog基本電路設(shè)計(jì)之一:單 bit 跨時(shí)鐘域同步(帖子鏈接: )看到壇子里不少朋友, 對(duì)于基本數(shù)字電路存在這樣那樣的疑惑,本人決定開貼,介紹數(shù)字電路最常見的模塊單元,希望給初學(xué)者帶來(lái)幫助,也 歡迎大佬們前來(lái)拍磚。如果想要做數(shù)字設(shè)計(jì),下面這些電路 是一定會(huì)碰到的,也是所有大型ip , soc設(shè)計(jì)必不可少的基礎(chǔ),主要包括異步信號(hào)的同步處理,同步 fifo ,異步 fifo , 時(shí)鐘無(wú)縫切換,信號(hào)濾波deboun
2、ce等等,后面會(huì)根據(jù)大家 反饋情況再介紹新電路。首先介紹異步信號(hào)的跨時(shí)鐘域同步問題。一般分為單 bit 的控制信號(hào)同步,以及多 bit 的數(shù)據(jù)信號(hào)同步。多 bit 的信號(hào)同步會(huì)使用異步 fifo 完成, 而單 bit 的信號(hào)同步, 又是時(shí)鐘無(wú)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的 set
3、up/hold時(shí)間都滿足;但是當(dāng)signal_a在 clkb域下使用時(shí), 由于 clka與 clkb異步,它們的相位關(guān)系不確定, 那么在 clkb的時(shí)鐘沿到來(lái)時(shí), 無(wú)法確定 signal_a此時(shí)是否處于穩(wěn)定無(wú)變化狀態(tài),也即setup/hold時(shí)間無(wú)法確定,從而產(chǎn)生亞穩(wěn)態(tài)。這種異步信號(hào)在前后端流程里面是無(wú)法做時(shí)序分析的,也就是靜態(tài)時(shí)序分析里常說的false_path。消除亞穩(wěn)態(tài), 就是采用多級(jí)dff來(lái)采樣來(lái)自另一個(gè)時(shí)鐘域的信號(hào),級(jí)數(shù)越多,同步過來(lái)的信號(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 看來(lái),是一個(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下的組clka下用 dff合邏輯信號(hào),一定要先在抓一拍,再使用兩級(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 or negedge rst_n)beginif (!rst_n) begin levl_b_d1 levl_b_d2 levl_b_d3endelse beginlevl_b_d1 levl_b_d2 levl_b_d3endendassign puls_b_pos = levl_b_d2 & (levl_b_d3);assign puls_b_neg = levl_b_d3 & (levl_
6、b_d2);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的 dffclka信號(hào)!下面是更常見的,下的脈沖信號(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 = 1'b0)sig
8、nal_aelse if (puls_a_in) signal_aelse if (signal_b1_a2)signal_a else ;endalways (posedge clkb or negedge rst_n)beginif (rst_n = 1'b0)signal_belsesignal_bendalways (posedge clkb or negedge rst_n) beginif (rst_n = 1'b0) beginsignal_b_b1 signal_b_b2endelse beginsignal_b_b1 signal_b_b2endendalwa
9、ys (posedge clka or negedge rst_n)beginif (rst_n = 1'b0) 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è)相同
10、的電平同步模塊向clkb時(shí)鐘傳遞, 分別得到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í)鐘無(wú)縫切換(帖子鏈接:)時(shí)鐘切換分成兩種方式,普通切換和去毛刺無(wú)縫切換。普通切換,就是不 關(guān)心切出的時(shí)鐘是否存在毛刺,這種方式電路成本小。如果 時(shí)鐘切換時(shí),使用此時(shí)鐘的模塊電路處于非工作狀態(tài),或者 模塊內(nèi)電路被全局復(fù)位信號(hào)reset住的,即使切出毛刺也不會(huì)導(dǎo)致 dff誤觸發(fā),這樣的模塊可以選擇用此種切換方式。寫法
11、很簡(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í)鐘約束和分析帶來(lái)不便。 無(wú)縫切換, 就是切換時(shí)無(wú)毛刺時(shí)鐘平穩(wěn)過渡。在時(shí)鐘切換中,只要出現(xiàn)比clka或者 clkb頻率更高的窄脈沖,不論是窄的高電平還是窄的低電平,都叫時(shí)鐘毛刺。工 作在切換后時(shí)鐘clk_o下的電路模塊,綜合約束是在maxclka,clkb頻率下的
12、, 也就是說設(shè)計(jì)最后signoff的時(shí)候, 只保證電路可以穩(wěn)定工作的最高頻率是maxclka,clkb,如果切換中出現(xiàn)更高頻的時(shí)鐘毛刺,電路可能出現(xiàn)無(wú)法預(yù)知的結(jié)果而出錯(cuò)。無(wú)縫切換,一般用在處于工作狀態(tài)的模塊需要調(diào)頻或者切換時(shí)鐘源, 比如內(nèi)部系統(tǒng)總線, cpu 等。你剛用手機(jī)打完游戲后馬上關(guān)屏聽音樂, 這兩種場(chǎng)景中, cpu 在滿足性能前提下為了控制功耗,其工作頻率會(huì)動(dòng)態(tài)地從很高調(diào)至cpu較低,此時(shí)就可能是在一直處于工作狀態(tài)下,通過無(wú)縫切換時(shí)鐘源頭實(shí)現(xiàn)的。在無(wú)縫切換電路中,切換信號(hào)sel_clkb可以是任意時(shí)鐘域下的信號(hào),包括但不限于clka或者 clkb域,但是 sel_clkb必須是一個(gè)df
13、f輸出信號(hào); clka 與 clkb的頻率大小相位關(guān)系可以任意。無(wú)縫切換需要解決兩 個(gè)問題,一是異步切換信號(hào)的跨時(shí)鐘域同步問題,這里需要使用verilog基本電路設(shè)計(jì)之一里的同步電路原理消除亞穩(wěn)態(tài);二是同步好了的切換信號(hào)與時(shí)鐘信號(hào)如何做邏輯,才 能實(shí)現(xiàn)無(wú)毛刺。下面寫出無(wú)縫切換電路的主體部分,忽略了 內(nèi)部信號(hào)的定義聲明等。module clk_switch (rst_n, clka, clkb, sel_clkb, clk_o);always (posedge clka or negedge rst_n) beginif (!rst_n) beginsel_clka_d0 sel_clka_d1
14、endelse 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_dly3endend/ part3/always (posedge clkb_n or negedge rst_n
15、) always (posedge clkb or negedge rst_n) beginif (!rst_n) beginendsel_clkb_d0 sel_clkb_d1else 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_clkb_dly2 sel_clkb_dly3endelse beginsel_clkb
16、_dly1 sel_clkb_dly2 sel_clkb_dly3endend/ part5clk_gate_xxx clk_gate_a( .cp(clka), .en(sel_clka_dly3), .q(clka_g).te(1'b0) ); clk_gate_xxx clk_gate_b( .cp(clkb), .en(sel_clkb_dly3), .q(clkb_g).te(1'b0) );/assign clka_g = clka & sel_clka_dly3 ;/assign clkb_g = clkb & sel_clkb_dly3 ; as
17、sign clk_o = clka_g | clkb_g ; endmodule上面是我認(rèn)為比較合理的無(wú)縫切換電路,其他切換方式跟這個(gè)會(huì)有些許出入,但基本大同小異原理是一樣的。有幾點(diǎn)說明:1、拋開注釋掉的電路不看,由于 part5部分直接調(diào)用庫(kù)里的clock gating cell,使得整個(gè)切換電路全部只需要用到時(shí)鐘上 升沿,無(wú)需額外定義反向時(shí)鐘,精簡(jiǎn)了 dc綜合的時(shí)鐘約束; 直接調(diào)用 gating cell的 另一個(gè)好處是,前后端工具會(huì)自動(dòng)檢查 gating cell的 cp信號(hào)與 en信號(hào)的 setup/hold時(shí)間, 使得 gating后的 q 時(shí)鐘輸出無(wú)毛刺尖峰。te 端可以根據(jù)實(shí)際需
18、要接上scan測(cè)試模式信號(hào)。如果使用part5部分的gating cell實(shí)現(xiàn),前面的part1,2,3,4全部替換成注釋掉的反相時(shí)鐘也是沒有問題。2 、part2和 part4部分,具體需要多少級(jí) dff ,甚至完全不要也是可以的,這就回到了verilogdff消除亞穩(wěn)態(tài)才基本電路設(shè)計(jì)之一 里討論的到底多少級(jí)算合理的問題。時(shí)鐘頻率很低可能無(wú)所謂,如果時(shí)鐘頻率達(dá)到 ghz ,這部分建議至少保留三級(jí)dff ,因?yàn)槿?jí)dff延時(shí)也僅僅只有3ns 的時(shí)間裕度。 沒必要為了省這么幾個(gè)dff 降低電路可靠性,在復(fù)雜ip 以及大型 soc系統(tǒng)中,你會(huì)發(fā)現(xiàn)多幾十個(gè)dff ,面積上可以忽略,系統(tǒng)可靠性和穩(wěn)定性
19、才 是首要的。 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后移,那與邏輯得到的門控時(shí)鐘就有毛刺了。這就是用與邏輯做門控的缺點(diǎn),由于后端工具可能
20、不會(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 (帖子鏈接:) fifo用于為匹配讀寫速度而設(shè)置的數(shù)據(jù)緩沖buffer ,當(dāng)讀寫時(shí)鐘異步時(shí), 就是異步 fifo 。多 bit 的數(shù)據(jù)信號(hào),并不是直接從寫時(shí)鐘域同步到讀時(shí)鐘域的,而是讀寫時(shí)鐘域分別派遣了一個(gè)信使,去通知對(duì)方時(shí)鐘域,當(dāng)前本方所處的讀寫情況,來(lái)判斷還能不能寫以及可不可以讀,這兩個(gè)信使就是讀寫指針。在veri
21、log基本電路設(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), 可以類似于單bit 信號(hào)那樣,直接使用兩級(jí)dff去同步的根本原因。下面給出異步fifo的主體部分,同樣,省略了信 號(hào)聲明定義。 module asyn_fifo (/ inputaf_w
22、clk , / async-fifo clear in write clock af_rclk , / async-fifo clear in read clock rst_n,/ system resetaf_wr_en, / async-fifo write enableaf_rd_en, / async-fifo read enableaf_dati,/ async-fifo data in/outputaf_full , / async-fifo full flag af_empty, / async-fifo empty flag af_dato/ async-fifo data o
23、ut);/- data input-assign nxt_wptr_wclk = (af_wr_en && !af_full) ? (wptr_wclk+ 1'b1) : wptr_wclk ;assign nxt_wptr_gray = (nxt_wptr_wclk >> 1) nxt_wptr_wclk ;always (posedge af_wclk or negedge rst_n)beginif (rst_n = 1'b0) begin wptr_wclk wptr_grayendelse beginwptr_wclk wptr_graye
24、ndendreg31:0ram15:0; /always (posedge af_wclk)beginif (af_wr_en = 1'b1) ramwptr_wclk3:0else ;end/- data output -assign nxt_rptr_rclk = (af_rd_en && !af_empty) ? (rptr_rclk+ 1'b1) : rptr_rclk ;assign nxt_rptr_gray = (nxt_rptr_rclk >> 1) nxt_rptr_rclk ;always (posedge af_rclk or
25、negedge rst_n) beginif (rst_n = 1'b0) 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 = 1'b0) beginassign af_empty = (rptr_gray = wptr_sp2) ;assignendrptr_sp1 rptr_sp2
26、else beginrptr_sp1 rptr_sp2endend/ sync write pointeralways (posedge af_rclk or negedge rst_n) beginif (rst_n = 1'b0) begin wptr_sp1 wptr_sp2endelse beginwptr_sp1 wptr_sp2endendassign af_full= (wptr_gray =rptr_sp24,rptr_sp23,rptr_sp22:0) ;wptr_bin4=wptr_sp24 ;assign wptr_bin3=(wptr_sp24:3) ; ass
27、ign 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_r
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版美食城設(shè)備采購(gòu)及安裝服務(wù)合同4篇
- 二零二五版綠色校園綠化項(xiàng)目生態(tài)修復(fù)與合同4篇
- 2025年度知識(shí)產(chǎn)權(quán)保護(hù)論文數(shù)據(jù)保密合作協(xié)議4篇
- 二零二五版環(huán)保印刷品市場(chǎng)推廣合同2篇
- 二零二五年度代理記賬企業(yè)財(cái)務(wù)預(yù)算管理服務(wù)合同4篇
- 2025年食堂員工勞務(wù)派遣與食品安全合作協(xié)議3篇
- 2025版純電動(dòng)汽車租賃與充電網(wǎng)絡(luò)建設(shè)合同3篇
- 二零二五年度學(xué)校教室窗簾批量采購(gòu)安裝合同3篇
- 海鹽二手房交易合同2025年度糾紛調(diào)解機(jī)制合同3篇
- 個(gè)性化私有房產(chǎn)交易協(xié)議2024版版
- 電子商務(wù)平臺(tái)技術(shù)服務(wù)合同范本1
- 期末 (試題) -2024-2025學(xué)年川教版(三起)英語(yǔ)四年級(jí)上冊(cè)
- 2024年國(guó)家公務(wù)員考試公共基礎(chǔ)知識(shí)復(fù)習(xí)題庫(kù)及答案(共三套)
- 《社會(huì)工作實(shí)務(wù)》全冊(cè)配套完整課件3
- 單位違反會(huì)風(fēng)會(huì)書檢討書
- 2024年4月自考00832英語(yǔ)詞匯學(xué)試題
- 《哪吒之魔童降世》中的哪吒形象分析
- 信息化運(yùn)維服務(wù)信息化運(yùn)維方案
- 汽車修理廠員工守則
- 公安交通管理行政處罰決定書式樣
- 10.《運(yùn)動(dòng)技能學(xué)習(xí)與控制》李強(qiáng)
評(píng)論
0/150
提交評(píng)論