3開發(fā)板配套網(wǎng)盤其他高級fpga設計誤區(qū)_第1頁
3開發(fā)板配套網(wǎng)盤其他高級fpga設計誤區(qū)_第2頁
3開發(fā)板配套網(wǎng)盤其他高級fpga設計誤區(qū)_第3頁
3開發(fā)板配套網(wǎng)盤其他高級fpga設計誤區(qū)_第4頁
3開發(fā)板配套網(wǎng)盤其他高級fpga設計誤區(qū)_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、可編程邏輯器件應用實踐主要內(nèi)容目的:通過具體實例學習Verilog設計的技巧內(nèi)容:同步設計異步設計常用功能單元設計同步設計同步/異步設計的優(yōu)缺點Verilog 設計中常見的誤區(qū)資源共享流水線設計實例同步/異步設計同步設計在當今設計中占絕對優(yōu)勢地位項目同步電路異步電路溫度、電壓、生產(chǎn)工藝參數(shù)變化基本無關關系密切可移植性好很差模塊間接口簡單需要用握手或者令牌電路毛刺少,容易消除很難控制同步/異步設計同步電路的缺點需要時序器件,面積大需要時鐘同步,時鐘翻轉(zhuǎn)瞬間功耗大同步設計Verilog 設計中常見的誤區(qū)多重驅(qū)動正負沿混合設計多重時鐘驅(qū)動混合同步與異步的reset對組合邏輯reset狀態(tài)機無初始化狀

2、態(tài)在模塊間使用雙向信號連接If-else, case無缺省項描述設計誤區(qū)一:多重驅(qū)動在testbench中可能存在多重驅(qū)動,因為testbench不需要綜合。在RTL設計中,一個net不應該有一個以上的驅(qū)動源Net xxx has multiple drive!在多重驅(qū)動下,會出現(xiàn)信號碰撞,使得信號的狀態(tài)不可預期,這種情況是需要絕對避免的!設計誤區(qū)一:多重驅(qū)動 BAD Example: reg 1:0 sig; always (posedge clk or negedge reset) if (reset) sig = 2b0; else if (condition1) sig = 2b10;

3、 always(posedge clk) if (condition2) sig = 2b11;設計誤區(qū)一:多重驅(qū)動 Good Example: reg 1:0 sig; always (posedge clk or negedge reset) if (reset) sig = 2b0; else if (condition1) sig = 2b10; else if (condition2) sig = 2b11; 設計誤區(qū)二:正負沿混合設計 一般不允許出現(xiàn)上升沿和下降沿混合出發(fā)的設計,這對于后續(xù)的ATPG不利。例:BAD Example always(posedge clk or neg

4、edge rst) if(rst) data=0; else data = din_a; always(negedge clk or negedge rst) if(rst) data = 0; else data = din_b; 設計誤區(qū)二:正負沿混合設計 一般不允許出現(xiàn)上升沿和下降沿混合出發(fā)的設計,這對于后續(xù)的ATPG不利。例:GOOD Example always(posedge clk or negedge rst) if(rst) data=0; else data = din_a; always(posedge clk or negedge rst) if(rst) dout =

5、 0; else dout = din_b; 設計誤區(qū)三:多重時鐘驅(qū)動 一般在設計中所用的觸發(fā)器只有一個時鐘端,除非在工藝庫中有專門的器件,并且在設計的時候?qū)iT制定,否則綜合是不能通過的。設計誤區(qū)三:多重時鐘驅(qū)動BAD: reg data; always (posedge clka or posedge clkb or negedge rst) if(rst) data = 0; else data = data_in;GOOD:reg data; always (posedge clka or negedge rst) if(rst) data = 0; else data = data_i

6、n;設計誤區(qū)四:混合同步與異步的reset觸發(fā)器的異步輸入只能是reset信號BAD: reg 3:0 cntr; always(posedge clk or negedge rst) if (reset) cntr = 0; else cntr =10); always(posedge clk or negedge rst) if (reset | syn_rst) dout = 0; else dout =din設計誤區(qū)四:混合同步與異步的reset觸發(fā)器的異步輸入只能是reset信號GOOD: reg 3:0 cntr; always(posedge clk or negedge rst

7、) if (reset) cntr = 0; else cntr =10); always(posedge clk or negedge rst) if (reset) dout = 0 else if (syn_rst) dout = 0 else dout =din設計誤區(qū)五:對組合邏輯reset能夠被reset的只有存儲元件,組合邏輯不應該包含reset邏輯 BAD: reg a,b,c; always (a or b or c or negedge rst) if (rst) dout = 0; else dout = a&(b|c);設計誤區(qū)五:對組合邏輯reset能夠被reset的

8、只有存儲元件,組合邏輯不應該包含reset邏輯 GOOD: reg a,b,c; always (clk or negedge rst) if (rst) begin a=0; b=0; c=0; end always (a or b or c) dout =a&(b|c);設計誤區(qū)六:狀態(tài)機無初始化狀態(tài)狀態(tài)機中如果沒有初始化狀態(tài),在系統(tǒng)上電時將無法確定進入哪個狀態(tài)。BAD: always (posedge clk) case (state) state1 : begin read =1;write=1; state=state2;state2: begin read =0;write=1;

9、state=state2;state3: begin read =1;write=0; if (condition)state=state2; else state= state1; end endcase設計誤區(qū)六:狀態(tài)機無初始化狀態(tài) always (posedge clk or negedge nrst) if (nrst) current_state= state1; else current_state=next_state; always (current_state) case (state) state1 : begin read =1;write=1; state=state2

10、;state2: begin .設計誤區(qū)七:在模塊間使用雙向信號連接Bi-directional signal 需要用到三態(tài)緩沖器(tristate),這種緩沖器只有在chip-level才會用到。 assign y = en?in:1bz;ineny設計誤區(qū)七:在模塊間使用雙向信號連接用三態(tài)緩沖器構建雙向門yininenbiIOg1g2g3設計誤區(qū)七:在模塊間使用雙向信號連接在設計中使用tristate會有以下問題:存在信號碰撞的風險,最好用兩組單向信號來實現(xiàn)在tristate既不處于輸入也不處于輸出時,此時BUS處于floating狀態(tài),會導致大的功耗會增加靜態(tài)時需分析、DFT和布線的困難

11、度設計誤區(qū)七:在模塊間使用雙向信號連接BAD: module A(sig, ) inout sig; wire sig = oen ? A_drive : 1bz; /driven by A wire sig_in_A = oen ? sig : 1bz;- module B(sig,) inout sig; wire sig = oen ? B_drive: 1bz; wire sig_in_B = oen?sig:1bz; 設計誤區(qū)七:在模塊間使用雙向信號連接GOOD: module A(sig_from_B, sig_to_B,) input sig_from_b; output sig

12、_to_b; wire sig_to_B = oen ? A_drive : 1b0; wire sig_in_A = sig_from_b;- module B(sig_from_A, sig_to_A,) input sig_from_a; output sig_to_a; wire sig_to_A = oen ? B_drive : 1b0; wire sig_in_B = sig_from_a;Resource Sharing資源共享對復雜的邏輯,盡可能以共享的方式來簡化例子:BAD: (使用兩個加法器) always(A or B or C or D) sum = sel?(A+B

13、): (C+D);Resource Sharing資源共享對復雜的邏輯,盡可能以共享的方式來簡化例子:GOOD: (通過增加一個MUX,共享一個加法器) always(sel or A or B or C or D) begintemp1 = sel ? A:C; temp2 = sel ? B:D; end always (temp1 or temp2) sum = temp1 + temp2;Resource Sharing資源共享對復雜的邏輯,盡可能以共享的方式來簡化例子:BAD: sum1 = A+B+C; sum2 =A+B+D;GOOD: temp=A+B; sum1= temp+

14、C; sum2=temp+D;第二種方法可以通過共享省掉一個加法器Resource Sharing資源共享對復雜的邏輯,盡可能以共享的方式來簡化例子:BAD: sum= AxB+AxC;GOOD: sum= Ax(B+C);第二種方法可以通過共享省掉一個乘法器流水線流水線是加速操作頻率的一種方法,當綜合過程中出現(xiàn)大的slack,不能滿足時序要求時,可以考慮針對組合時序延遲最長的路徑(Critical Path)進行寄存器分隔。流水線例: reg 31:0 A,B,C; wire 32:0 temp1 = A+B; wire 32:0 temp2 = temp1-C; reg 32:0 dout

15、; always(posedge clk) dout = temp2;ABC+temp1temp1Flip-Flopdout流水線切割流水線后電路示意 reg 31:0 A,B,C; wire 32:0 temp1 = A+B; reg 32:0 temp1_d; always(posedge clk or negedge nrst) if (nrst) temp1_d =0; else temp1_d = temp1; wire 32:0 temp2 = temp1_d-C; reg 32:0 dout; always(posedge clk or negedge nrst) if (nrs

16、t) dout =0; else dout = temp2;ABC+temp1temp1Flip-FlopdoutFlip-Floptemp1_d流水線例:切割流水線前的描述 reg 31:0 a,b,sum; wire 32:0 c_out, sum=a+b;c_outc_insumc_outc_outc_inb31:16a31:16sum31:16sum15:0b15:0a15:00流水線例:切割流水線后的描述 reg 31:0 sum; reg c1_d; wire 16:0 c1,sum15:0=a15:0+b15:0; always(posedge clk or negedge nr

17、st) if(nrst) c1_d=0; else c1_d = c1; wire 16:0 c_out, sum31:16= a31:16+b31:16+c1_d;流水線c_outc_insumc_outc_outc_inb31:16a31:16sum31:16sum15:0b15:0a15:00D-FFc1c1_d同步設計的例子:時鐘分頻器時鐘信號分頻是常見電路,最常見的分頻器是2分頻。漣波計數(shù)器是分頻器的一種,它屬于異步設計,因為觸發(fā)器的時鐘不是由同一個時鐘信號同步操作。DQ/QCLKDQ/QDQ/Qnrst同步設計的例子:時鐘分頻器 timescale 1ns/10ps module

18、top; reg q0,q1,q2; reg clk = 0, nrst =1; initial begin#70 nrst = 0;#45 nrst =1;end always #20 clk = clk; wire 1:0 sel =2; /選擇分頻輸出 wire clk_div = (sel = 0)?clk:(sel =1) ? q0: (sel =2) ? q1:(sel =3) ? q2:0; /分頻電路 always (posedge clk or negedge nrst)if (nrst) q0=0;else q0= q0;always (posedge clk or neg

19、edge nrst)if (nrst) q1=0;else q1= q1;always (posedge clk or negedge nrst)if (nrst) q2=0;else q2= q2;endmodule同步設計的例子:時鐘分頻器任意數(shù)目分頻的分頻器漣波計數(shù)器只能針對2的冪次做分頻,實際應用中可能要求做任意數(shù)目分頻最直觀的方法是以計數(shù)器為基礎,再以比較器比較計數(shù)器的值作為輸出。這種方法可行,但是存在這樣的問題:輸出的時鐘信號是組合邏輯輸出,可能會有毛刺產(chǎn)生。在本例中使分頻的時鐘輸出為觸發(fā)器輸出,同時可以滿足:輸出時鐘信號頻率=輸入時鐘信號頻率/(分頻倍數(shù)+1) 同步設計的例子:時

20、鐘分頻器在本例中ATPG作為控制信號,保證在ATPG模式下輸出的時鐘信號是來源的時鐘信號本身另外,假定寄存器的值由CPU設定,寫入的頻率與來源時鐘頻率不同頻,因此需要考慮亞穩(wěn)態(tài)問題。同步設計的例子:并入串出的移位寄存器例:以load信號加載,以start_shift來啟動串行輸出的移位寄存器。 timescale 1ns/1ps module top; /testbench parameter ran = 4hd; reg clk = 0; nrst =1; reg load = 0; start_shleft = 0; reg start_shright = 0; initial begin

21、 #70 nrst =0; #45 nrst = 1; #20 load = 1; #20 load = 0; #40 start_shleft = 1; end always #20 clk = clk; /end of testbench同步設計的例子:并入串出的移位寄存器/ start of circuit description reg 3:0 data; always (posedge clk or negedge nrst) if (nrst) data = 0; else if (load) data = ran; else if (start_shleft) data = (d

22、ata 1); /parallel input,left shift else if (start_shright) data 1); /parallel input, right shift reg dout; always (posedge clk or negedge nrst) if (nrst) dout = 0; else if (start_shleft) dout = data3; /left shift, serial out else if (start_shright) dout = dout0; / right shift, serial outendmodule同步設計的例子:串入并出的移位寄存器/ 以start信號加載,以den信號表示輸出使能的移位寄存器 timescale 1ns/1ps module top; / start of testbench reg clk = 0; nrst = 1; bit = 0; reg start = 0; initial begin #70 nrst = 0;

溫馨提示

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

評論

0/150

提交評論