《Verilog HDL數(shù)字系統(tǒng)設(shè)計-原理、實例及仿真》課件第10章_第1頁
《Verilog HDL數(shù)字系統(tǒng)設(shè)計-原理、實例及仿真》課件第10章_第2頁
《Verilog HDL數(shù)字系統(tǒng)設(shè)計-原理、實例及仿真》課件第10章_第3頁
《Verilog HDL數(shù)字系統(tǒng)設(shè)計-原理、實例及仿真》課件第10章_第4頁
《Verilog HDL數(shù)字系統(tǒng)設(shè)計-原理、實例及仿真》課件第10章_第5頁
已閱讀5頁,還剩139頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第10章綜合應(yīng)用實例10.1交通燈控制系統(tǒng)10.2多功能數(shù)字鐘10.3樂曲播放器10.4VGA控制器

10.1交通燈控制系統(tǒng)

交通燈控制系統(tǒng)是一個比較簡單的數(shù)字系統(tǒng),它是通過控制交通道路的通行和等待時間來實現(xiàn)交通控制的,因此控制系統(tǒng)的主要功能是實現(xiàn)紅、綠燈狀態(tài)控制并顯示當(dāng)前狀態(tài)持續(xù)的時間。這里設(shè)計的一個交通控制系統(tǒng)具有緊急狀態(tài)、測試狀態(tài)和正常工作三種狀態(tài)。緊急狀態(tài)用于處理一些突發(fā)的狀態(tài),如戒嚴等,此時雙向路口禁止通行;測試狀態(tài)可用于檢測信號燈和數(shù)碼管的硬件是否正常;正常工作狀態(tài)則用于雙向路口的信號燈控制。交通燈控制系統(tǒng)通??刂剖致房趦蓚€方向的信號燈,兩個方向中車流量比較大的道路稱為主干道,其綠燈的時間較長,而另一個方向就是次干道。兩個路口的工作原理是相同的,主要區(qū)別是紅、綠燈的時長不同,所以可以先實現(xiàn)一個路口的控制模塊,然后再用該模塊構(gòu)成一個十字路口的控制系統(tǒng)。10.1.1交通燈控制系統(tǒng)的設(shè)計思路

這里先介紹一個路口控制模塊的設(shè)計思路。該模塊包括復(fù)位狀態(tài)、正常工作狀態(tài)、緊急狀態(tài)和信號燈測試狀態(tài),reset_n(復(fù)位信號)、emergency(緊急狀態(tài)信號)和test(測試狀態(tài)信號)是狀態(tài)控制輸入信號。10.1.2一個路口控制模塊的代碼

一個路口控制模塊traffic_con的各端口信號的說明如下:

輸入信號:

clk——1?Hz時鐘信號;

reset_n——復(fù)位信號,低電平有效;

prim_flag——主、次干道標(biāo)志,1為主干道,0為次干道;

red_time——紅燈時間(秒);

green_time——綠燈時間(秒);

yellow_time——黃燈時間(秒);

emergency——緊急狀態(tài)控制信號;

test——信號燈測試控制信號。輸出信號:

wait_time——當(dāng)前狀態(tài)的倒計時時間輸出;

ryg_light[2:0]——紅、黃、綠信號燈狀態(tài)輸出。

【代碼10.1】單個路口交通燈控制模塊。主干道和次干道的初始化狀態(tài)截圖如圖10.1和圖10.2所示,圖10.1中prim_flog=1,表示該路口是主干道。因此,在復(fù)位信號無效后,紅、黃、綠燈的輸出信號ryg_light立即為3'b001,即綠燈亮,由于green_time=6,所以綠燈持續(xù)時間應(yīng)為6秒鐘,在wait_time輸出分別為6、5、4、3、2、1后,ryg_

light為3'b010,綠燈亮,綠燈持續(xù)2秒后,ryg_light=3'b100,紅燈亮,紅燈持續(xù)9秒鐘后,ryg_light=3'b001,綠燈再次亮。圖10.1主干道復(fù)位仿真波形圖10.2次干道復(fù)位仿真波形圖10.2中,prim_flag=0,表示該路口是次干道。在復(fù)位信號無效后,紅、黃、綠燈的輸出信號ryg_light=3‘b100,即紅燈先亮。紅燈持續(xù)9秒后依次是綠燈亮6秒、黃燈亮2秒。

圖10.3所示是通行時間重新設(shè)置后的仿真波形。圖中可以看出,紅、綠、黃燈的通行時間分別由9秒、6秒、2秒變?yōu)?2秒、8秒和4秒后,新的燈時按照新輸入時間運行;當(dāng)前的綠燈狀態(tài)結(jié)束后,隨后的黃燈時間變?yōu)?秒,紅燈時間變?yōu)?2秒。圖10.3通行時間更新后的仿真波形圖10.4所示是緊急狀態(tài)控制信號emergency變化為1后電路的工作狀態(tài),wait_time=8'h88(圖中顯示的符號是十進制數(shù),為-120),信號燈ryg_light=110,即紅、黃燈同時亮的狀態(tài)。當(dāng)emergency無效后,輸出信號又繼續(xù)之前的工作狀態(tài)。圖10.4緊急工作狀態(tài)截圖圖10.5所示是測試狀態(tài)控制信號test變化為1后的工作狀態(tài),wait_time=8'h88(圖中有符號十進制數(shù)為-120),信號燈ryg_light交替為3'b000和3'b111,即紅、黃、綠信號燈交替同時亮或同時滅,用于測試信號燈的故障。當(dāng)test信號無效后,輸出信號又繼續(xù)之前的工作狀態(tài)。圖10.5測試工作狀態(tài)截圖10.1.3雙向路口控制模塊的代碼

用前面實現(xiàn)的單個路口控制模塊traffic_con就可以構(gòu)成雙向路口的控制模塊traffic_top,具體實現(xiàn)見代碼10.2。該模塊在實例化traffic_con模塊時主要是設(shè)置主、次干道標(biāo)志prim_flag以及主、次干道的信號燈時間。為了保證雙向信號燈的同步,即主干道綠燈亮?xí)r次干道應(yīng)為紅燈,主干道綠燈結(jié)束后黃燈亮?xí)r,次干道仍為紅燈,因此次干道的紅燈時間應(yīng)為主干道綠燈與主干道黃燈之和。同理,主干道的紅燈時間應(yīng)為次干道綠燈與次干道黃燈之和,即次干道綠燈時間為主干道紅燈時間減去主干道黃燈時間(主、次干道的黃燈亮燈時間相同)。該模塊的輸入和輸出信號說明如下:

輸入信號:

clk——1?Hz時鐘信號;

reset_n——復(fù)位信號,低電平有效;

prim_flag——主、次干道標(biāo)志,1為主干道,0為次干道;

prim_red_time——主干道紅燈時間(秒);

prim_green_time——主干道綠燈時間(秒);

prim_yellow_time——主干道黃燈時間(秒);

emergency——緊急狀態(tài)控制信號;

test——信號燈測試控制信號。輸出信號:

prim_wait_time——主干道倒計時時間;

seco_wait_time——次干道倒計時時間;

prim_ryg_light——主干道紅、黃、綠信號燈;

seco_ryg_light——次干道紅、黃、綠信號燈。

【代碼10.2】雙向路口控制模塊。圖10.6是雙向路口控制模塊的功能仿真波形,從圖中可以看出輸入信號中主干道的紅、綠、黃燈時間分別為6秒、9秒和2秒,因此次干道的紅、綠、黃燈時間應(yīng)分別為11秒、4秒、2秒,從圖中可以看出復(fù)位信號由低變高后,主干道信號燈prim_ryg_light=3'b001,即綠燈狀態(tài),次干道信號燈seco_ryg_light=3'b100,即紅燈狀態(tài)。次干道的紅燈時間(11秒)是主干道的綠燈(9秒)和黃燈(2秒)時間之和,主干道的紅燈時間(6秒)是次干道的綠燈(4秒)和黃燈(2秒)時間之和。圖10.6雙向路口控制模塊的仿真波形

10.2多功能數(shù)字鐘

數(shù)字鐘是一個最常用的數(shù)字系統(tǒng),其主要功能是計時和顯示時間。這里通過一個數(shù)字鐘表的模塊化設(shè)計方法,說明自頂向下的模塊化設(shè)計方法和實現(xiàn)一個項目的設(shè)計步驟。這里實現(xiàn)的電子表具有顯示和調(diào)時的基本功能,可以顯示時、分、秒和毫秒,并通過按鍵進行工作模式選擇,工作模式有4種,分別是正常計時模式、調(diào)時模式、調(diào)分模式、調(diào)秒

模式。

構(gòu)成電子表的基本模塊有四個,分別是時鐘調(diào)校及計時模塊myclock、整數(shù)分頻模塊int_div、時鐘信號選擇模塊clkgen和七段顯示模塊disp_dec。10.2.1時鐘調(diào)校及計時模塊

時鐘調(diào)校及計時模塊myclock實現(xiàn)的功能是根據(jù)當(dāng)前的工作狀態(tài)進行時、分、秒的調(diào)整或正常的計時。代碼10.3是時鐘調(diào)校及計時模塊的VerilogHDL程序。其端口信號說明如下:

輸入信號:

RSTn——復(fù)位信號;

CLK——100?Hz時鐘信號;

FLAG[1:0]——工作模式控制信號,模式定義為:00表示正常顯示,01表示調(diào)時,10表示調(diào)分,11表示調(diào)秒;

UP——調(diào)校模式時以加1方式調(diào)節(jié)信號;

DN——調(diào)校模式時以減1方式調(diào)節(jié)信號。輸出信號:

H[7:0]——“時”數(shù)據(jù)(十六進制);

M[7:0]——“分”數(shù)據(jù)(十六進制);

S[7:0]——“秒”數(shù)據(jù)(十六進制);

MS[7:0]——“百分秒”數(shù)據(jù)(十六進制)。該模塊的設(shè)計思路是,當(dāng)復(fù)位信號RSTn有效時,時、分、秒信號清零,否則根據(jù)工作模式控制信號FLAG的值決定當(dāng)前的工作狀態(tài)。當(dāng)FLAG=2'b00時,電子表工作在正常計時狀態(tài),對輸入的100?Hz時鐘信號CLK進行計數(shù),修改當(dāng)前的百分秒(MS)、秒(S)、分(M)和時(H)的計數(shù)值;當(dāng)FLAG=2'b01時,電子表工作在“時”校正狀態(tài),若此時UP信號有效則H加1,若此時DN信號有效則H減1;當(dāng)FLAG=2'b10時,電子表工作在“分”校正狀態(tài),若此時UP信號有效則M加1,若此時DN信號有效則M減1;當(dāng)FLAG=2'b11時,電子表工作在“秒”校正狀態(tài),受UP和DN信號的控制過程與“時”、“分”類似。

【代碼10.3】時鐘調(diào)校及計時模塊。10.2.2整數(shù)分頻模塊

由于數(shù)字系統(tǒng)提供的基準(zhǔn)時鐘信號的頻率往往比較高,因此需要分頻模塊產(chǎn)生所需頻率的時鐘信號,例如上面時鐘調(diào)校及計時模塊所需的100?Hz的時鐘信號。整數(shù)分頻模塊int_div可以實現(xiàn)對輸入時鐘clock進行F_DIV分頻后輸出clk_out。F_DIV分頻系數(shù)范圍為1~2n(n=F_DIV_WIDTH),若要改變分頻系數(shù),改變參數(shù)F_DIV或F_DIV_WIDTH到相應(yīng)范圍即可。若分頻系數(shù)為偶數(shù),則輸出的時鐘占空比為50%;若分頻系數(shù)為奇數(shù),則輸出的時鐘占空比取決于輸入的時鐘占空比和分頻系數(shù)(當(dāng)輸入為50%時,輸出也是50%)。int_div模塊的實現(xiàn)見代碼10.4。

【代碼10.4】整數(shù)分頻模塊。10.2.3時鐘信號選擇模塊

時鐘信號選擇模塊clkgen實際上是一個二選一電路,用于提供時鐘調(diào)校及計時模塊所需的時鐘脈沖。當(dāng)電子表工作在正常計時狀態(tài)時選擇100?Hz時鐘信號;當(dāng)電子表工作在調(diào)時、調(diào)分、調(diào)秒三種設(shè)置模式時,如果采用100?Hz時鐘信號,那么手動按鍵一次可能引起設(shè)置數(shù)據(jù)的一串跳變,因此為了方便按鍵動作對時間的設(shè)置,這里采用2?Hz的時鐘信號。代碼10.5是clkgen模塊的代碼,其端口信號說明如下:

flag——時鐘選擇輸入信號;

clk_100?Hz——輸入100?Hz時鐘信號;

clk_2?Hz——輸入2?Hz時鐘信號;

Clkout——輸出時鐘信號。10.2.4七段顯示模塊

1.BCD碼顯示模塊

BCD碼顯示模塊的功能是將8位二進制數(shù)轉(zhuǎn)換為2位十進制數(shù)后,進行七段譯碼顯示。為了實現(xiàn)顯示功能,在其內(nèi)部調(diào)用了dual_hex2位七段顯示模塊。

BCD碼顯示模塊的實現(xiàn)見代碼10.6,其端口信號說明

如下:

輸入信號:

hex——2位8421BCD碼輸入。

輸出信號:

dispout——2位8421BCD碼對應(yīng)的七段數(shù)碼管段碼。

【代碼10.6】BCD碼顯示模塊。

2.2位七段顯示模塊

2位七段顯示模塊的功能是將2位十進制或十六進制數(shù)轉(zhuǎn)換為對應(yīng)的七段段碼,內(nèi)部調(diào)用了一位七段譯碼模塊seg_decoder。

【代碼10.7】2位七段顯示模塊。

3.1位七段譯碼模塊

1位七段譯碼模塊的功能是將4位二進制數(shù)轉(zhuǎn)換為對應(yīng)的共陰或共陽七段段碼。

【代碼10.8】1位七段譯碼模塊。10.2.5頂層模塊的實現(xiàn)

頂層模塊是將各功能模塊連接起來,實現(xiàn)電子表的完整功能。電子表頂層模塊clock的VerilogHDL實現(xiàn)見代碼10.9,其端口信號說明如下:

輸入信號:

iCLK_50——50?MHz時鐘信號;

RSTn——復(fù)位信號;

FLAG——工作模式控制信號,模式定義為:00表示正常顯示,01表示調(diào)時,10表示調(diào)分,11表示調(diào)秒;

UP——調(diào)校模式時以加1方式調(diào)節(jié)信號;

DN——調(diào)校模式時以減1方式調(diào)節(jié)信號。輸出信號:

H_dis——“小時”數(shù)據(jù)的七段數(shù)碼管段碼數(shù)據(jù);

M_dis——“分鐘”數(shù)據(jù)的七段數(shù)碼管段碼數(shù)據(jù);

S_dis——“秒”數(shù)據(jù)的七段數(shù)碼管段碼數(shù)據(jù);

MS_dis——“百分秒”數(shù)據(jù)的七段數(shù)碼管段碼數(shù)據(jù);

Mode——工作模式輸出;

H——“時”數(shù)據(jù)(十六進制);

M——“分”數(shù)據(jù)(十六進制);

S——“秒”數(shù)據(jù)(十六進制)。

【代碼10.9】電子表頂層模塊。圖10.7所示是電子表在正常計時工作方式的功能仿真波形。圖中,F(xiàn)LAG=2'b00,H、M、S分別是時、分、秒的十進制計數(shù)值,圖中的顯示時間從23∶59∶49計數(shù)到0∶0∶7秒。信號H_dis、M_dis、S_dis以及MS_dis分別是當(dāng)前時、分、秒和百分秒十進制數(shù)據(jù)的共陽極七段碼的輸出信號,例如當(dāng)時間為23∶59∶49時,其七段段碼數(shù)據(jù)分別為16'ha4b0、16'h9290、16'h9990,在共陽極數(shù)碼管上顯示“23∶59∶49”。圖10.7計時狀態(tài)仿真波形電子表模塊工作在時、分、秒的調(diào)整狀態(tài)時的功能仿真波形如圖10.8(a)、(b)、(c)所示。圖(a)中,當(dāng)FLAG=2'b01時,即進入“時”調(diào)整狀態(tài),若UP=1、DN=0,則小時數(shù)據(jù)H進行加1調(diào)整,見圖中小時數(shù)據(jù)H從0變化到5的調(diào)整過程;若UP=0、DN=1,則小時數(shù)據(jù)H進行減1調(diào)整,見圖中小時數(shù)據(jù)H從4變化到20的調(diào)整過程。分和秒的調(diào)整過程也類似,見圖(b)、(c),這里不再贅述。圖10.8(a)時調(diào)整功能仿真波形圖10.8(b)分調(diào)整功能仿真波形(c)秒調(diào)整功能仿真波形圖10.8電子表校正功能仿真波形

10.3樂?曲?播?放?器

樂曲是由具有一定高低、長短和強弱關(guān)系的音符組成的。在一首樂曲中,每個音符的音高、音長分別與頻率和節(jié)拍有關(guān),因此組成樂曲的每個音符的頻率和節(jié)拍是兩個主要數(shù)據(jù)。表10.1列出了國際標(biāo)準(zhǔn)音符的頻率。音符的持續(xù)時間可以根據(jù)樂曲的速度及每個音符的節(jié)拍來確定。在4/4拍中,以四分音符為1拍,每小節(jié)4拍,全音符持續(xù)4拍,二分音符持續(xù)2拍,四分音符持續(xù)1拍,八分音符持續(xù)半拍等。若以1秒作為全音符的持續(xù)時間,則二分音符的持續(xù)時間為0.5秒,四分音符的持續(xù)時間為0.25秒,八分音符的持續(xù)時間為0.125秒。

了解了樂曲中音符的頻率和持續(xù)時間的關(guān)系,就可以先按照樂譜將每個音符的頻率和節(jié)拍轉(zhuǎn)換成頻率和持續(xù)時間數(shù)據(jù),并定義成一個數(shù)據(jù)表將其進行存儲,然后依次取出數(shù)據(jù)表中的頻率值和節(jié)拍值,控制蜂鳴器進行發(fā)聲即可。蜂鳴器是可以根據(jù)輸入不同頻率的信號發(fā)出不同聲音的電路,其控制電路如圖10.9所示。圖中,蜂鳴器使用PNP三極管8550驅(qū)動,SP是蜂鳴器的控制信號,SP的不同頻率可以控制蜂鳴器發(fā)出不同的聲音。圖10.9蜂鳴器控制電路10.3.1時鐘信號發(fā)生器模塊

時鐘信號發(fā)生器模塊clk_gen是利用50?MHz的基準(zhǔn)時鐘產(chǎn)生5?MHz和4?Hz的時鐘信號,這兩個信號分別作為音頻發(fā)生器和節(jié)拍發(fā)生器的時鐘信號。時鐘信號發(fā)生器模塊clk_gen的具體實現(xiàn)見代碼10.10,其端口信號說明如下:

輸入信號:

reset_n——同步復(fù)位輸入信號;

clk50M——50?MHz輸入信號。

輸出信號:

clk_4?hz——4?Hz輸出信號(用于節(jié)拍控制);

clk_5?Mhz——5?MHz輸出信號。

【代碼10.10】時鐘信號發(fā)生器模塊。圖10.10(a)和(b)分別是時鐘信號發(fā)生器的clk50M信號為50MHz時產(chǎn)生的5?MHz和4?Hz信號的功能仿真波形。圖10.10時鐘信號發(fā)生器模塊的功能仿真波形10.3.2音頻產(chǎn)生器模塊

音頻產(chǎn)生器模塊的功能是產(chǎn)生如表10.1所示的從低音1到高音7的所有頻率。各種音頻通過對該模塊的5?MHz輸入時鐘信號進行Nx分頻后,產(chǎn)生頻率為fx的音符頻率。

Nx是根據(jù)各音符的頻率得到的,計算公式如下:(10.3-1)其中,Nx是加1計數(shù)器終值,fx為待生成信號的頻率,

5×106是5?MHz輸入時鐘信號頻率。如中音“1”的頻率

f中音1=523.25,則為了有效驅(qū)動揚聲器,還需要對產(chǎn)生的信號進行整形,使其輸出為方波。分頻的方法是對5?MHz時鐘信號進行加1計數(shù),當(dāng)計數(shù)值與待產(chǎn)生音符的計數(shù)值Nx相同時,對輸出的信號取反,因此計數(shù)值應(yīng)為標(biāo)準(zhǔn)音符頻率的2倍頻。計數(shù)器可以采用一個14位(由最大Nx位數(shù)決定)的計數(shù)器。各音符的2倍頻信號計數(shù)值和對應(yīng)的索引值如表10.2所示。音頻產(chǎn)生器模塊tone_gen的功能是根據(jù)輸入音符(表10.2中)的索引值輸出相應(yīng)的音頻信號,其具體實現(xiàn)見代碼10.11,tome_gen模塊的端口信號說明如下:

輸入信號:

reset_n——輸入同步復(fù)位信號;

code——輸入音符索引值;

clk——5MHz時鐘信號。

輸出信號:

freq_out——code對應(yīng)的音頻輸出信號。

【代碼10.11】音頻產(chǎn)生器模塊。10.3.3樂曲存儲模塊

演奏樂曲時需要頻率和節(jié)拍數(shù)據(jù),因此首先需要預(yù)存待演奏的歌曲,將歌曲的音符和節(jié)拍數(shù)據(jù)存儲在存儲器中。本設(shè)計中采用了QuartusⅡ的內(nèi)置存儲器。為了使生成的存儲器滿足設(shè)計要求,在生成的過程中還需要設(shè)置存儲器的參數(shù)。下面介紹在QuartusⅡ環(huán)境下生成存儲器模塊和樂曲數(shù)據(jù)文件的過程。

(1)選擇菜單“tool”→“MegaWizardPlug-InManager…”,打開如圖10.11所示的功能模塊添加向?qū)ВM入向?qū)ы摰谝豁?,然后選擇“Createanewcustommegafunctionvariation”。圖10.11添加存儲器功能模塊向?qū)υ捒?1)

(2)按“Next”按鈕進入向?qū)ы摰诙?,如圖10.12所示。在窗口左側(cè)“Selectamegafunctionfromthelistbelow”列表的“MemoryCompiler”中選擇“ROM:1-PORT”,表示要建立一個單端口的ROM存儲器。在右側(cè)選擇器件系列、生成的輸出文件描述類型以及輸出文件的名稱,這里設(shè)置的輸出文件的類型是VerilogHDL,文件名是“demo_music”,存放路徑是“E:\song”。圖10.12添加存儲器功能模塊向?qū)υ捒?2)

(3)按“Next”按鈕進入圖10.13所示的單端口存儲器設(shè)置向?qū)У谝豁摗T诶锟梢栽O(shè)置存儲器的位寬、存儲單元數(shù)量、存儲器所占資源類型以及時鐘控制方式等,按照圖中所示設(shè)置各參數(shù),生成一個256?×?8的存儲器。圖10.13單端口存儲器設(shè)置向?qū)?1)

(4)按“Next”按鈕進入圖10.14所示的單端口存儲器設(shè)置向?qū)У诙?。在這里可以根據(jù)需要確定存儲器端口是否具有寄存功能、是否設(shè)置使能控制端口和異步清零端口,按圖中所示進行設(shè)置。圖10.14單端口存儲器設(shè)置向?qū)?2)

(5)按“Next”按鈕進入圖10.15所示的單端口存儲器設(shè)置向?qū)У谌?。在該頁面可設(shè)置存儲器數(shù)據(jù)的初始化文件。這里設(shè)置初始化文件名為music_file.mif,該文件用于存放樂譜中每個音符的頻率和節(jié)拍數(shù)據(jù)。圖10.15單端口存儲器設(shè)置向?qū)?3)

(6)按“Next”按鈕進入存儲器設(shè)置向?qū)У谒捻摚擁搶@示生成的存儲器端口,并列出使用的資源和仿真時需要的庫文件,此處未顯示該頁。在該頁中按“Next”按鈕進入存儲器設(shè)置向?qū)У谖屙?,如圖10.16所示。該頁顯示生成器件所產(chǎn)生的文件,并對文件進行簡要的說明。圖10.16單端口存儲器設(shè)置向?qū)?5)完成上述操作后,生成ROM的模塊定義文件demo_music.v和符號文件demo_music.bsf,供用戶使用。代碼10.12是QuartusⅡ生成的demo_music.v文件的主要內(nèi)容。

【代碼10.12】QuartusⅡ生成的ROM模塊對應(yīng)的Verilog文件。樂曲的演奏就是按照樂譜中的每個音符和節(jié)拍進行發(fā)聲,因此首先需要將樂譜轉(zhuǎn)換為演奏所需要的音符和節(jié)拍數(shù)據(jù)。由于從低音到高音共有21個音符,每個音符用其索引值表示,表示音符索引值需要5位二進制數(shù),且節(jié)拍是以1/4秒為基本單位,即以四分音符為1拍,二分音符為2拍,節(jié)拍用3位二進制數(shù)表示,因此音符和節(jié)拍合起來可以用8位二進制數(shù)表示,如圖10.17所示。如3是4分音符,1拍,音符的索引號是9,其二進制數(shù)據(jù)是00101001,對應(yīng)的十進制數(shù)是41。圖10.17音符和節(jié)拍的數(shù)據(jù)表示這里我們以圖10.18所示的“北京歡迎你”的樂曲為例,說明樂譜音符和節(jié)拍數(shù)據(jù)的生成過程。圖10.18“北京歡迎你”樂譜“北京歡迎你”的第一小節(jié)是35

32,每個音符都是4分音符,節(jié)拍數(shù)據(jù)都是1拍,即001,音符對應(yīng)的索引值分別是9、11、9、8,這一小節(jié)依次對應(yīng)的節(jié)拍和音符數(shù)據(jù)是001_01001、001_01011、001_01001、001_01000,對應(yīng)的十進制數(shù)據(jù)是41、43、41、40;第八小節(jié)是21·?,第一個音符是1拍,第二個音符是3拍,節(jié)拍數(shù)據(jù)是001和011,音符對應(yīng)的索引值是8和7,因此這一小節(jié)的節(jié)拍和音符數(shù)據(jù)是001_01000、011_00111,對應(yīng)的十進制數(shù)據(jù)是40、103;用此方法可將樂譜的所有小節(jié)轉(zhuǎn)換成頻率和節(jié)拍數(shù)據(jù),然后將其存儲在ROM的初始化文件music_file.mif中,在QuatusⅡ環(huán)境下生成music_file.mif數(shù)據(jù)文件的截圖,如圖10.19所示。這里需要注意的是:一,樂曲中的休止符“0”在數(shù)據(jù)表中用索引值21表示,因為音頻控制器在設(shè)計時只對索引值為0~20時有信號輸出,其余輸出均為0電平,即不發(fā)聲;二,樂曲用255作為結(jié)束標(biāo)志。圖10.19樂曲存儲器的初始化數(shù)據(jù)文件截圖10.3.4樂曲控制模塊

樂曲控制模塊的功能是逐個從樂曲存儲器中取得每一個音符的索引值和節(jié)拍數(shù)據(jù),在樂曲節(jié)拍持續(xù)時間內(nèi)輸出該音符對應(yīng)的頻率信號,直到樂曲結(jié)束。代碼10.13中的read_rom模塊用于讀取ROM存儲器中的樂曲數(shù)據(jù),根據(jù)每一個數(shù)據(jù)中的節(jié)拍數(shù)據(jù)和音符進行輸出控制。具體方法是,利用一個計數(shù)器生成存儲器的地址,依次讀取ROM中的每一個數(shù)據(jù)。該數(shù)據(jù)的低5位是音符的索引值,高3位是該音符持續(xù)的節(jié)拍,在此節(jié)拍對應(yīng)的時間輸出其音符索引值,直到節(jié)拍持續(xù)時間結(jié)束時地址計數(shù)器加1,讀取下一個存儲單元數(shù)據(jù)。read_rom模塊的時鐘信號采用時鐘信號發(fā)生模塊輸出的4Hz信號,這就使得控制每個音符數(shù)據(jù)持續(xù)時間的基本單位是0.25秒,在時鐘的上升沿對節(jié)拍數(shù)據(jù)減1,若節(jié)拍數(shù)據(jù)減到0,則存儲地址加1計數(shù)來取得下一個音符的數(shù)據(jù),若存儲器中的數(shù)據(jù)為255,則表示樂曲演奏結(jié)束。read_rom模塊端口信號說明如下:

輸入信號:

reset_n——異步復(fù)位輸入信號;

clk_4hz——輸入時鐘信號。

輸出信號:

code_out——音符的索引值輸出信號。

【代碼10.13】read_rom模塊。圖10.20(a)是read_rom模塊復(fù)位后的功能仿真波形,其中所有數(shù)據(jù)顯示均為十進制。圖中,輸入信號clk_4hz是4?Hz的時鐘信號,在reset_n信號低電平有效后,內(nèi)部地址計數(shù)器address依次產(chǎn)生樂曲存儲器的地址,初始化后address=0,因此從地址[0]中讀出的數(shù)據(jù)play_data=41(二進制數(shù)為00101001),其音符索引值code_out=9(play_data低5位二進制),節(jié)拍delay=1(play_data高3位二進制數(shù))。由于節(jié)拍數(shù)據(jù)為1,因此地址計數(shù)器加1,address=1繼續(xù)讀取下一單元的數(shù)據(jù)。當(dāng)address=7時,play_data=73,此時code_out=9,delay=2,節(jié)拍數(shù)據(jù)為2,因此節(jié)拍計數(shù)器減1操作,當(dāng)其為1時地址計數(shù)器address=8,這樣code_out=9輸出持續(xù)兩個節(jié)拍。從圖(a)中可以看出,從存儲器讀出的預(yù)存數(shù)據(jù)控制輸出音符的索引值和其持續(xù)的節(jié)拍。圖(b)是樂曲結(jié)束時的截圖,可以看出,當(dāng)play_data=255時,存儲器的地址計數(shù)器不再發(fā)生變化,由于此時的音符索引值輸出為31(255的低5位數(shù)據(jù))是無效的,因此揚聲器不會發(fā)聲。圖10.20read_rom模塊讀取數(shù)據(jù)過程的功能仿真波形10.3.5樂曲播放器頂層模塊

前面介紹了樂曲演奏模塊中各子模塊的功能和實現(xiàn)代碼,這些子模塊可以構(gòu)成樂曲播放器的頂層模塊。樂曲播放器頂層模塊music_top的實現(xiàn)見代碼10.14,端口信號說明如下:

輸入信號:

reset_n——復(fù)位信號;

clk50M——50?MHz時鐘信號。

輸出信號:

freq_out——音符對應(yīng)的頻率信號;

code——音符索引值。

【代碼10.14】樂曲播放器頂層模塊。可以看到,頂層模塊是由clk_gen、tone_gen和read_rom三個模塊的實例u1、u2和u3構(gòu)成的,clk_gen的u1對50?MHz的時鐘信號分頻后產(chǎn)生5?MHz和4?Hz的輸出信號,這兩個信號分別作為tone_gen實例u2和read_rom實例u3的時鐘輸入信號。其工作過程是u3依次讀取ROM中存儲的樂曲數(shù)據(jù),并對其音符索引值和節(jié)拍數(shù)據(jù)進行分解,然后根據(jù)節(jié)拍數(shù)據(jù)輸出音頻索引值code,由索引值code控制u2輸出其對應(yīng)音符的頻率信號freq_cout,從而控制揚聲器發(fā)聲。圖10.21是頂層文件各信號的仿真結(jié)果,可以看到,在每個clk_4hz信號的上升沿,code依次讀出樂曲存儲器的音頻數(shù)據(jù)索引值5'b01001、5'b01011和5'b01001…圖10.21樂曲播放器頂層模塊的功能仿真波形圖10.22(a)、(b)分別是音頻數(shù)據(jù)索引值5'b01001(中音3)、5'b01011(中音5)下freq_out信號仿真的周期測量結(jié)果。圖(a)中,freq_out的周期為1517200000?ps,其頻率為1/1517200000?ps?=?659?Hz,與表10.1中中音3頻率一致。同理,圖(b)中,freq_out的周期為1276000000?ps,其對應(yīng)的頻率為783.6?Hz,是中音5的頻率。圖10.22音頻信號輸出的仿真結(jié)果

10.4VGA?控?制?器

10.4.1VGA顯示原理

隨著計算機顯示技術(shù)的快速發(fā)展,計算機業(yè)界制定了多種顯示接口協(xié)議,從最初的MDA接口協(xié)議到目前主流的VGA接口協(xié)議。在VGA接口協(xié)議框架中,根據(jù)不同的分辨率和刷新頻率,又分為不同的顯示模式,如VGA(640×480)、SVGA(800×600)和SVGA(1024×768)等。計算機主機端的VGA輸出是一個15針的D-sub接口,如圖10.23所示。接口中各信號引腳的定義如表10.3所示。其引出線中有5個常用的模擬信號,即R、G、B三基色信號、HS行同步信號和VS場同步信號,其電壓范圍為(0~0.7)V。圖10.23計算機端的VGA接口

VGA顯示模式(640?×?480)的行、場掃描時序如圖10.24所示。圖10.24(a)所示是行掃描時序,單位是像素,即輸出一個像素(pixel)的時間間隔。圖中各時間段的像素時間分別是:Ta(行同步頭)?=?96,Tb?=?40,Tc?=?8,Td(行圖像)?=640,Te?=?8,Tf?=?8,Tg(行周期)?=?800。

圖10.24(b)所示是場掃描時序,單位是行,即輸出一行圖像(Line)的時間間隔。圖中各時間段為:Ta(場同步頭)?=?2,Tb?=?25,Tc?=?8,Td(場圖像)?=?480,Te?=?8,Tf?=?2,Tg(場周期)?=?525。圖10.24VGA顯示模式(640?×?480)的行、場掃描時序圖10.25所示為VGA圖像顯示掃描示意圖,在設(shè)計時可用兩個計數(shù)器分別作為行和場掃描計數(shù)器。行計數(shù)器的計數(shù)時鐘可以采用25.2?MHz,行計數(shù)器的溢出信號可作為場計數(shù)器的計數(shù)時鐘。由行場計數(shù)器控制行、場同步信號的產(chǎn)生,并在圖像顯示區(qū)域輸出對應(yīng)像素點的RGB數(shù)據(jù),就能顯示出相應(yīng)的圖像。需要注意的是,在行、場消隱期間輸出的數(shù)據(jù)應(yīng)為0。圖10.25VGA圖像顯示掃描示意圖在VGA接口協(xié)議中,不同的顯示模式因為有不同的分辨率或不同的刷新頻率,所以其時序也不相同。對于每種顯示模式的時序,VGA都有嚴格的工業(yè)標(biāo)準(zhǔn)。表10.4所示為Xilinx公司制定的VGA時序標(biāo)準(zhǔn)。10.4.2VGA控制信號發(fā)生器

根據(jù)VGA的顯示原理,VGA控制器需要產(chǎn)生VGA的驅(qū)動信號有紅基色、綠基色、藍基色、水平同步信號、垂直同步信號。

1.設(shè)計時的幾個主要問題

VGA控制器在設(shè)計的過程中需要解決以下幾個方面的問題。

1)時鐘信號的產(chǎn)生

當(dāng)顯示模式為VGA(640?×?480)時,像素時鐘頻率應(yīng)為25.175?MHz。由于時鐘精度要求較高,用前面講的分頻方法不能滿足其精度要求,因此這里采用27?MHz的時鐘信號經(jīng)過QuartusⅡ內(nèi)部提供的PLL鎖相環(huán)產(chǎn)生25.2?MHz的時鐘信號。下面介紹利用鎖相環(huán)PLL產(chǎn)生25.175?MHz像素時鐘的過程。

Altera公司的中高檔FPGA中一般都帶有PLL,數(shù)量為一個或多個。PLL的設(shè)計方法靈活,能有效地實現(xiàn)信號分頻、倍頻處理。這里詳細介紹PLL實現(xiàn)分頻的設(shè)置步驟。

(1)在QuartusⅡ環(huán)境下,創(chuàng)建一個工程,并新建一個原理圖文件。

(2)選擇Tools菜單中的“MegaWizardPlug-InManager

…”,出現(xiàn)如圖10.26所示的界面。圖10.26選擇ALTPLL模塊在左邊模塊列表的I/O中選擇ALTPLL,并選擇輸出的HDL語言為VerilogHDL,設(shè)置輸出文件為altPLL0,然后單擊Next按鈕進行下一步設(shè)置,如圖10.27所示。圖10.27PLL參數(shù)設(shè)置界面(1)

(3)在彈出的對話框中進行FPGA速率和輸入時鐘頻率的設(shè)置,按照圖10.27所示設(shè)置完畢后,單擊Next按鈕進行下一步設(shè)置。

(4)在彈出的對話框中設(shè)置可選的輸入和輸出信號,例如使能信號、復(fù)位信號等,如圖10.28所示,然后單擊Next按鈕進行下一步設(shè)置。圖10.28PLL參數(shù)設(shè)置界面(2)

(5)在彈出的對話框中設(shè)置輸出信號c0的分頻系數(shù)、延時和占空比參數(shù),如圖10.29所示,PLL的分頻系數(shù)采用輸出頻率設(shè)置,輸出頻率為25.175?MHz,從圖中可以看到實際產(chǎn)生的時鐘頻率為25.2?MHz,這也可以滿足VGA工作時鐘的要求。設(shè)置完畢后,單擊Next按鈕進行下一步設(shè)置。圖10.29PLL參數(shù)設(shè)置界面(3)

(6)在彈出的對話框中可以設(shè)置時鐘信號c1的分頻系數(shù)、延時和占空比參數(shù),如圖10.30所示。由于本例中只需要產(chǎn)生一個時鐘信號,所以不選中“Usethisclock”。單擊Next按鈕還會出現(xiàn)c2和c3時鐘信號的設(shè)置界面,與圖10.30相似。圖10.30PLL參數(shù)設(shè)置界面(4)

(7)設(shè)置完所有參數(shù)后,系統(tǒng)會根據(jù)設(shè)置的參數(shù)生成滿足要求的模塊文件。各文件的名稱及功能見圖10.31所示,其中altPLL0.v文件中有altPLL0的模塊定義。圖10.31PLL參數(shù)設(shè)置界面(5)

altPLL0模塊的完整代碼如代碼10.15所示,代碼的主要內(nèi)容是對模塊altpll_component的端口定義和參數(shù)設(shè)置。

【代碼10.15】生成的altPLL0.v文件內(nèi)容。

2)

VGA顯示參數(shù)的設(shè)置

不同的分辨率有不同的時序,根據(jù)表10.4編寫VGA_

Param.h文件,將要用到的數(shù)據(jù)定義成為常量,可以由宏定義語句調(diào)用`include"VGA_Param.h"??刂颇K根據(jù)VGA的參數(shù)控制時序并產(chǎn)生所需信號。這樣操作的好處是可以在采用不同的顯

溫馨提示

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

評論

0/150

提交評論