數字系統(tǒng)設計與Verilog HDL_第1頁
數字系統(tǒng)設計與Verilog HDL_第2頁
數字系統(tǒng)設計與Verilog HDL_第3頁
數字系統(tǒng)設計與Verilog HDL_第4頁
數字系統(tǒng)設計與Verilog HDL_第5頁
已閱讀5頁,還剩95頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 XXXXXXXX大學大學XXXXXX學院學院第第9章章 Verilog數字電路設計實踐數字電路設計實踐 主要內容主要內容基本組合電路的設計基本組合電路的設計1 1ABFCD門級結構描述門級結構描述 module gate1(F,A,B,C,D);input A,B,C,D;output F;nand(F1,A,B); /調用門元件調用門元件and(F2,B,C,D);or(F,F1,F2);endmodule數據流描述數據流描述module gate2(F,A,B,C,D);input A,B,C,D;output F;assign F=(A&B)|(B&C&D);/

2、assign持續(xù)賦值持續(xù)賦值endmodule行為描述行為描述module gate3(F,A,B,C,D);input A,B,C,D;output F;reg F;always (A or B or C or D)/過程賦值過程賦值beginF=(A&B)|(B&C&D);endendmodule基本組合電路的設計基本組合電路的設計2 2用用bufif1關鍵字描述的三態(tài)門關鍵字描述的三態(tài)門 module tri_1 (in, en, out);input in, en;output out;tri out;bufif1 b1(out, in, en);/注意三態(tài)門端

3、口的排列順序注意三態(tài)門端口的排列順序endmodule用用assign語句描述三態(tài)門語句描述三態(tài)門 用用MAX+PLUS II進行編譯,生成上圖所示的模塊符號。進行編譯,生成上圖所示的模塊符號?;窘M合電路的設計基本組合電路的設計 33-to-8 decodermodule decoder_38(out, in);output7:0 out;input2:0 in;reg7:0 out;always (in) begin case(in) 3d0: out=8b11111110; 3d1: out=8b11111101; 3d2: out=8b11111011; 3d3: out=8b1111

4、0111; 3d4: out=8b11101111; 3d5: out=8b11011111; 3d6: out=8b10111111; 3d7: out=8b01111111; endcase endendmodule28-3的優(yōu)先編碼器的優(yōu)先編碼器 作為條件語句,作為條件語句,if-else語句的分支是有優(yōu)先順序的。利用語句的分支是有優(yōu)先順序的。利用if-else語語句的特點,可以很方便地實現優(yōu)先編碼器。句的特點,可以很方便地實現優(yōu)先編碼器。 下面的例子是一個下面的例子是一個8-3優(yōu)先編碼器,該編碼器輸人為優(yōu)先編碼器,該編碼器輸人為a、b、c、d、e、f、g和和h,輸人信號高電平有效,輸人

5、信號高電平有效,h的優(yōu)先級最高。的優(yōu)先級最高。續(xù)續(xù)符號符號 用用QuartusII軟件對上面的代碼綜合后,生成一個模塊符號,再加上輸入輸出軟件對上面的代碼綜合后,生成一個模塊符號,再加上輸入輸出端口,即構成了如下圖所示的優(yōu)先編碼器電路。端口,即構成了如下圖所示的優(yōu)先編碼器電路。對該編碼器進行仿真,得到如下圖所示的波形對該編碼器進行仿真,得到如下圖所示的波形基本組合電路的設計基本組合電路的設計 4奇偶校驗位產生器奇偶校驗位產生器 module parity(even_bit, odd_bit, input_bus);output even_bit, odd_bit;input7:0 input_

6、bus;assign odd_bit = input_bus;/產生奇校驗位產生奇校驗位assign even_bit = odd_bit;/產生偶校驗位產生偶校驗位endmodule基本組合電路的設計基本組合電路的設計 5用用if-else語句描述的語句描述的4選選1 MUXmodule mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input1:0 sel;reg out;always (in0 or in1 or in2 or in3 or sel) beginif(sel=2b00) out=in0;e

7、lse if(sel=2b01) out=in1;else if(sel=2b10) out=in2;else out=in3; endendmodule7段段LED數碼管譯碼電路數碼管譯碼電路輸出信號的輸出信號的7位分別接如下圖數碼管的位分別接如下圖數碼管的7個段,高位在左,低個段,高位在左,低位在右。位在右。例如當輸出為例如當輸出為“1101101”時,數碼管的時,數碼管的7個段:個段:g、f、e、d、c、b、a分別接分別接1、1、0、1、1、0、1;接有高電平的段發(fā)亮,于;接有高電平的段發(fā)亮,于是數碼管顯示是數碼管顯示“5”。共陰數碼管及其電路共陰數碼管及其電路源程序源程序組合邏輯設計要

8、點組合邏輯設計要點 組合邏輯設計要點組合邏輯設計要點 結論結論組合電路的輸入一旦有變化,輸出馬上跟著變化組合電路的輸入一旦有變化,輸出馬上跟著變化組合電路一般都用組合電路一般都用assign語句語句當用當用always描述純組合電路時,括號內的敏感列描述純組合電路時,括號內的敏感列表要把表要把所有的輸入所有的輸入列出來列出來基本時序電路的設計基本時序電路的設計 1 D-FF designs(基本基本D觸發(fā)器觸發(fā)器)module DFF(Q, D, CLK);output Q;input D, CLK;reg Q;always (posedge CLK)beginQ = D;endendmodu

9、le基本時序電路的設計基本時序電路的設計 2 帶異步清帶異步清0、異步置、異步置1的的D觸發(fā)器觸發(fā)器module DFF1(q, qn, d, clk, set, reset);input d, clk, set, reset;output q, qn;reg q, qn;always (posedge clk or negedge set or negedge reset) beginif (!reset) beginq = 0;/異步清異步清0,低電平有效,低電平有效qn = 1;end else if (!set) beginq = 1;/異步置異步置1,低電平有效,低電平有效qn =

10、0;end else beginq = d;qn = d;end endendmodule基本時序電路的設計基本時序電路的設計 3 帶同步清帶同步清0、同步置、同步置1的的D觸發(fā)器觸發(fā)器module DFF2(q, qn, d, clk, set, reset);input d, clk, set, reset;output q, qn;reg q, qn;always (posedge clk) beginif (reset) begin q=0;qn=1; end /同步清同步清0,高電平有效,高電平有效else if (set) begin q =1;qn =0; end /同步置同步置

11、1,高電平有效,高電平有效else begin q=d; qn=d;end endendmodule數據鎖存器數據鎖存器1.數據鎖存器數據鎖存器a 下面用下面用assign語句描述了一個電平敏感(觸發(fā))的數據鎖存器,該鎖存語句描述了一個電平敏感(觸發(fā))的數據鎖存器,該鎖存器只能鎖存一位數據器只能鎖存一位數據always (clk or d) begin if(clk) q=d; endassign用always置換:2. 數據鎖存器數據鎖存器b下面代碼描述的是一個帶置位和復位端的電平敏感型的下面代碼描述的是一個帶置位和復位端的電平敏感型的1位數據鎖存器。位數據鎖存器。always (clk o

12、r reset or set or d) begin if(reset) q=0; else if(set) q=1; else if(clk) q=d; end assign用always置換:基本時序電路的設計基本時序電路的設計 4 8位數據鎖存器位數據鎖存器module latch_8(qout,data,clk);output7:0 qout;input7:0 data;input clk;reg7:0 qout;always (clk or data) beginif(clk) qout=data; endendmodule數據寄存器數據寄存器數據鎖存器和數據寄存器的區(qū)別:數據鎖存器

13、和數據寄存器的區(qū)別:從寄存數據的角度看,鎖存器和寄存器的功能是相從寄存數據的角度看,鎖存器和寄存器的功能是相同的同的鎖存器一般是由電平信號來控制(電平觸發(fā)),屬鎖存器一般是由電平信號來控制(電平觸發(fā)),屬于電平敏感型于電平敏感型寄存器一般由同步時鐘信號控制(邊沿觸發(fā))寄存器一般由同步時鐘信號控制(邊沿觸發(fā))基本時序電路的設計基本時序電路的設計5 58位數據寄存器位數據寄存器module reg8(out_data,in_data,clk,clr);output7:0 out_data;input7:0 in_data;input clk,clr;reg7:0 out_data;always (

14、posedge clk or posedge clr) beginif(clr) out_data =0;else out_data = in_data; endendmodule移位寄存器移位寄存器設計了一個設計了一個8位移位寄存器。該寄存器有位移位寄存器。該寄存器有1個時鐘輸個時鐘輸入端、入端、1個同步清個同步清0端。信號串行輸入,端。信號串行輸入,8位并行輸位并行輸出,每個時鐘周期內輸出信號左移出,每個時鐘周期內輸出信號左移1位,同時將串位,同時將串行輸入的行輸入的1位補充到輸出信號的最低位。位補充到輸出信號的最低位。續(xù)續(xù)基本時序電路的設計基本時序電路的設計6 6 可變模加法可變模加法/

15、減法計數器減法計數器module updown_count(d, clk, clear, load, up_down, qd);input7:0 d;input clk,clear,load,up_down;output7:0 qd;reg7:0 cnt;assign qd=cnt;always (posedge clk) beginif(!clear) cnt=8h00;/同步清同步清0,低電平有效,低電平有效else if(load) cnt=d;/同步預置同步預置else if(up_down) cnt=cnt+1;/加法計數加法計數else cnt=cnt-1;/減法計數減法計數 en

16、dendmodule結論結論時序電路的輸出是由時鐘控制的(電平控制時序電路的輸出是由時鐘控制的(電平控制、邊沿控制)、邊沿控制)邊沿控制的時序電路一定要用邊沿控制的時序電路一定要用always語句描語句描述述結論結論1組合電路的輸入一旦有變化,輸出馬上跟著變化組合電路的輸入一旦有變化,輸出馬上跟著變化組合電路一般都用組合電路一般都用assign語句語句當用當用always描述純組合電路時,括號內的敏感列表里要把描述純組合電路時,括號內的敏感列表里要把所有的輸入列出來所有的輸入列出來結論結論2時序電路的輸出是由時鐘控制的(電平控制、邊沿控時序電路的輸出是由時鐘控制的(電平控制、邊沿控制)制)邊沿

17、控制方式一定要用邊沿控制方式一定要用always語句描述語句描述電平控制可以使用電平控制可以使用assign語句,也可以使用語句,也可以使用always語語句。但使用句。但使用always語句是要注意在敏感列表里要把語句是要注意在敏感列表里要把時時鐘信號鐘信號和所有的輸入信號都列出來。和所有的輸入信號都列出來。6.3 多層次結構電路的設計多層次結構電路的設計本節(jié)將介紹怎樣進行這種多層次結構電路的設計。本節(jié)將介紹怎樣進行這種多層次結構電路的設計。多層次結構電路的描述既可以采用純文本方式,也多層次結構電路的描述既可以采用純文本方式,也可以用圖形和文本輸入相結合的方式??梢杂脠D形和文本輸入相結合的方

18、式。這里用這里用2個例子來說明這兩種設計方式。個例子來說明這兩種設計方式。簡單的 Verilog HDL 模塊例:module trist1(out,in,enable); output out; input in, enable; mytri tri_inst(out,in,enable); endmodule module mytri(out,in,enable); output out; input in, enable; assign out = enable? In : bz; endmodule簡單的 Verilog HDL 模塊上述程序例子通過另一種方法描述了一個三態(tài)門。上述程序

19、例子通過另一種方法描述了一個三態(tài)門。在這個例子中存在著兩個模塊:模塊在這個例子中存在著兩個模塊:模塊trist1 trist1 調用模塊調用模塊 mytrimytri 的實例元的實例元件件 tri_insttri_inst。模塊模塊 trist1 trist1 是上層模塊。模塊是上層模塊。模塊 mytrimytri 則被稱為子模塊。則被稱為子模塊。通過這種結構性模塊構造可構成特大型模塊。通過這種結構性模塊構造可構成特大型模塊。6.3.1 圖形與文本混合設計圖形與文本混合設計 設計一個設計一個8位累加器位累加器ACC,用于對輸入的用于對輸入的8位數據位數據進行累加。進行累加。首先進行層次設計。可

20、以把累加器分為兩個模塊,首先進行層次設計??梢园牙奂悠鞣譃閮蓚€模塊,一個是一個是8位全加器,一個是位全加器,一個是8位寄存器。位寄存器。全加器負責對不斷輸入的數據和進位進行累加,寄全加器負責對不斷輸入的數據和進位進行累加,寄存器負責暫存累加和,并把累加和輸出并反饋到累存器負責暫存累加和,并把累加和輸出并反饋到累加器輸入端,以進行下一次的累加。加器輸入端,以進行下一次的累加。在劃分好模塊后,再把每個模塊的端口和連接關系在劃分好模塊后,再把每個模塊的端口和連接關系設計好,就可以分別設計各個功能模塊。設計好,就可以分別設計各個功能模塊。1、 8位全加器位全加器2、8位寄存器位寄存器3頂層連接頂層連接

21、對對8 8位全加器和位全加器和8 8位寄存器分別進行編譯,生成兩個位寄存器分別進行編譯,生成兩個模塊符號,再把這兩個模塊進行連接,加上編人端模塊符號,再把這兩個模塊進行連接,加上編人端和輸出端,就構成了完整的累加器電路。如下圖所和輸出端,就構成了完整的累加器電路。如下圖所示。示。累加器頂層電路累加器頂層電路accout6.3.2 純文本描述純文本描述 該文本描述與上圖電路連接的效果是完全相同的。該文本描述與上圖電路連接的效果是完全相同的。需注意是在調用需注意是在調用add8和和reg8這兩個模塊時,要注意模這兩個模塊時,要注意模塊端口信號的一一對應。塊端口信號的一一對應。6.5 數字跑表(以下

22、內容自學)數字跑表(以下內容自學)以數字跑表的設計為例,介紹利用以數字跑表的設計為例,介紹利用Verilog HDL設計數字電路的完整設計數字電路的完整過程。過程。結構與功能結構與功能設計一個數字跑表,該跑表具有復位、暫停、秒表計設計一個數字跑表,該跑表具有復位、暫停、秒表計時等功能。時等功能。按照自上而下的設計思路,首先對數字跑表進行結構按照自上而下的設計思路,首先對數字跑表進行結構和功能的劃分。和功能的劃分。下圖是數字跑表的結構示意圖。下圖是數字跑表的結構示意圖。 該跑表有該跑表有3 3個輸入端,分別為時鐘輸入個輸入端,分別為時鐘輸入(CLK)(CLK)、復位復位(CLR)(CLR)和和啟

23、動暫停啟動暫停(PAUSE)(PAUSE)。 復位信號高電平有效,可對整個系統(tǒng)異步清復位信號高電平有效,可對整個系統(tǒng)異步清0 0;當啟動暫當啟動暫停鍵為低電平時跑表開始計時,為高電平時暫停,變低后在停鍵為低電平時跑表開始計時,為高電平時暫停,變低后在原來的數值基礎上再計數。這兩個控制信號的作用如表原來的數值基礎上再計數。這兩個控制信號的作用如表7.17.1所示。所示。為了便于顯示,百分秒、秒和分鐘信號皆采用為了便于顯示,百分秒、秒和分鐘信號皆采用BCDBCD碼計數方碼計數方式,并直接輸出到式,并直接輸出到6 6個數碼管顯示出來。個數碼管顯示出來。源程序源程序仿真及波形圖仿真及波形圖下載及驗證下

24、載及驗證6.6 八位數字頻率計八位數字頻率計6.6.1 功能要求功能要求 設計一個設計一個8位頻率計,可以測量從位頻率計,可以測量從1Hz到到 99 999 999Hz的信號頻率,并將被測信號的頻率的信號頻率,并將被測信號的頻率在在8個數碼管上顯示出來。個數碼管上顯示出來。6.6.2 工作原理工作原理 采用一個標準的基準時鐘,在單位時間采用一個標準的基準時鐘,在單位時間(如如1s)里對里對被測信號的脈沖數進行計數,即為信號的頻率。被測信號的脈沖數進行計數,即為信號的頻率。 測頻原理測頻原理 f = N/t f = N/t 其中:其中:NN脈沖計數值脈沖計數值 t t 計數時間計數時間 由上式得

25、知:由上式得知:頻率是在單位時間(頻率是在單位時間(1 1秒)內所產生的脈沖個數。秒)內所產生的脈沖個數。頻率在數學表達式中用頻率在數學表達式中用“f”f”表示,其相應的單位有:表示,其相應的單位有: HzHz(赫)、赫)、kHzkHz(千赫)、千赫)、MHzMHz(兆赫)、兆赫)、 GHzGHz(吉赫)吉赫)其中其中 1GHz=1000MHz1GHz=1000MHz,1MHz=1000kHz1MHz=1000kHz,1kHz=1000Hz1kHz=1000Hz頻率計至少包括:頻率計至少包括:計數模塊(計數電路)計數模塊(計數電路)計數時間限定模塊(控制電路)計數時間限定模塊(控制電路)顯示模

26、塊(電路)顯示模塊(電路)8位數字頻率計的頂層框圖如圖721所示,整個系統(tǒng)可分為三個模塊:控制模塊、計數測量模塊和鎖存器模塊。頻率計原理框圖頻率計原理框圖1Hz B C D碼七段數碼管譯碼器 控制模塊的幾個控制信號的時序關系如圖控制模塊的幾個控制信號的時序關系如圖7.22所示。從所示。從圖中可看出,計數使能信號圖中可看出,計數使能信號COUNT_EN在在1s的高電平的高電平后,利用其反相值的上跳沿產生一個鎖存信號后,利用其反相值的上跳沿產生一個鎖存信號LOAD,隨后產生清隨后產生清0信號上跳沿信號上跳沿COUNT_CLR 。6.6.3 設計實現設計實現控制模塊計數模塊32位鎖存器被測輸入信號基

27、準時鐘頻率值(輸出到數碼管顯示)1. Fre_ctrl控制模塊控制模塊 module fre_ctrl(clk,rst,count_en,count_clr,load); output count_en,count_clr,load; input clk,rst; reg count_en,load; always (posedge clk) begin if(rst) begin count_en = 0; load = 1; end else begin count_en = count_en; load = count_en; /load信號的產生信號的產生 end end assign

28、 count_clr = clk&load; / count_clr信號的產生信號的產生 endmodule fre_ctrl控制模塊的作用前面已經講過,它用于產生3個控制信號。此模塊用Verilog描述見下例。注意:注意:使用阻塞賦值使用阻塞賦值仿真圖仿真圖阻塞賦值結果阻塞賦值結果非阻塞賦值結果非阻塞賦值結果2. Count10計數模塊計數模塊encount_en clrcount_clrclk signal(低四位)clkcout(其余) module count10(out,cout,en,clr,clk); output3:0 out; output cout; input e

29、n,clr,clk; reg3:0 out; always (posedge clk or posedge clr)begin if(clr) out = 0; else if(en) begin if(out = =9) out = 0; else out = out+1; end end assign cout= (out=9)&en)?1:0;/進位信號進位信號 endmodule count10是一個帶有計數使能輸入端(EN)和異步清0端(CLR)的模為10的計數模塊。當EN為高電平時開始計數,為低電平時停止計數。CLR為異步消0端,當它為高電平時,計數器輸出為0。3. 32位

30、鎖存器模塊位鎖存器模塊latch_32din32位out module latch_32(qo,din,load); output31:0 qo; input31:0 din; input load; reg load; reg31:0 qo; always (posedge load) begin qo = din; end endmodule6.6.4 仿真與下載仿真與下載 將上面將上面8位數字頻率計的頂層原理圖用位數字頻率計的頂層原理圖用QuartusII進行編譯,并進行功能仿真,如圖進行編譯,并進行功能仿真,如圖7.24所所示是其仿真波形的一部分。從仿真波形圖可以看出,改變輸入信號的頻

31、率,頻率計都能準示是其仿真波形的一部分。從仿真波形圖可以看出,改變輸入信號的頻率,頻率計都能準確地測出其頻率,如圖中所示,分別為確地測出其頻率,如圖中所示,分別為20Hz、17Hz和和8Hz。下載下載 也可將該設計下載到實驗板中進行實際驗證。器件選擇也可將該設計下載到實驗板中進行實際驗證。器件選擇EPF10K10器件,管腳鎖定如下:器件,管腳鎖定如下: CLK接接clock1,待測的信號待測的信號SIGNAL接接clock0,QOL31.0接接PI047PIO16(即數碼管即數碼管8、7、6、5、4、3、2、1)。 然后進行編譯,生成可下裁的然后進行編譯,生成可下裁的.sof文件,將該文件下載

32、到芯片中,文件,將該文件下載到芯片中,實驗板模式選擇實驗板模式選擇NO.0,可實際驗證該設計。不斷變換輸入信號可實際驗證該設計。不斷變換輸入信號SIGNAL的頻率觀察數碼管顯示的數值與實驗板上的頻率標稱值的頻率觀察數碼管顯示的數值與實驗板上的頻率標稱值是否相符。是否相符。 選擇數據類型時常犯的錯誤 在過程塊中對變量賦值時,忘了把它定義為寄存器 類型(reg)或已把它定義為連接類型了(wire) 把實例的輸出連接出去時,把它定義為寄存器reg類型了 把模塊的輸入信號定義為寄存器reg類型了。這是經常犯的三個錯誤!小結小結只有兩種主要的信號類型: - 寄存器類型: reg 在always 塊中被賦

33、值的信號,往往代表 觸發(fā)器,但不一定是觸發(fā)器。 - 連線類型: wire 用 assign 關鍵詞指定的組合邏輯的信號 或連線(也可以是組(也可以是組合邏輯信號)合邏輯信號)aout2BUFFbINVout1dout2AND2i1clkout1D QDFFvariable型變量與nets型變量的根本區(qū)別是: variable型變量需要被明確地賦值,并且在被重新賦值前一直保持原值。variable型變量必須通過過程賦值語句賦值!不能通過assign語句賦值!在過程塊內被賦值的每個信號必須定義成variable型!注意區(qū)分注意區(qū)分reg n-1:0 a; /a為為n位寄存器位寄存器reg a n-

34、1:0 ; /a為為n個一位寄存器的存儲器個一位寄存器的存儲器0n-10n-1n-2地址標量、矢量標量、矢量 標量標量線寬為線寬為1的連線類,或位寬為的連線類,或位寬為1的寄存器類。的寄存器類。如:如:wire a,b; reg c,d,f; 矢量矢量線寬大于線寬大于1的連線類,或位寬大于的連線類,或位寬大于1的寄存器類。的寄存器類。如:如: wire 4:0 a,b; wire 0:3 a; reg 6:0 c,d,f;規(guī)定左邊為最高位,右邊為最低位。規(guī)定左邊為最高位,右邊為最低位。Verilog 與 C 的主要不同點 Verilog 有許多語法規(guī)則與 C 語言一致。 但與 C 語言有根本的

35、區(qū)別:- 并行性- 塊的含義: initial 塊 和 always塊- 兩種賦值語句: 阻塞 賦值 “ = ” 非阻塞賦值 “= ” 注1:“always” 塊語句常用于描述時序邏輯,也可描述組合邏輯。 注2:“always” 塊可用多種手段來表達邏輯關系,如用if-else語句或case語句。 注3: “always” 塊語句與assign語句是并發(fā)執(zhí)行的, assign語句一定要放在“always” 塊語句之外!不同抽象級別不同抽象級別的的VerilogVerilog HDL HDL模型模型采用的描述采用的描述級別級別越越高高,設計設計越越容易容易,程序,程序代碼代碼越越簡單簡單;但耗用

36、器件資源更多。對特定綜合器,可能無法將某但耗用器件資源更多。對特定綜合器,可能無法將某些抽象級別高的描述轉化為電路!些抽象級別高的描述轉化為電路!基于門級描述的硬件模型不僅可以仿真,而且可綜合,基于門級描述的硬件模型不僅可以仿真,而且可綜合,且系統(tǒng)且系統(tǒng)速度快速度快。所有所有VerilogVerilog HDL HDL編譯軟件只是支持該語言的一個編譯軟件只是支持該語言的一個子集子集。盡量采用編譯軟件支持的語句來描述設計;或多個軟盡量采用編譯軟件支持的語句來描述設計;或多個軟件配合使用。件配合使用。一般用一般用算法級算法級(寫出邏輯表達式)或(寫出邏輯表達式)或RTLRTL級級來描述邏來描述邏輯

37、功能,盡量避免用門級描述,除非對系統(tǒng)速度要求輯功能,盡量避免用門級描述,除非對系統(tǒng)速度要求比較高的場合才采用門級描述。比較高的場合才采用門級描述。 不同抽象級別不同抽象級別的的VerilogVerilog HDL HDL模型模型(1 1)采用什么描述級別更合適?)采用什么描述級別更合適?系統(tǒng)級描述太抽象,有時無法綜合成具體的物理系統(tǒng)級描述太抽象,有時無法綜合成具體的物理電路;門級描述要求根據邏輯功能畫出邏輯電路電路;門級描述要求根據邏輯功能畫出邏輯電路圖,對于復雜的數字系統(tǒng)很難做到;圖,對于復雜的數字系統(tǒng)很難做到;而算法級和而算法級和RTLRTL級描述級別適中,代碼不是很復級描述級別適中,代碼

38、不是很復雜,且一般容易綜合成具體的物理電路,故建議雜,且一般容易綜合成具體的物理電路,故建議盡量采用算法級和盡量采用算法級和RTLRTL級級來描述。來描述。(2 2)怎樣減少器件邏輯資源的耗用?)怎樣減少器件邏輯資源的耗用?當器件容量有限時,為減少器件邏輯資源的耗用,當器件容量有限時,為減少器件邏輯資源的耗用,建議少用建議少用if-elseif-else語句和語句和casecase語句,盡量直接使用邏語句,盡量直接使用邏輯表達式來描述系統(tǒng)的邏輯功能;輯表達式來描述系統(tǒng)的邏輯功能;或者用或者用casecase語句取代語句取代if-elseif-else語句。語句。設計技巧設計技巧建議:建議:(1

39、 1)在進行設計前,一定要仔細分析并熟悉所)在進行設計前,一定要仔細分析并熟悉所需設計電路或系統(tǒng)的整個工作過程;合理劃分需設計電路或系統(tǒng)的整個工作過程;合理劃分功能模塊;并弄清每個模塊輸入和輸出間的邏功能模塊;并弄清每個模塊輸入和輸出間的邏輯關系!輯關系?。? 2)在調試過程中,仔細閱讀并理解錯誤信息)在調試過程中,仔細閱讀并理解錯誤信息,隨時查閱教材和課件上有關語法,糾正語法,隨時查閱教材和課件上有關語法,糾正語法錯誤。錯誤。設計技巧設計技巧1 1一個變量不能在多個一個變量不能在多個alwaysalways塊中被賦值!塊中被賦值! 這個問題一定要注意!否則編譯不能通過。這個問題一定要注意!否

40、則編譯不能通過。例例 帶異步清零、異步置位的D觸發(fā)器注注:當某個變量有多個觸發(fā):當某個變量有多個觸發(fā)條件時,最好將它們放在一條件時,最好將它們放在一個個alwaysalways塊中,并用塊中,并用if-elseif-else語句描述在不同觸發(fā)條件下語句描述在不同觸發(fā)條件下應執(zhí)行的操作!應執(zhí)行的操作!正確正確的寫法的寫法設計技巧設計技巧錯誤錯誤的寫法的寫法注注:這里:這里q q和和qnqn在兩個在兩個alwaysalways塊中都被賦值!塊中都被賦值!因為因為alwaysalways塊之間是并塊之間是并行操作,造成某些語句行操作,造成某些語句可能是互相矛盾的,所可能是互相矛盾的,所以編譯器無所適

41、從,只以編譯器無所適從,只能報錯!能報錯!設計技巧設計技巧2 2在在alwaysalways塊語句中,當敏感信號為兩個以上的時鐘邊沿觸發(fā)塊語句中,當敏感信號為兩個以上的時鐘邊沿觸發(fā)信號時,應注意不要使用多個信號時,應注意不要使用多個if if語句!以免因邏輯關系描述不語句!以免因邏輯關系描述不清晰而導致編譯錯誤。清晰而導致編譯錯誤。 例例 在數碼管掃描顯示電路中,設計一個中間變量,將脈沖信號start轉變?yōu)殡娖叫盘杄nable 。always(posedge start or posedge reset) if (reset) enable =0; if (start) enable=1; 編

42、譯后出現了多條警告信息,指明在語句編譯后出現了多條警告信息,指明在語句always (posedge start or posedge reset)中,變量中,變量enable不能不能被分配新的值!被分配新的值!錯誤錯誤的寫法的寫法設計技巧設計技巧其仿真波形如下:其仿真波形如下: 注注:由于在最初一段,:由于在最初一段,startstart和和resetreset均為均為0 0,導,導致致enableenable為不定態(tài),則為不定態(tài),則scan_datascan_data開始加開始加1 1計數計數(正確情況應是在按下(正確情況應是在按下startstart時時scan_datascan_dat

43、a才開才開始 加始 加 1 1計 數,因為此時計 數,因為此時 re s e t = 0re s e t = 0 , 導 致, 導 致enable=1enable=1。當。當startstart和和resetreset同時為同時為1 1時,時, enable為為0。)設計技巧設計技巧 語句語句“else enable=1;”隱含了隱含了reset無效、且無效、且start有效的意思,有效的意思,因此與因此與else if(start) enable=1;效果一樣!效果一樣! 正確的仿真波形如下:正確的仿真波形如下: always(posedge start or posedge reset)

44、if (reset) enable =0; else enable=1;注注:可見在最初一段,當可見在最初一段,當start和和reset均為均為0時,時,enable被認為初值為被認為初值為0,則,則scan_data不計數,保持初值為不計數,保持初值為0;一旦;一旦start有效時,則有效時,則scan_data才開始加才開始加1計數。當計數。當start和和reset同時為同時為1時,先執(zhí)行的是時,先執(zhí)行的是“if (reset) enable =0; ” ”,故,故enable仍為仍為0,則,則scan_data保持原值保持原值0。 正確正確的寫法的寫法設計技巧設計技巧3 3當輸出信號

45、為總線信號時,一定要在當輸出信號為總線信號時,一定要在I/OI/O說明中指明其位寬!否則說明中指明其位寬!否則在生成邏輯符號時,輸出信號被誤認為是單個信號,而沒有標明位在生成邏輯符號時,輸出信號被誤認為是單個信號,而沒有標明位寬,就不會當成總線信號。寬,就不會當成總線信號。 例例 聲明一個位寬為5的輸出信號run_cnt,其類型為reg型變量。錯誤錯誤的寫法的寫法output run_cnt;reg4:0run_cnt;正確正確的寫法的寫法output4:0 run_cnt; /這里一定要指明位寬!這里一定要指明位寬! reg4:0run_cnt;3.13 3.13 設計技巧設計技巧4 4當要

46、用到計數器時,一定要根據計數最大值事先當要用到計數器時,一定要根據計數最大值事先計算好所需的位寬!若位寬不夠,則計數器不能計計算好所需的位寬!若位寬不夠,則計數器不能計到你設定的最大值,當該計數器用作分頻時,則輸到你設定的最大值,當該計數器用作分頻時,則輸出時鐘始終為出時鐘始終為0 0,所設計電路將不能按預定功能正,所設計電路將不能按預定功能正常工作!常工作! 例例如某同學在做樂曲演奏電路實驗時,對樂曲演奏子模塊的仿真完全正確,high3:0、mid3:0、low3:0都有輸出,但下載時音名顯示數碼管始終為000。這主要是因為他在分頻子模塊中clk_4Hz的分頻用計數器count_4位寬設置不

47、夠,則clk_4Hz輸出為0,故音名顯示計數器high3:0、mid3:0、low3:0輸出始終為0,電路不能正常工作。 設計技巧設計技巧module f20MHz_to_6MHz_4Hz(clkin,clr,clk_6M,clk_4); input clkin,clr; outputclk_6M,clk_4; regclk_6M,clk_4; reg2:0count_6M; reg15:0count_4; parametercount_6M_width=3; parametercount_4_width=5000000; always(posedge clkin or posedge clr

48、) beginif(clr) begin count_4=0;clk_4=0; endelse begin if(count_4=count_4_width-1) /此條件不可能滿足!此條件不可能滿足! begin count_4=0; clk_4=1; end else begin count_4=count_4+1; clk_4=0; end end endendmodule223=8388608,故計數器位寬故計數器位寬應為應為23,應寫為,應寫為22:0 。若寫。若寫成成15:0,216=65536,則則clk_4一直為一直為0,則下載后數碼管顯,則下載后數碼管顯示一直為示一直為0,揚

49、聲器一直是一,揚聲器一直是一個音調個音調錯誤錯誤的寫法的寫法設計技巧設計技巧5 5注意程序書寫規(guī)范:語句應注意縮進注意程序書寫規(guī)范:語句應注意縮進,if-elseif-else語句注意對齊,應添加必要的語句注意對齊,應添加必要的注釋!注釋!6 6注意區(qū)分阻塞賦值和非阻塞賦值的區(qū)注意區(qū)分阻塞賦值和非阻塞賦值的區(qū)別。別。在一個源程序中,要么都采用阻塞賦值在一個源程序中,要么都采用阻塞賦值語句,要么都采用非阻塞賦值語句,最語句,要么都采用非阻塞賦值語句,最好不要混合使用,否則可能邏輯關系出好不要混合使用,否則可能邏輯關系出錯!錯!為易于綜合,建議均采用非阻塞賦值語為易于綜合,建議均采用非阻塞賦值語句

50、!句!作業(yè)作業(yè)實實 驗驗 實驗五(一)實驗五(一) 7段段BCD碼譯碼器設計碼譯碼器設計(1)實驗目的:)實驗目的:通過設計通過設計7 7段段BCDBCD碼譯碼器學習碼譯碼器學習組合組合電路的設電路的設計方法。計方法。(2)實驗原理:)實驗原理:7段數碼是純組合電路,通常的小規(guī)模專用段數碼是純組合電路,通常的小規(guī)模專用IC,如,如74或或4000系列的器件只能作十進制系列的器件只能作十進制BCD碼譯碼,然而數碼譯碼,然而數字系統(tǒng)中的數據處理和運算都是字系統(tǒng)中的數據處理和運算都是2進制的,所以輸出表達都是進制的,所以輸出表達都是16進制的,為了滿足進制的,為了滿足16進制數的譯碼顯示,最方便的方

51、法就是利進制數的譯碼顯示,最方便的方法就是利用譯碼程序在用譯碼程序在FPGA/CPLD中來實現。下面作為中來實現。下面作為7段段BCD碼譯碼碼譯碼器,輸出信號器,輸出信號LED7S的的7位分別接如圖位分別接如圖6-21數碼管的數碼管的7個段,高個段,高位在左,低位在右。例如當位在左,低位在右。例如當LED7S輸出為輸出為“1101101”時,數碼時,數碼管的管的7個段:個段:g、f、e、d、c、b、a分別接分別接1、1、0、1、1、0、1;接有高電平的段發(fā)亮,于是數碼管顯示;接有高電平的段發(fā)亮,于是數碼管顯示“5”。實實 驗驗 實驗五(一)實驗五(一) 7段數碼顯示譯碼器設計段數碼顯示譯碼器設

52、計圖圖6-21 共陰數碼管及其電路共陰數碼管及其電路(3)實驗內容)實驗內容1:說明下面的代碼中各語句的含義,以及該例的整體功能。說明下面的代碼中各語句的含義,以及該例的整體功能。在在QuartusII上對下例進行編輯、編譯、綜合、適配、仿真,給出其所有信號上對下例進行編輯、編譯、綜合、適配、仿真,給出其所有信號的時序仿真波形(提示:用輸入總線的方式給出輸入信號仿真數據)。的時序仿真波形(提示:用輸入總線的方式給出輸入信號仿真數據)。 實驗內容實驗內容2:把程序改成顯示十六進制后重復上述過程。把程序改成顯示十六進制后重復上述過程。代碼代碼(十進制顯示十進制顯示) module decode(a

53、,b,c,d,e,f,g,D3,D2,D1,D0);module decode(a,b,c,d,e,f,g,D3,D2,D1,D0); output a,b,c,d,e,f,g;output a,b,c,d,e,f,g; input D3,D2,D1,D0;input D3,D2,D1,D0; regreg a,b,c,d,e,f,g; a,b,c,d,e,f,g; always (D3,D2,D1,D0) always (D3,D2,D1,D0) begin begin case(D3,D2,D1,D0) case(D3,D2,D1,D0) 4d0:g,f,e,d,c,b,a=7b0111111; 4d0:g,f,e,d,c,b,a=7b0111111; 4d1:g,f,e,d,c,b,a=7b0000110; 4d1:g,f,e,d,c,b,a=7b0000110; 4d2:g,f,e,d,c,b,a=7b1011011; 4d2:g,f,e,d,c,b,a=7b1011011; 4d3:g,f,e,d,c,b,a=7b1001111; 4d3:g,f,e,d,c,b,a=7b1001111; 4d4:g,f,e,d,c,b,a=7b1

溫馨提示

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

評論

0/150

提交評論