第4講 Verilog HDL高級編程技術_第1頁
第4講 Verilog HDL高級編程技術_第2頁
第4講 Verilog HDL高級編程技術_第3頁
第4講 Verilog HDL高級編程技術_第4頁
第4講 Verilog HDL高級編程技術_第5頁
已閱讀5頁,還剩54頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第四講第四講 Verilog HDL高級編程技術高級編程技術參見課本的第參見課本的第4,9,10章章v加法器設計加法器設計v乘法器設計乘法器設計v除法器的設計除法器的設計v奇數分頻與小數分頻奇數分頻與小數分頻v有限狀態機設計有限狀態機設計v基于宏功能模塊的設計基于宏功能模塊的設計v設計的可綜合性設計的可綜合性加法器設計加法器設計v加法、乘法作為基本的運算,大量應用在數字信加法、乘法作為基本的運算,大量應用在數字信號處理和數字通信的各種算法中。由于加法器、號處理和數字通信的各種算法中。由于加法器、乘法器使用頻繁,所以其速度往往影響著整個系乘法器使用頻繁,所以其速度往往影響著整個系統的運行速度。如

2、果可實現快速加法器和快速乘統的運行速度。如果可實現快速加法器和快速乘法器的設計,則可以提高整個系統的速度。法器的設計,則可以提高整個系統的速度。v加法運算是最基本的運算,在多少情況下,無論加法運算是最基本的運算,在多少情況下,無論是乘法、除法、加法還是是乘法、除法、加法還是FFT等運算,最終都可等運算,最終都可以分解為加法運算來實現。以分解為加法運算來實現。v加法運算有:級連加法器、并行加法器、超前進加法運算有:級連加法器、并行加法器、超前進位加法器、流水線加法器等位加法器、流水線加法器等v 1.級連加法器的設計見課本級連加法器的設計見課本P184-P185。 級連加法器是由級連加法器是由1位

3、全加器級連構成的,本級的進位輸出作為位全加器級連構成的,本級的進位輸出作為下一級的進位輸入。下一級的進位輸入。 級連加法器結構簡單,但級連加法器結構簡單,但N位級連加法運算的延時是位級連加法運算的延時是1位全加位全加器的器的N倍,延時主要是進位信號級連造成倍,延時主要是進位信號級連造成的。在需要高性能的的。在需要高性能的設計中,這種加法結構不宜采用。設計中,這種加法結構不宜采用。例程如下:例程如下:module full_add1(a,b,cin,sum,cout);input a,b,cin; output sum,cout; wire s1,m1,m2,m3;and (m1,a,b),(m

4、2,b,cin),(m3,a,cin);xor (s1,a,b),(sum,s1,cin);or (cout,m1,m2,m3);endmodulemodule add8(sum,cout,a,b,cin);input7:0 a,b; input cin; output7:0 sum; output cout;full_add1 f0(a0,b0,cin,sum0,cin1);full_add1 f1(a1,b1,cin1,sum1,cin2);full_add1 f2(a2,b2,cin2,sum2,cin3);full_add1 f3(a3,b3,cin3,sum3,cin4);full_

5、add1 f4(a4,b4,cin4,sum4,cin5);full_add1 f5(a5,b5,cin5,sum5,cin6);full_add1 f6(a6,b6,cin6,sum6,cin7);full_add1 f7(a7,b7,cin7,sum7,cout);endmodule v2.并行加法器:并行加法器可采用并行加法器:并行加法器可采用Verilog HDL的的加法運算符直接描述加法運算符直接描述,借助于,借助于EDA綜合軟件和綜合軟件和HDL描述語言,實現起來很容易,描述語言,實現起來很容易,其運算速度快,但耗用其運算速度快,但耗用資源多,尤其是當加法運算的位數較寬時資源多,尤

6、其是當加法運算的位數較寬時,其耗用的,其耗用的資源將會較大。資源將會較大。module add_bx(cout,sum,a,b,cin);input7:0 a,b; input cin; output7:0 sum; output cout;assign cout,sum = a+b+cin;endmodulev3.流水線加法器:流水線加法器: 為保證數據吞吐率,電路設計中的一個主要問題就為保證數據吞吐率,電路設計中的一個主要問題就是要維持系統時鐘的速度處于或高于某一頻率。例如,是要維持系統時鐘的速度處于或高于某一頻率。例如,如果整個系統是一個全同步時鐘,同時又必須運行在如果整個系統是一個全同

7、步時鐘,同時又必須運行在25MHz的頻率上,那么,從任何寄存器的輸出到它的頻率上,那么,從任何寄存器的輸出到它饋給信號的寄存器輸入路徑間的最大時延必須小于饋給信號的寄存器輸入路徑間的最大時延必須小于40ns。如果通過某些復雜邏輯的延時路徑比較長,。如果通過某些復雜邏輯的延時路徑比較長,系統時鐘的速度就很難維持。這時,就必須在組合邏系統時鐘的速度就很難維持。這時,就必須在組合邏輯間插入觸發器,使復雜的組合邏輯形成流水線。雖輯間插入觸發器,使復雜的組合邏輯形成流水線。雖然流水線會增加器件資源的使用,但它降低了寄存器然流水線會增加器件資源的使用,但它降低了寄存器間的傳播延時,保證系統維持高的系統時鐘

8、速度。間的傳播延時,保證系統維持高的系統時鐘速度。 v 流水線設計的基本思想是在邏輯電路中加入若干寄存器來暫存流水線設計的基本思想是在邏輯電路中加入若干寄存器來暫存中間結果,雖然多用了一些寄存器資源,但減少了每一級組合中間結果,雖然多用了一些寄存器資源,但減少了每一級組合電路的時延,因此可提高整個電路的運行效率。電路的時延,因此可提高整個電路的運行效率。v 流水線設計可有效提高系統的工作頻率,尤其是對于流水線設計可有效提高系統的工作頻率,尤其是對于FPGA器器件。件。FPGA的邏輯單元中有大量的邏輯單元中有大量4到到5變量的查找表變量的查找表(LUT)以以及大量的觸發器,因此在及大量的觸發器,

9、因此在FPGA設計中采用流水線技術可以有設計中采用流水線技術可以有效提高系統的速度。效提高系統的速度。v 實際中的乘法器大多是有時鐘引腳的,以連續不斷地進行乘法實際中的乘法器大多是有時鐘引腳的,以連續不斷地進行乘法運算。在有時鐘信號的乘法器中,可以采用流水線設計技術,運算。在有時鐘信號的乘法器中,可以采用流水線設計技術,以提高系統的運行頻率。同樣加法器也可以采用流水線設計。以提高系統的運行頻率。同樣加法器也可以采用流水線設計。v 下面的例子就是一個兩個流水下面的例子就是一個兩個流水8位加法,由兩個位加法,由兩個4位加法器構位加法器構成,輸出存儲在寄存器中。成,輸出存儲在寄存器中。module

10、add8(cout,sum,a,b,cin,en);input7:0 a,b; input cin,en;output7:0 sum; output cout;reg7:0 sum; reg cout;reg3:0 tempa,tempb,firsts; reg firstc;always (posedge en)begin firstc,firsts=a3:0+b3:0+cin; tempa=a7:4; tempb=b7:4;endalways (posedge en)begin cout,sum7:4=tempa+tempb+firstc; sum3:0 = firsts;endendmo

11、dule乘法器設計乘法器設計v乘法器也頻繁使用在數字信號處理和數字通信的各種乘法器也頻繁使用在數字信號處理和數字通信的各種算法中,并且往往影響著整個系統的運行速度,所以算法中,并且往往影響著整個系統的運行速度,所以如果能實現快速乘法器的設計,可提高整個系統的處如果能實現快速乘法器的設計,可提高整個系統的處理速度。乘法器的設計方法主要有:并行運算理速度。乘法器的設計方法主要有:并行運算(純組合純組合邏輯邏輯)、移位相加、查找表、加法樹等。、移位相加、查找表、加法樹等。v1.并行乘法器:并行乘法器是純組合邏輯的乘法器,并行乘法器:并行乘法器是純組合邏輯的乘法器,完全由邏輯門實現。對于完全由邏輯門實

12、現。對于11乘法,只需乘法,只需1個與門即個與門即可實現,可實現,P=AB。對于。對于22乘法,根據課本乘法,根據課本P189的真值表可以得出結果表達式:的真值表可以得出結果表達式: 因此我們可以用與門、或門來實現。因此我們可以用與門、或門來實現。,011101201013bbabaapbbaap0000010110101011,bapbaabbabbabaapv 并行乘法器示例:并行乘法器示例:module mult(outcome,a,b);parameter size=8;inputsize:1 a,b; output2*size:1 coutcome;assign outcom=a*b

13、;endmodule并行乘法器隨著操作數位數加寬,耗用的資源迅速變多,如果將并行乘法器隨著操作數位數加寬,耗用的資源迅速變多,如果將上面的上面的8位并行乘法器適配到位并行乘法器適配到Cyclone系列的系列的EP1C3器件實器件實現的話,需耗用現的話,需耗用106個個LE單元。單元。而如果所用的而如果所用的FPGA器件中有嵌入式乘法器的話,則可采用嵌入器件中有嵌入式乘法器的話,則可采用嵌入式乘法器來實現乘法,比如將上例適配到式乘法器來實現乘法,比如將上例適配到Cyclone II系列的系列的EP2C5器件的話,只耗用器件的話,只耗用1個個LE單元和單元和1個個9位位*9位的嵌入式位的嵌入式乘法

14、器單元。乘法器單元。 因此,如果所用的因此,如果所用的FPGA器件中有硬件乘法器,建議用硬件乘器件中有硬件乘法器,建議用硬件乘法器來實現乘法操作,具有速度快,資源利用合理等優點。法器來實現乘法操作,具有速度快,資源利用合理等優點。v2.移位相加乘法器移位相加乘法器 移位相加乘法器將乘法變為加法實現,其設計思路是:乘法移位相加乘法器將乘法變為加法實現,其設計思路是:乘法通過逐次移位相加實現,每次判斷乘數的最低位,若為通過逐次移位相加實現,每次判斷乘數的最低位,若為1則將則將被乘數移位相加。被乘數移位相加。被乘數被乘數A 1101乘數乘數B 1011部分積部分積0 1101A左移左移 11010

15、部分積部分積1 100111A左移左移 000000部分積部分積2 100111A左移左移 1101000積積 10001111v 對于乘數中的第對于乘數中的第i位,若為位,若為1,則,則將被乘數左移將被乘數左移i位,并加到上次的位,并加到上次的部分積結果上。部分積結果上。(若為若為0可以看作可以看作只移位不相加。只移位不相加。)v 也可以依次判斷乘數也可以依次判斷乘數B的最低有的最低有效位是否為效位是否為1,若為,若為1則則P=P+A(部分積(部分積P在剛開始時要清在剛開始時要清0),),然后將被乘數然后將被乘數A左移左移1位,乘數位,乘數B右移右移1位位(并用并用0填補高位填補高位);當被

16、當被乘數全部變為乘數全部變為0后,乘法運算完后,乘法運算完成。成。 注:如果注:如果B的最低有效位為的最低有效位為0時,只需接著移位,不要相加時,只需接著移位,不要相加v移位相加乘法器是一種相對節省資源的設計方法,移位相加乘法器是一種相對節省資源的設計方法,為了實現為了實現nn乘法,需要一個乘法,需要一個2n位的左移寄存器位的左移寄存器(存放部分積),一個(存放部分積),一個n位的右移寄存器(可用除數位的右移寄存器(可用除數寄存器代替),一個寄存器代替),一個2n位加法器(被加數為部分積位加法器(被加數為部分積和被乘數,所以還需要一個被乘數寄存器),再加和被乘數,所以還需要一個被乘數寄存器),

17、再加少量的控制邏輯即可實現。尤其是當操作數位寬增少量的控制邏輯即可實現。尤其是當操作數位寬增加時,移位相加乘法器耗用的邏輯資源不會像并行加時,移位相加乘法器耗用的邏輯資源不會像并行乘法器那樣急劇增加。乘法器那樣急劇增加。v注:是先移位后相加注:是先移位后相加v移位相加乘法示例(移位相加乘法示例(0 x18600 * CNT16D3:0)Result20:17 = 4b0000; /部分積的高位先清零部分積的高位先清零mult16:0 = 17h186a0; /1000* 100 = 0 x186a0Result16:0 = CNT16D0 ? mult16:0 : 0;for(i = 1; i

18、 = 3; i = i + 1)begin if(CNT16Di=1) Result20:0=Result20:0+(mult16:0i);end注意:注意:for循環計算是在一個時鐘周期內完成的。循環計算是在一個時鐘周期內完成的。 v 或者程序改為或者程序改為(不能被綜合不能被綜合):Result20:0 = 21b0; /部分積先清零部分積先清零mult16:0 = 17h186a0; /被乘數被乘數while(CNT16D3:0 != 4b0) /注意注意while循環不能被綜合循環不能被綜合begin if(CNT16D0=1) begin Result20:0=Result20:01

19、; Result20:0=Result20:0+ mult16:0; end else begin Result20:0=Result20:01;endv 為何不能將為何不能將while(CNT16D3:0 != 4b0) 改成改成for循環然后判斷循環然后判斷CNT16D3:0 = 4b0時用時用break語語句跳出?句跳出?v 答答:因為因為Verilog中沒有中沒有break語句。語句。Verilog的的for循循環綜合后是硬件的重復,而環綜合后是硬件的重復,而C語言的語言的for是過程的重復。是過程的重復。所以說在所以說在Verilog中沒有中沒有break 。v3.查找表乘法器查找表

20、乘法器 查找表乘法器將乘積直接放在存儲器中,將操作查找表乘法器將乘積直接放在存儲器中,將操作數數(乘數和被乘數乘數和被乘數)作為地址訪問存儲器,得到的輸作為地址訪問存儲器,得到的輸出數據就是乘法運算的結果。查找表方式的乘法器出數據就是乘法運算的結果。查找表方式的乘法器速度只局限于所使用存儲器的存取速度。速度只局限于所使用存儲器的存取速度。 但由于查找表的規模隨著操作數位數的增加而迅但由于查找表的規模隨著操作數位數的增加而迅速增大,因此如果用于實現位數寬的乘法操作,需速增大,因此如果用于實現位數寬的乘法操作,需要要FPGA器件具有較大的片內存儲器模塊。比如,器件具有較大的片內存儲器模塊。比如,要

21、實現要實現8*8乘法器的地址位寬為乘法器的地址位寬為16位,字長為位,字長為16位(可能性為:位(可能性為:28*28=256*256),即存儲器),即存儲器大小為大小為1048576(1M)比特,用這么大的存儲器來比特,用這么大的存儲器來實現實現8*8乘法運算,顯然是不經濟的。乘法運算,顯然是不經濟的。v3.除法器設計:多數工具對除法(除法器設計:多數工具對除法(/)和求模)和求模(%)有有限制。如對除法操作,只有當除數是常數,且是限制。如對除法操作,只有當除數是常數,且是2的的指數時才支持。指數時才支持。v兩個無符號數相除的時序算法是要從被除數中重復地兩個無符號數相除的時序算法是要從被除數

22、中重復地減去除法,直到已檢測到余數小于除數。可以通過累減去除法,直到已檢測到余數小于除數。可以通過累計減法運算的次數而得到商;余數的最終值是減法運計減法運算的次數而得到商;余數的最終值是減法運算序列結束時被除數中的剩余值。算序列結束時被除數中的剩余值。v兩個有符號數相除的最簡單方法是先將兩數相除,然兩個有符號數相除的最簡單方法是先將兩數相除,然后調整結果的符號。其他方法則都比較復雜。后調整結果的符號。其他方法則都比較復雜。v 除法器的設計方法:除法器的設計方法:1. 一種是直接采用一種是直接采用Verilog的除法指令,如:的除法指令,如:k = 127 / i;(注意此種方法有綜合工具的限制

23、)(注意此種方法有綜合工具的限制)2. 另一種是采用移位減法來實現除法運算(先移位另一種是采用移位減法來實現除法運算(先移位后減);后減);3. 再一種是采用基于除法器宏功能模塊的設計。再一種是采用基于除法器宏功能模塊的設計。4. 還有一種是將整數除法轉換為小數乘法的方法實還有一種是將整數除法轉換為小數乘法的方法實現。(此時除數應為常數)現。(此時除數應為常數)v移位減法式除法器設計:移位減法式除法器設計:v除數應大于被除數的高部分除數應大于被除數的高部分 (否則不能保證商位為否則不能保證商位為1) ;在通用程序的編寫中,可以通過在被除數前面補在通用程序的編寫中,可以通過在被除數前面補0來來實

24、現。實現。v運算時先將運算時先將 被除數(被除數( 商商+余數)一起左移余數)一起左移1位,然后位,然后用被除數的高部分減去除數;用被除數的高部分減去除數;v判斷前面的減法是否夠減:夠減,則商加判斷前面的減法是否夠減:夠減,則商加1,減法結,減法結果保存為新的余數;果保存為新的余數; 不夠減,則商不加不夠減,則商不加1,減法結果也不要保存;,減法結果也不要保存;v 循環次數的確定:根據被除數位寬循環次數的確定:根據被除數位寬-除數位寬確定,因為移位減法到除數位寬確定,因為移位減法到最后被除數由余數最后被除數由余數+商給代替,而商給代替,而余數總是和除數的位寬相同,剩下余數總是和除數的位寬相同,

25、剩下的就是商的寬度(也就是需要循環的就是商的寬度(也就是需要循環的次數)。的次數)。v 如果保證程序的通用性的話(即被如果保證程序的通用性的話(即被除數的高位部分小于或等于除數),除數的高位部分小于或等于除數),一般在被除數前面一般在被除數前面+(除數位寬)(除數位寬)個個0,構成新的被除數,這時的循,構成新的被除數,這時的循環次數也就等于(原來被除數的位環次數也就等于(原來被除數的位寬數)。寬數)。100 | 00010100010100- 100 0101000- 100 1010000- 100 0010001- 101 0100010移位相減移位相減移位相減移位相減商要加商要加1010

26、0010移位相減移位相減移位相減移位相減余數余數+商商00101000101000v移位減法實現除法示例移位減法實現除法示例(被除數(被除數21+11=32位,除數位,除數11位)位) C = 0; F0 = 0; Result31:21 = 11d0; for(i = 0; i 21; i = i + 1) /確定循環次數確定循環次數 begin C = Result31; /保存移出的最高位保存移出的最高位 Result31:0 = Result31:0 = CNT11bD10:0) begin F0 = 1; Result31:21 = Result31:21 - CNT11bD10:0

27、; end else F0 = 0; if(C | F0) Result0 = 1; /商加商加1 end 思考:如果要把此除法變為流水線方式應該如何設計程序?思考:如果要把此除法變為流水線方式應該如何設計程序? 整數除法整數除法-小數乘法小數乘法v 整數除法也可以轉化為小數乘法,可以通過整數除法也可以轉化為小數乘法,可以通過SD編碼方式轉化為移位加減編碼方式轉化為移位加減法實現。如:法實現。如:x/278=x*0.0036vSD編碼(編碼(Signed Digit Numbers)是將十進制數用數相加減)是將十進制數用數相加減 的形式表示出來,該編碼與傳統的二進制編碼不同,它使用的形式表示出

28、來,該編碼與傳統的二進制編碼不同,它使用3個值來表個值來表 示數字,即示數字,即0,1,-1,其中,其中-1常寫為常寫為 。v 如為整數:如為整數:271032104101101000002100212 (下標表示進制)(下標表示進制)v 如為小數(將小數先乘以如為小數(將小數先乘以128):):t1 =128*0.8500=108.800=128-16-4+0.5+0.25+0.0625 = t2 = 128*0.0036=0.46080.50.03125 1SD101100sd)1101.00101100(sd) 11000. 0(v t1 = v v t2 = v 得到:得到:x1 *

29、t1 - x2 * t2 = (x17) (x1 2)2) v (x12) + x17,x17:1+x17,x7,x17:2v + x17,x7, x17,x7,x17:4 x27,x27:1 v x27, x27, x27, x27, x27, x27, x27:5v 得到結果后,再將結果右移得到結果后,再將結果右移7位位(因為剛開始的小數乘以了因為剛開始的小數乘以了128)。v 注:乘以注:乘以128的目的是把的目的是把SD碼的小數部分轉化為小于碼的小數部分轉化為小于8位(最位(最大大7位)的二進制小數,這樣計算結果的右移位數就可以控制位)的二進制小數,這樣計算結果的右移位數就可以控制在在

30、7位之內(最多右移位之內(最多右移7位),因為當一個字節右移位),因為當一個字節右移8位后就什位后就什么都沒有,只剩下么都沒有,只剩下0了。了。sd) 11000. 0(sd)1101.00101100(奇數分頻與小數分頻奇數分頻與小數分頻v1.奇數分頻奇數分頻 在實際應用中,我們經常會遇到這樣的問題,需要在實際應用中,我們經常會遇到這樣的問題,需要進行奇數次分頻,同時又要得到占空比是進行奇數次分頻,同時又要得到占空比是50%的方的方波波形。如果是偶數次分頻的話,得到占空比是波波形。如果是偶數次分頻的話,得到占空比是50%的方波并不困難,比如進行的方波并不困難,比如進行2N次分頻,只需在次分頻

31、,只需在計數到計數到N-1(從從0開始開始)時,波形翻轉即可;或者在最時,波形翻轉即可;或者在最后一級加一個后一級加一個2分頻器也可實現。如果是奇數次分頻分頻器也可實現。如果是奇數次分頻的話,可采用如下方法:用兩個計數器,一個由輸入的話,可采用如下方法:用兩個計數器,一個由輸入時鐘上升沿觸發,一個由輸入時鐘下降沿觸發,最后時鐘上升沿觸發,一個由輸入時鐘下降沿觸發,最后將兩個計數器的輸出相或,即可得到占空比為將兩個計數器的輸出相或,即可得到占空比為50%的方波波形。的方波波形。 下面的示例就實現了對輸入時鐘下面的示例就實現了對輸入時鐘CLK的的7分頻,同分頻,同時得到了占空比為時得到了占空比為5

32、0%的方波。的方波。module count7(rst,clk,cout);input clk,rst; output cout; reg2:0 m,n; wire cout; reg cnt1,cnt2;assign cout=cnt1|cnt2; /兩個計數器的輸出相或兩個計數器的輸出相或always (posedge clk)begin if(!rst) begin cnt1=0; m=0; end else if(rst) begin if(m=6) begin m=0; end else m=m+1; if(m=2) cnt1=cnt1; else if(m=5) cnt1=cnt1

33、; endendalways (negedge clk)begin if(!rst) begin cnt2=0; n=0; end else if(rst) begin if(n=6) begin n=0; end else n=n+1; if(n=2) cnt2=cnt2; else if(n=5) cnt2=cnt2; endendendmodule模模7奇數分頻器功能仿真波形圖奇數分頻器功能仿真波形圖v 2.半整數分頻半整數分頻 設有一個設有一個5MHz的時鐘信號,但需要得到的時鐘信號,但需要得到2MHz的時鐘,分的時鐘,分頻比為頻比為2.5,此時可采用半整數分頻器。其設計思想為:要實,

34、此時可采用半整數分頻器。其設計思想為:要實現現2.5分頻,可先設計一個模分頻,可先設計一個模3分頻器,再設計一個脈沖扣除分頻器,再設計一個脈沖扣除電路,加在模電路,加在模3計數器之后,每來計數器之后,每來3個脈沖就扣除半個脈沖,個脈沖就扣除半個脈沖,即可實現分頻系數為即可實現分頻系數為2.5的半整數分頻。采用類似的方法可實的半整數分頻。采用類似的方法可實現任意半整數分頻。下圖所示為半整數分頻器原理圖。通過異現任意半整數分頻。下圖所示為半整數分頻器原理圖。通過異或門和或門和2分頻模塊組成脈沖扣除電路,脈沖扣除正是輸入頻率分頻模塊組成脈沖扣除電路,脈沖扣除正是輸入頻率與與2分頻輸出異或的結果。分頻

35、輸出異或的結果。XOR輸入時鐘 clkin2分頻模N計數器clk2clk1輸出時鐘 clkout下面是采用上述原理設計的下面是采用上述原理設計的5.5分頻的程序。分頻的程序。module fdiv5_5(clkin,clr,clkout);input clkin,clr; output clkout; reg clkout,clk1; wire clk2; integer cnt;xor xor1(clk2,clkin,clk1); /異或異或always (posedge clkout or negedge clr) /2分頻器分頻器begin if(!clr) begin clk1=1b0

36、; end else clk1=clk1;endalways (posedge clk2 or negedge clr) /模模5分頻器分頻器begin if(!clr) begin cnt=0; clkout=1b0; end else if(cnt=5) /更改更改cnt的值,即可實現不同模的半整數分頻,比如的值,即可實現不同模的半整數分頻,比如6.5,7.5等等 begin cnt=0; clkout=1b1; end else begin cnt=cnt+1; clkout=1b0; endendendmodule v3.小數分頻小數分頻 在實際應用中,還經常會遇到小數分頻。實現小在實

37、際應用中,還經常會遇到小數分頻。實現小數分頻可采用兩種方法:數分頻可采用兩種方法:v一種是用數字鎖相環實現,先利用鎖相環電路將輸入一種是用數字鎖相環實現,先利用鎖相環電路將輸入時鐘倍頻,然后再利用分頻器對新產生的高頻信號進時鐘倍頻,然后再利用分頻器對新產生的高頻信號進行分頻得到需要的時鐘頻率。比如要實現行分頻得到需要的時鐘頻率。比如要實現5.7分頻,分頻,可以先將輸入的時鐘可以先將輸入的時鐘10倍頻,然后再將倍頻后的時倍頻,然后再將倍頻后的時鐘鐘57分頻,這樣即可精確實現分頻,這樣即可精確實現5.7的小數分頻。這的小數分頻。這種方法的好處是可以做到精確分頻,但是需要器件內種方法的好處是可以做到

38、精確分頻,但是需要器件內包含鎖相環電路包含鎖相環電路PLL。v還有一種方法可大致實現小數分頻(不精確),即先還有一種方法可大致實現小數分頻(不精確),即先設計兩個不同分頻比的整數分頻器,然后通過控制兩設計兩個不同分頻比的整數分頻器,然后通過控制兩種分頻比出現的不同次數來獲得所需要的小數分頻值,種分頻比出現的不同次數來獲得所需要的小數分頻值,從而實現從而實現平均意義上的小數分頻平均意義上的小數分頻。下例就是實現的一個分頻系數為下例就是實現的一個分頻系數為8.1的小數分頻器,通過計數器先做的小數分頻器,通過計數器先做9次次8分頻,分頻,再做一次再做一次9分頻,這樣總的分頻值分頻,這樣總的分頻值(1

39、0次分頻的平均值次分頻的平均值)為為: N=(8*9+9*1)/(9+1)=8.1module fdiv8_1(clkin,rst,clkout);input clkin,rst; output clkout; reg clkout;reg3:0 cnt1,cnt2;always (posedge clkin or negedge rst)begin if(!rst) begin cnt1=0; cnt2=0; clkout=0; end else if(cnt19)/9次次8分頻分頻 begin if(cnt27) begin cnt2=cnt2+1; clkout=0; end else

40、begin cnt2=0; cnt1=cnt1+1; clkout=1; end end else begin/1次次9分頻分頻 if(cnt28) begin cnt2=cnt2+1; clkout=0; end else begin cnt2=0; cnt1=0; clkout=1; end endendendmodule8.1小數分頻功能仿真波形小數分頻功能仿真波形思考:如果分頻系數為思考:如果分頻系數為 7.2 應該怎么做?應該怎么做?有限狀態機設計有限狀態機設計v有限狀態機有限狀態機(Finite State Machine, FSM)是一種是一種很重要的時序邏輯電路,尤其適合設計數

41、字系統的控很重要的時序邏輯電路,尤其適合設計數字系統的控制模塊,是許多數字電路的核心部件。有限狀態機的制模塊,是許多數字電路的核心部件。有限狀態機的標準模型主要由三部分組成:一是次態組合邏輯電路,標準模型主要由三部分組成:一是次態組合邏輯電路,二是由狀態觸發器構成的現態時序邏輯電路,三是輸二是由狀態觸發器構成的現態時序邏輯電路,三是輸出組合邏輯電路。出組合邏輯電路。v根據電路的輸出信號是否與電路的輸入有關,有限狀根據電路的輸出信號是否與電路的輸入有關,有限狀態機可分為兩種類型:一類是態機可分為兩種類型:一類是Mealy(米莉米莉)型狀態機,型狀態機,其輸出信號不僅與電路的當前狀態有關,還與電路

42、的其輸出信號不僅與電路的當前狀態有關,還與電路的輸入有關;另一類是輸入有關;另一類是Moore(摩爾摩爾)型狀態機,其輸出型狀態機,其輸出狀態僅與電路的當前狀態有關,與電路的輸入無關。狀態僅與電路的當前狀態有關,與電路的輸入無關。v 狀態機一般都應設計為同步方式,并由一個時鐘信號來觸發。實用的狀態機一般都應設計為同步方式,并由一個時鐘信號來觸發。實用的狀態機都應該設計為由唯一時鐘邊沿觸發的同步運行方式。狀態機都應該設計為由唯一時鐘邊沿觸發的同步運行方式。組合邏輯狀態寄存器組合邏輯Mealy型Moore型時鐘輸入狀態轉移圖的繪制(檢測序列狀態轉移圖的繪制(檢測序列110)s00/01/0s10/

43、0s21/01/0s30/10/01/0s0:0 s1:1 s2:11 s3:110起始狀態狀態轉移圖的繪制(檢測序列狀態轉移圖的繪制(檢測序列0101)s00/0s11/0s0:0 s1:01 s2:010 s3:1(無效狀態無效狀態) s4:0101s20/0s31/00/0s41/11/01/00/00/00/0起始狀態如何進行狀態機編程如何進行狀態機編程v對于對于Mealy型型FSM電路來說,由于電路的輸出除了與電路的現電路來說,由于電路的輸出除了與電路的現態有關外,還與電路的輸入信號有關,如果輸入信號的變化不能態有關外,還與電路的輸入信號有關,如果輸入信號的變化不能及時被檢測,而要等

44、待時鐘有效沿到來時才進行檢測的話,則電及時被檢測,而要等待時鐘有效沿到來時才進行檢測的話,則電路的輸出很可能是錯誤的(例如在上次時鐘有效沿和本次時鐘有路的輸出很可能是錯誤的(例如在上次時鐘有效沿和本次時鐘有效沿之間往自動售貨機里快速投入一枚硬幣)。所以在設計效沿之間往自動售貨機里快速投入一枚硬幣)。所以在設計FSM電路時,建議采用兩個電路時,建議采用兩個always塊或者三個塊或者三個always塊的方法進行描塊的方法進行描述。也就是說,若時鐘周期相對過長,則會漏掉輸入信號。即與述。也就是說,若時鐘周期相對過長,則會漏掉輸入信號。即與輸入信號有關的硬件描述語言采用組合邏輯形式。輸入信號有關的硬

45、件描述語言采用組合邏輯形式。v狀態編碼的定義:狀態編碼的定義:parameter方式(一般采用該方式)和方式(一般采用該方式)和define方式。方式。v狀態轉換的描述:一般使用狀態轉換的描述:一般使用case、casez和和casex語句來描述語句來描述狀態之間的轉換,用狀態之間的轉換,用case語句表述比用語句表述比用if-else語句更清晰明了。語句更清晰明了。此外在此外在case語句的最后,不要忘了加上語句的最后,不要忘了加上default分支語句,以避免分支語句,以避免鎖存器的產生。鎖存器的產生。用兩個用兩個always塊描述電路塊描述電路(檢測序列檢測序列110)module pu

46、sle(data,clk,nclr,out);input data,clk,nclr; output out; reg out;reg2:0 current_state,next_state;parameter1:0 s0=0,s1=1,s2=2,s3=3;always (posedge clk) /the state registerbegin if(!nclr) current_state=s0; else current_state=next_state;end/the combination logic,assign the next_statealways (current_stat

47、e or data)begin case(current_state) s0: begin out=0; next_state=(data=1)?s1:s0; end s1: begin out=0; next_state=(data=1)?s2:s0; end s2: if(data=1) begin out=0; next_state=s2; end else begin out=1; next_state=s3; end s3: begin out=0; next_state=(data=1)?s1:s0; end endcaseendendmodule用三個用三個always塊描述電路

48、塊描述電路(檢測序列檢測序列110)module pusle(data,clk,nclr,out);input data,clk,nclr; output out; reg out;reg2:0 current_state,next_state;parameter1:0 s0=0,s1=1,s2=2,s3=3;always (posedge clk) /the state registerbegin if(!nclr) current_state=s0; else current_state10),引起邏輯),引起邏輯錯誤。錯誤。v 格雷編碼相鄰狀態每次只有一個比特位產生變格雷編碼相鄰狀態每次

49、只有一個比特位產生變化(化(00、01、11、10),減少了瞬變次數,),減少了瞬變次數,也減少了產生毛刺和一些暫態的可能。也減少了產生毛刺和一些暫態的可能。 一位熱碼編碼即采用一位熱碼編碼即采用n位(或位(或n個觸發器)來編碼個觸發器)來編碼n個狀態的狀態機(如個狀態的狀態機(如1000、0100、0010、0001)。這樣雖然多用了觸發器)。這樣雖然多用了觸發器 ,但可以有效節省和簡化組合電路。,但可以有效節省和簡化組合電路。對于寄存器數量多而門邏輯相對缺乏的對于寄存器數量多而門邏輯相對缺乏的FPGA器件來器件來說,采用該方式可以有效提高電路的速度和可靠性,說,采用該方式可以有效提高電路的

50、速度和可靠性,也有利于提高器件資源的利用率。因此,對于也有利于提高器件資源的利用率。因此,對于FPGA器件建議采用該編碼方式。器件建議采用該編碼方式。v采用一位熱碼編碼后,會出現一些多余的狀態,即一采用一位熱碼編碼后,會出現一些多余的狀態,即一些無效的狀態。因此,如果用些無效的狀態。因此,如果用case語句來描述的話,語句來描述的話,需要增加需要增加default分支項,以便在這些狀態下能自動分支項,以便在這些狀態下能自動回到起始狀態。回到起始狀態。v 對于對于Mealy型型FSM電路來說,即使狀態變化采用格雷碼或一電路來說,即使狀態變化采用格雷碼或一位熱碼編碼輸出方式也不能保證輸出穩定。因為

51、一般位熱碼編碼輸出方式也不能保證輸出穩定。因為一般Mealy型型FSM電路的最后一級是采用輸入信號和當前狀態組成組合電路的最后一級是采用輸入信號和當前狀態組成組合邏輯電路的方式,而組合邏輯電路不可避免的產生競爭冒險邏輯電路的方式,而組合邏輯電路不可避免的產生競爭冒險(如果輸入信號是兩位以上)。這時有一種方法可以很好地消(如果輸入信號是兩位以上)。這時有一種方法可以很好地消除這種輸出結果不穩定現象:就是在最后的輸出端再加一級鐘除這種輸出結果不穩定現象:就是在最后的輸出端再加一級鐘控寄存器,就可以不受組合邏輯輸出競爭冒險的影響。控寄存器,就可以不受組合邏輯輸出競爭冒險的影響。 組合邏輯狀態寄存器組

52、合邏輯Mealy型Moore型時鐘輸入輸出緩沖寄存器基于宏功能模塊的設計基于宏功能模塊的設計v Quartus II為設計者提供了豐富的宏功能模塊庫,采用宏功為設計者提供了豐富的宏功能模塊庫,采用宏功能模塊完成設計可極大提高電路設計的效率和可靠性。能模塊完成設計可極大提高電路設計的效率和可靠性。v Quartus II軟件自帶的宏模塊庫主要有三個,分別是軟件自帶的宏模塊庫主要有三個,分別是Megafunctions庫、庫、Maxplus2庫和庫和Primitives庫。庫。v Megafunctions庫是參數化模塊庫(庫是參數化模塊庫(Library of Parametrized Modu

53、les, LPM),庫中是一些經過驗證),庫中是一些經過驗證的功能模塊,用戶可以根據自己的需要設定模塊的端口的功能模塊,用戶可以根據自己的需要設定模塊的端口(Ports)和參數和參數(Parameters),即可完成模塊的定制。,即可完成模塊的定制。v 按照按照Megafunctions庫中模塊的功能,將其分為算術運算庫中模塊的功能,將其分為算術運算模塊庫模塊庫(arithmetic)、邏輯門庫、邏輯門庫(gates)、存儲器庫、存儲器庫(storage)和和IO模塊庫模塊庫(I/O)四個子庫。四個子庫。v 有乘法器模塊、除法器模塊、計數器模塊、常數模塊、鎖相環有乘法器模塊、除法器模塊、計數器

54、模塊、常數模塊、鎖相環模塊、存儲器模塊等。模塊、存儲器模塊等。時鐘樹時鐘樹復雜的時鐘方案復雜的時鐘方案組合邏輯反饋循環和脈沖發生器組合邏輯反饋循環和脈沖發生器存儲器,存儲器,IO專用宏單元專用宏單元總做得和你一樣好總做得和你一樣好 綜合工具不能勝任的工作設計的可綜合性設計的可綜合性綜合工具善于優化組合邏輯。但設計中有很大一部分不是組合邏輯。綜合工具善于優化組合邏輯。但設計中有很大一部分不是組合邏輯。例如,時鐘樹。時鐘樹是全局的、芯片范圍的問題。在沒有版圖布局信息的情況下,例如,時鐘樹。時鐘樹是全局的、芯片范圍的問題。在沒有版圖布局信息的情況下,要給出較優的結果,綜合工具對塊的大小有一定的限制。

55、要給出較優的結果,綜合工具對塊的大小有一定的限制。綜合工具不能很好地處理復雜時鐘。通常,只允許要綜合的塊含有一個時鐘。但設綜合工具不能很好地處理復雜時鐘。通常,只允許要綜合的塊含有一個時鐘。但設計中經常使用兩相時鐘或在雙沿時鐘。計中經常使用兩相時鐘或在雙沿時鐘。綜合工具不易實現脈沖產生邏輯,如單個脈沖,或結果依賴于反饋路徑延遲的組合綜合工具不易實現脈沖產生邏輯,如單個脈沖,或結果依賴于反饋路徑延遲的組合反饋邏輯。對這種情況,插入延遲元件使一個信號推遲到達的效果并不好。反饋邏輯。對這種情況,插入延遲元件使一個信號推遲到達的效果并不好。不能用綜合產生大塊存儲器,因為綜合工具會用不能用綜合產生大塊存

56、儲器,因為綜合工具會用flip-flop實現。實現。不是所有的綜合工具都能很好地從工藝庫里挑選擇大的單元或宏單元,這需要用戶不是所有的綜合工具都能很好地從工藝庫里挑選擇大的單元或宏單元,這需要用戶人工實例化。一些宏單元,例如大的結構規則的數據通路元件,最好使用生產商提人工實例化。一些宏單元,例如大的結構規則的數據通路元件,最好使用生產商提供的硅編譯器產生。供的硅編譯器產生。綜合工具不保證產生最小結果。通常綜合結果不如人工結果,只要你有足夠的時間。綜合工具不保證產生最小結果。通常綜合結果不如人工結果,只要你有足夠的時間。 綜合工具不能勝任的工作綜合工具不能勝任的工作 不要引入不必要的不要引入不必

57、要的latch 敏感表要完整敏感表要完整 非結構化的非結構化的for循環循環 資源共享資源共享其它要注意的問題其它要注意的問題 條件分支不完全的條件語句(條件分支不完全的條件語句(if和和case語句)將會產生鎖存器語句)將會產生鎖存器always (cond_1) begin if (cond_1) data_out = data_in;endalways (sel or a or b or c or d) begin case (sel) 2b00: a = b; 2b01: a = c; 2b10: a = d; endcase end不要產生不需要的不要產生不需要的latch不完整的的

58、敏感表將引起綜合后網表的仿真結果與以前的不一致。不完整的的敏感表將引起綜合后網表的仿真結果與以前的不一致。always (d or clr) if (clr) q = 1b0; else if (e) q = d;always (d or clr or e) if (clr) q = 1b0; else if (e) q = d;敏感表要完整敏感表要完整綜合工具處理循環的方法是將循環內的結構重復。在循環中包含不變綜合工具處理循環的方法是將循環內的結構重復。在循環中包含不變化的表達式會使綜合工具花很多時間優化這些冗余邏輯。化的表達式會使綜合工具花很多時間優化這些冗余邏輯。for( I =0; i

59、4; i=i+1) begin sig1 = sig2; - unchanging statement data_outI = data_inI;endsig1 = sig2; - unchanging statementfor( I =0; i4; i=i+1) data_outI = data_inI;非結構化的非結構化的for循環循環只有在同一個條件語句只有在同一個條件語句(if和和case)不同的分支中的算術操作才會共享。不同的分支中的算術操作才會共享。條件操作符條件操作符 ?: 中的算術操作不共享。中的算術操作不共享。if (cond) z = a + b;else z = c +

60、d;Z = (cond) ? (a + b) : (c + d);資源共享資源共享利用括號分割邏輯。利用括號分割邏輯。z = a + b + c + d;Z = (a + b) + (c + d);+ab+c+zd+ab+cd+z括號的作用括號的作用在進行可綜合的數字系統設計時,應特別注意以下一些要點:在進行可綜合的數字系統設計時,應特別注意以下一些要點:v 1).不使用初始化語句;不使用帶有延時的描述;不使用循環次數不確定的循不使用初始化語句;不使用帶有延時的描述;不使用循環次數不確定的循環語句,如環語句,如forever,while等。等。v 2 ).應盡量采用同步方式設計電路。應盡量采用

溫馨提示

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

評論

0/150

提交評論