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

下載本文檔

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

文檔簡介

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

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

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

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

一個(gè)路口控制模塊traffic_con的各端口信號(hào)的說明如下:

輸入信號(hào):

clk——1?Hz時(shí)鐘信號(hào);

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

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

red_time——紅燈時(shí)間(秒);

green_time——綠燈時(shí)間(秒);

yellow_time——黃燈時(shí)間(秒);

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

test——信號(hào)燈測試控制信號(hào)。輸出信號(hào):

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

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

【代碼10.1】單個(gè)路口交通燈控制模塊。主干道和次干道的初始化狀態(tài)截圖如圖10.1和圖10.2所示,圖10.1中prim_flog=1,表示該路口是主干道。因此,在復(fù)位信號(hào)無效后,紅、黃、綠燈的輸出信號(hào)ryg_light立即為3'b001,即綠燈亮,由于green_time=6,所以綠燈持續(xù)時(shí)間應(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ù)位信號(hào)無效后,紅、黃、綠燈的輸出信號(hào)ryg_light=3‘b100,即紅燈先亮。紅燈持續(xù)9秒后依次是綠燈亮6秒、黃燈亮2秒。

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

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

輸入信號(hào):

clk——1?Hz時(shí)鐘信號(hào);

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

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

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

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

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

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

test——信號(hào)燈測試控制信號(hào)。輸出信號(hào):

prim_wait_time——主干道倒計(jì)時(shí)時(shí)間;

seco_wait_time——次干道倒計(jì)時(shí)時(shí)間;

prim_ryg_light——主干道紅、黃、綠信號(hào)燈;

seco_ryg_light——次干道紅、黃、綠信號(hào)燈。

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

10.2多功能數(shù)字鐘

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

模式。

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

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

輸入信號(hào):

RSTn——復(fù)位信號(hào);

CLK——100?Hz時(shí)鐘信號(hào);

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

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

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

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

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

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

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

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

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

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

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

flag——時(shí)鐘選擇輸入信號(hào);

clk_100?Hz——輸入100?Hz時(shí)鐘信號(hào);

clk_2?Hz——輸入2?Hz時(shí)鐘信號(hào);

Clkout——輸出時(shí)鐘信號(hào)。10.2.4七段顯示模塊

1.BCD碼顯示模塊

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

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

如下:

輸入信號(hào):

hex——2位8421BCD碼輸入。

輸出信號(hào):

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

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

2.2位七段顯示模塊

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

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

3.1位七段譯碼模塊

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

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

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

輸入信號(hào):

iCLK_50——50?MHz時(shí)鐘信號(hào);

RSTn——復(fù)位信號(hào);

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

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

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

H_dis——“小時(shí)”數(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í)”數(shù)據(jù)(十六進(jìn)制);

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

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

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

10.3樂?曲?播?放?器

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

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

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

輸入信號(hào):

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

clk50M——50?MHz輸入信號(hào)。

輸出信號(hào):

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

clk_5?Mhz——5?MHz輸出信號(hào)。

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

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

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

5×106是5?MHz輸入時(shí)鐘信號(hào)頻率。如中音“1”的頻率

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

輸入信號(hào):

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

code——輸入音符索引值;

clk——5MHz時(shí)鐘信號(hào)。

輸出信號(hào):

freq_out——code對(duì)應(yīng)的音頻輸出信號(hào)。

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

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

(1)選擇菜單“tool”→“MegaWizardPlug-InManager…”,打開如圖10.11所示的功能模塊添加向?qū)?,進(jìn)入向?qū)ы摰谝豁摚缓筮x擇“Createanewcustommegafunctionvariation”。圖10.11添加存儲(chǔ)器功能模塊向?qū)?duì)話框(1)

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

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

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

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

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

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

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

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

輸入信號(hào):

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

clk_4hz——輸入時(shí)鐘信號(hào)。

輸出信號(hào):

code_out——音符的索引值輸出信號(hào)。

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

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

輸入信號(hào):

reset_n——復(fù)位信號(hào);

clk50M——50?MHz時(shí)鐘信號(hào)。

輸出信號(hào):

freq_out——音符對(duì)應(yīng)的頻率信號(hào);

code——音符索引值。

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

10.4VGA?控?制?器

10.4.1VGA顯示原理

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

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

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

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

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

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

1)時(shí)鐘信號(hào)的產(chǎn)生

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

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

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

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

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

(3)在彈出的對(duì)話框中進(jìn)行FPGA速率和輸入時(shí)鐘頻率的設(shè)置,按照?qǐng)D10.27所示設(shè)置完畢后,單擊Next按鈕進(jìn)行下一步設(shè)置。

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

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

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

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

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

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

2)

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論