EDA技術(shù)及應(yīng)用第8章_第1頁(yè)
EDA技術(shù)及應(yīng)用第8章_第2頁(yè)
EDA技術(shù)及應(yīng)用第8章_第3頁(yè)
EDA技術(shù)及應(yīng)用第8章_第4頁(yè)
EDA技術(shù)及應(yīng)用第8章_第5頁(yè)
已閱讀5頁(yè),還剩288頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章數(shù)字系統(tǒng)設(shè)計(jì)實(shí)例8.1數(shù)字密碼鎖電路設(shè)計(jì)8.2IIR濾波器電路設(shè)計(jì)8.3簡(jiǎn)單電子琴電路設(shè)計(jì)8.4交通信號(hào)燈控制器電路設(shè)計(jì)8.1數(shù)字密碼鎖電路設(shè)計(jì)

8.1.1系統(tǒng)設(shè)計(jì)要求

(1)密碼輸入:每按下一個(gè)數(shù)字鍵,就輸入一個(gè)數(shù)值,并在顯示器上顯示出該數(shù)值,同時(shí)將先前輸入的數(shù)據(jù)依次左移一個(gè)數(shù)字位置。

(2)密碼清除:按下“清除”鍵可清除前面所有輸入的值。

(3)密碼更改:按下“更改”鍵可將目前的數(shù)碼設(shè)定成新的密碼。

(4)密碼上鎖:按下“上鎖”鍵可將密碼鎖定。

(5)密碼解鎖:按下“解鎖”鍵首先檢查輸入的密碼是否正確,密碼正確即開鎖。8.1.2系統(tǒng)設(shè)計(jì)

根據(jù)系統(tǒng)設(shè)計(jì)要求,系統(tǒng)設(shè)計(jì)采用自頂向下的設(shè)計(jì)方法。頂層設(shè)計(jì)采用原理圖設(shè)計(jì)方式,系統(tǒng)整體設(shè)計(jì)原理圖如圖8-1所示。它由密碼鎖輸入模塊(SR)、密碼鎖控制模塊(CTRL)和譯碼顯示模塊(YM)三部分組成。圖8-1系統(tǒng)的整體組裝設(shè)計(jì)原理圖8.1.3模塊設(shè)計(jì)與實(shí)現(xiàn)

1.密碼鎖輸入模塊

(1)時(shí)序產(chǎn)生電路。時(shí)序產(chǎn)生電路中使用三種不同頻率的工作脈沖波形,即系統(tǒng)時(shí)鐘脈沖、彈跳消除取樣信號(hào)和鍵盤掃描信號(hào)。

(2)鍵盤掃描電路。鍵盤掃描電路的作用是提供鍵盤掃描信號(hào),掃描信號(hào)變化的順序依次為1110→1101→1011→0111

→1110…。圖8-2鍵盤掃描示意圖當(dāng)鍵盤掃描信號(hào)為1110時(shí),按鍵位置分別為011(“1”鍵按下)、101(“2”鍵按下)、110(“3”鍵按下);當(dāng)鍵盤掃描信號(hào)為1101時(shí),按鍵位置分別為011(“4”鍵按下)、101(“5”鍵按下)、110(“6”鍵按下);當(dāng)鍵盤掃描信號(hào)為1011時(shí),按鍵位置分別為011(“7”鍵按下)、101(“8”鍵按下)、110(“9”鍵按下);當(dāng)鍵盤掃描信號(hào)為0111時(shí),按鍵位置分別為011(“*”鍵按下)、101(“0”鍵按下)、110(“#”鍵按下)。

(3)鍵盤譯碼電路。上述鍵盤中的按鍵分為數(shù)字按鍵和功能按鍵,每個(gè)功能按鍵可能負(fù)責(zé)不同的功能,例如“清除”鍵、“上鎖”鍵和“解鎖”鍵等。數(shù)字按鍵主要是用來(lái)輸入數(shù)字的。但是鍵盤所產(chǎn)生的輸出是無(wú)法直接拿來(lái)用作密碼鎖控制電路的輸入的;另外,不同的按鍵具有不同的功能,所以必須有鍵盤譯碼電路來(lái)規(guī)劃每個(gè)按鍵的輸出形式,以便執(zhí)行相應(yīng)的動(dòng)作。①按鍵存儲(chǔ)電路。因?yàn)槊看螔呙钑?huì)產(chǎn)生新的按鍵數(shù)據(jù),可能會(huì)覆蓋前面的數(shù)據(jù),所以需要一個(gè)按鍵存儲(chǔ)電路,將整個(gè)鍵盤掃描完畢的結(jié)果記錄下來(lái)。本設(shè)計(jì)采用串入串出移位寄存器實(shí)現(xiàn)按鍵存儲(chǔ)電路。②各按鍵位置與數(shù)碼關(guān)系如表8-1所示。其中“*”為“上鎖”鍵,“#”為“清除/解鎖”鍵。若按下的是數(shù)字鍵,則譯成相對(duì)應(yīng)的BCD碼;若按下的是功能鍵,則譯成四位數(shù)的碼字,并由密碼鎖控制電路給出相應(yīng)的動(dòng)作。根據(jù)上述分析,密碼輸入電路的VHDL源程序(SR.VHD)如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYSRIS

PORT(CLK_IN:INSTD_LOGIC;--時(shí)鐘信號(hào)

KEY_IN:INSTD_LOGIC_VECTOR(2DOWNTO0); --按鍵輸入信號(hào)

DATA_N:OUTSTD_LOGIC_VECTOR(3DOWNTO0); --數(shù)字鍵數(shù)據(jù)

DATA_F:OUTSTD_LOGIC_VECTOR(3DOWNTO0); --功能鍵數(shù)據(jù)

FLAG_N:OUTSTD_LOGIC;--數(shù)字鍵數(shù)據(jù)標(biāo)志

FLAG_F:OUTSTD_LOGIC;--功能鍵數(shù)據(jù)標(biāo)志

CQD:OUTSTD_LOGIC;--鍵盤輸入采樣時(shí)鐘

KSEL:OUTSTD_LOGIC_VECTOR(3DOWNTO0);

--鍵盤掃描信號(hào)

CSR:OUTSTD_LOGIC_VECTOR(1DOWNTO0)); --按鍵行號(hào)00,01,10,11

ENDENTITYSR;

ARCHITECTUREARTOFSRIS

SIGNALC_QD:STD_LOGIC;

SIGNALC_SR:STD_LOGIC_VECTOR(1DOWNTO0);

SIGNALN,F:STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALFN,FF:STD_LOGIC;

SIGNALSEL:STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALQ:STD_LOGIC_VECTOR(5DOWNTO0);

SIGNALC:STD_LOGIC_VECTOR(2DOWNTO0);

BEGIN --內(nèi)部連接

DATA_N<=N; --數(shù)字鍵譯碼值寄存器

DATA_F<=F;

FLAG_N<=FN; --數(shù)字鍵標(biāo)志值數(shù)據(jù)

FLAG_F<=FF;

CQD<=C_QD; --鍵盤輸入采樣時(shí)鐘

CSR<=C_SR; --按鍵位置

KSEL<=SEL; --鍵盤掃描信號(hào)

C(0)<=KEY_IN(0); --按鍵輸入寄存器(鍵盤矩陣的輸出)

C(1)<=KEY_IN(1);

C(2)<=KEY_IN(2);COUNTER:BLOCKIS; --鍵盤掃描模塊(計(jì)數(shù)器)

BEGIN

PROCESS(CLK_IN)IS

BEGIN

IF(CLK_IN'EVENTANDCLK_IN='1')THEN

Q<=Q+1;

ENDIF;

C_QD<=Q(3); --鍵盤輸入采樣時(shí)鐘

C_SR<=Q(5DOWNTO4); --確定鍵盤掃描行號(hào)

ENDPROCESS;

SEL<="1110"WHENC_SR=00ELSE;--掃描“0”行

"1101"WHENC_SR=01ELSE

"1011"WHENC_SR=10ELSE

"0111"WHENC_SR=11ELSE

"1111";

ENDBLOCKCOUNTER;

KEY_DECODER:BLOCK;--鍵盤譯碼模塊

SIGNALZ:STD_LOGIC_VECTOR(4DOWNTO0);

--按鍵位置

BEGIN

PROCESS(C_QD);--鍵盤采樣時(shí)鐘觸發(fā)

BEGIN

Z<=C_SR&C;

--按鍵位置<掃描行>(2位)&按鍵輸入<讀出列>(3位)

IF(C_QD'EVENTANDC_QD='1')THEN

CASEZIS

WHEN"11101"=>N<="0000"; --數(shù)字鍵“0”

WHEN"00011"=>N<="0001"; --數(shù)字鍵“1”

WHEN"00101"=>N<="0010";

WHEN"00110"=>N<="0011";

WHEN"01011"=>N<="0100";

WHEN"01101"=>N<="0101";

WHEN"01110"=>N<="0110";

WHEN"10011"=>N<="0111";

WHEN"10101"=>N<="1000";

WHEN"10110"=>N<="1001"; --數(shù)字鍵“9”

WHENOTHERS=>N<="1111";

ENDCASE;

ENDIF;

IF(C_QD'EVENTANDC_QD='1')THEN

CASEZIS

WHEN"11011"=>F<="0100"; --功能鍵“*”

WHEN"11110"=>F<="0001"; --功能鍵“#”

WHENOTHERS=>F<="1000";

ENDCASE;

ENDIF;

ENDPROCESS;

FN<=NOT(N(3)ANDN(2)ANDN(1)ANDN(0)); --數(shù)字鍵標(biāo)志

FF<=F(2)ORF(0); --功能鍵標(biāo)志

ENDBLOCKKEY_DECODER;

ENDARCHITECTUREART;

2.密碼鎖控制模塊

1)數(shù)字按鍵輸入的相應(yīng)控制

(1)如果按下數(shù)字鍵,第一個(gè)數(shù)字會(huì)從顯示器的最右端開始顯示,此后每新按下一個(gè)數(shù)字,顯示器上的數(shù)字必須左移一位,以便將新的數(shù)據(jù)顯示出來(lái)。

(2)假如要更改輸入的數(shù)字,可以按“倒退”鍵來(lái)清除前面輸入的一個(gè)數(shù)字,或者按“清除”鍵清除所有輸入數(shù)字,再重新輸入四位數(shù)。

(3)由于這里設(shè)計(jì)的是一個(gè)四位電子密碼鎖,所以當(dāng)輸入的數(shù)字鍵超過4個(gè)時(shí),電路不予理會(huì),而且不再顯示第四個(gè)以后的數(shù)字。

2)功能按鍵輸入的相應(yīng)控制

(1)“清除”鍵:清除所有的輸入數(shù)字,即作歸零動(dòng)作。

(2)“上鎖”鍵:按下此鍵時(shí)可將密碼鎖上鎖(上鎖前必須設(shè)置四位數(shù)字密碼)。

(3)“解鎖”鍵:按下此鍵會(huì)檢查輸入的密碼是否正確,若密碼正確無(wú)誤則解鎖。下面給出密碼鎖控制模塊的VHDL源程序(CTRL.VHD):

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCTRLIS

PORT(DATA_N:INSTD_LOGIC_VECTOR(3DOWNTO0); --數(shù)字鍵數(shù)據(jù)

DATA_F:INSTD_LOGIC_VECTOR(3DOWNTO0); --功能鍵數(shù)據(jù)

FLAG_N:INSTD_LOGIC;--數(shù)字鍵數(shù)據(jù)標(biāo)志

FLAG_F:INSTD_LOGIC;--功能鍵數(shù)據(jù)標(biāo)志

MIMAIN:BUFFERSTD_LOGIC;--密碼輸入標(biāo)志

SETIN:BUFFERSTD_LOGIC;--密碼設(shè)置標(biāo)志

OLD:BUFFERSTD_LOGIC;--舊密碼設(shè)置標(biāo)志

CQD:INSTD_LOGIC;--鍵盤輸入采樣時(shí)鐘

ENLOCK:OUTSTD_LOGIC;--開鎖信號(hào)

DATA_BCD:OUTSTD_LOGIC_VECTOR(15DOWNTO0));

--BCD數(shù)據(jù)

ENDENTITYCTRL;ARCHITECTUREARTOFCTRLIS

SIGNALACC,REG:STD_LOGIC_VECTOR(15DOWNTO0);

--ACC暫存鍵入的信息,REG存儲(chǔ)輸入的密碼

BEGIN

PROCESS(CQD,FLAG_F)IS

BEGIN

IF(CQD'EVENTANDCQD='0')THEN

IFFLAG_F='1'THEN

IF(DATA_F="0100")THEN

ACC<="1111111111111111"; --功能鍵“*”

MIMAIN<='0';SETIN<='0';OLD<='0';

ELSIF(DATA_F="0001")THEN

IF(MIMAIN='0'ANDSETIN='0')THEN

CASEACC(7DOWNTO0)IS

WHEN"00010001"=>ENLOCK<='1';--開鎖信號(hào)

WHEN"10011001"=>MIMAIN<='1';--密碼輸入標(biāo)志

ACC<="1111111111111111";

WHEN"01010101"=>SETIN<='1';--密碼設(shè)置標(biāo)志

ACC<="1111111111111111";

OLD<='1';

WHENOTHERS=>NULL;

ENDCASE;

ELSIF(MIMAIN=‘1’)THEN

IFACC=REGTHEN;--密碼核對(duì)

ENLOCK<='0';

MIMAIN<='0';

ELSE

MIMAIN<='0';

ENDIF;

ELSIF(SETIN='1')THEN

IF(OLD='1')THEN

IF(ACC=REG)THEN

OLD<='0';

ELSE

SETIN<='0';

OLD<='0';

ENDIF;

ELSE

IF(ACC<“1001100110011001”)THEN;

--BCD碼小于“9999”為有效碼

REG<=ACC; --密碼存儲(chǔ)

SETIN<='0';

ENDIF;

ENDIF;

ENDIF;

ENDIF;

ELSIFFLAG_N=‘1’THEN

ACC<=ACC(11DOWNTO0)&DATA_N;

--實(shí)現(xiàn)數(shù)位左移

ENDIF;

ENDIF;

ENDPROCESS;

DATA_BCD<=ACC;

ENDARCHITECTUREART;

3.譯碼顯示模塊

譯碼顯示模塊的主要功能是將輸入的數(shù)字通過數(shù)碼管顯示出來(lái),根據(jù)數(shù)碼顯示電路的原理,很容易得到數(shù)字密碼鎖譯碼顯示電路的VHDL設(shè)計(jì)程序(YM.VHD):

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYYMIS

PORT(DATA_BCD:INSTD_LOGIC_VECTOR(3DOWNTO0);

DOUT7:OUTSTD_LOGIC_VECTOR(6DOWNTO0));

ENDENTITYYM;ARCHITECTUREARTOFYMIS

BEGIN

PROCESS(DATA_BCD)

BEGIN

CASEDATA_BCDIS

WHEN"0000"=>DOUT7<="0111111";--顯示字形“0”

WHEN"0001"=>DOUT7<="0000110";--顯示字形“1”

WHEN"0010"=>DOUT7<="1011011";

WHEN"0011"=>DOUT7<="1001111";

WHEN"0100"=>DOUT7<="1100110";

WHEN"0101"=>DOUT7<="1101101";

WHEN"0110"=>DOUT7<="1111101";

WHEN"0111"=>DOUT7<="0000111";

WHEN"1000"=>DOUT7<="1111111";

WHEN“1001”=>DOUT7<=“1101111”;

WHENOTHERS=>DOUT7<=“0000000”;

ENDCASE;

ENDPROCESS;

ENDARCHITECTUREART;8.1.4波形仿真

1.密碼鎖輸入模塊的仿真波形

密碼鎖輸入模塊仿真波形如圖8-3所示。圖8-3密碼鎖輸入模塊仿真波形

2.密碼鎖控制模塊的仿真波形

密碼鎖控制模塊仿真波形如圖8-4所示。圖8-4密碼鎖控制模塊仿真波形

3.密碼鎖譯碼模塊的仿真波形

密碼鎖譯碼模塊仿真波形如圖8-5所示。圖8-5密碼鎖譯碼模塊仿真波形

4.密碼鎖系統(tǒng)總體仿真圖

(1)設(shè)置新密碼部分。初始出廠時(shí)設(shè)置的密碼為“0000”,用戶重新設(shè)置為“0062”。頂層模塊仿真波形1如圖8-6所示。圖8-6頂層模塊仿真波形1

(2)上鎖部分。按下“#”表示上鎖,設(shè)置完畢后上鎖鍵(ENLOCK)有效。頂層模塊仿真波形2如圖8-7所示。圖8-7頂層模塊仿真波形2(3)解鎖但輸入錯(cuò)誤。當(dāng)按下“0692”、“*”時(shí),上鎖鍵(ENLOCK)仍然有效,表示輸入密碼有錯(cuò)誤,沒有解開密碼。頂層模塊仿真波形3如圖8-8所示。圖8-8頂層模塊仿真波形3

(4)解鎖且輸入正確。當(dāng)按下“0062”、“*”時(shí),上鎖鍵(ENLOCK)無(wú)效,表示輸入的密碼正確,解開密碼。頂層模塊仿真波形4如圖8-9所示。圖8-9頂層模塊仿真波形48.2IIR濾波器電路設(shè)計(jì)

8.2.1概述

IIR濾波器傳輸函數(shù)的一般形式為

(8-1)其差分方程的一般形式為(8-2)常用的IIR數(shù)字濾波器實(shí)現(xiàn)方法有如下幾種:①采用在通用計(jì)算機(jī)系統(tǒng)中加上專用的加速處理機(jī)實(shí)現(xiàn);②利用DSP芯片實(shí)現(xiàn);③采用普通硬件組合實(shí)現(xiàn);④采用EDA技術(shù)和FPGA/CPLD器件實(shí)現(xiàn)。在這幾種方法中,利用EDA加FPGA/CPLD的方法具有速度快、成本低、效率高等優(yōu)點(diǎn)。通常利用EDA技術(shù)和FPGA/CPLD實(shí)現(xiàn)IIR數(shù)字濾波器有如下幾種方法:

①利用VHDL實(shí)現(xiàn);

②利用LPM設(shè)計(jì)方法;

③利用DSPBulider實(shí)現(xiàn);

④利用IP核實(shí)現(xiàn)。8.2.2IIR濾波器設(shè)計(jì)方案

式(8-2)的二階形式如下:(8-3)這樣就可以將任意階的IIR濾波器通過若干二階網(wǎng)絡(luò)(也稱為濾波器的二階基本節(jié))級(jí)聯(lián)起來(lái),如圖8-10所示。圖8-10級(jí)聯(lián)二階IIR網(wǎng)絡(luò)對(duì)于每一個(gè)二階基本節(jié),可以通過轉(zhuǎn)置直接Ⅱ型結(jié)構(gòu)加以實(shí)現(xiàn),如圖8-11所示。圖8-11二階基本節(jié)直接Ⅱ型結(jié)構(gòu)采用這種級(jí)聯(lián)結(jié)構(gòu)實(shí)現(xiàn)IIR濾波器的優(yōu)點(diǎn)是每一個(gè)基本節(jié)只是關(guān)系到濾波器的某一對(duì)極點(diǎn)和一對(duì)零點(diǎn),調(diào)整系數(shù)ai,只單獨(dú)地調(diào)整了濾波器第i對(duì)零點(diǎn),而不影響其他任何零、極點(diǎn)。同樣,調(diào)整bi系數(shù),也只單獨(dú)調(diào)整了第i對(duì)極點(diǎn)。因此,這種結(jié)構(gòu)便于準(zhǔn)確地實(shí)現(xiàn)濾波器的零、極點(diǎn),也便于調(diào)整濾波器的頻率響應(yīng)性能。假設(shè)要設(shè)計(jì)一個(gè)4階IIR濾波器,則采用MATLAB實(shí)現(xiàn)IIR濾波器的源代碼如下:

FilterOrder=4;

[FeedForward,FeedBack]=ellip(FilterOrder,3,50,300/500);

figure(1);

freqz(FeedForward,FeedBack);

title(‘FrequencyResponse(fullprecisioncoefficients)’);

[z,p,k]=tf2zp(FeedForward,FeedBack);

SecOrd=zp2sos(z,p,k);可得

SecOrd=[0.1116 0.2086 0.1116 1.0000 -0.53620.4138

1.00001.4239 1.0000 1.0000 0.50990.8690]

則可得該濾波器的二階差分方程的系數(shù)如表8-2所示,幅頻響應(yīng)如圖8-12所示。圖8-12IIR幅頻響應(yīng)8.2.3IIR濾波器實(shí)現(xiàn)

1.設(shè)計(jì)方案

式(8-3)所對(duì)應(yīng)的二階節(jié)系統(tǒng)函數(shù)的差分方程為(8-4)

2.主要功能模塊設(shè)計(jì)

1)輸入控制單元

將輸入數(shù)據(jù)送入輸入寄存器中,其VHDL描述如下:

input_reg_process:PROCESS(clk)

BEGIN

IFclk‘eventANDclk=’1‘THEN

IFreset=’1‘THEN

input_register<=0.0000000000000000E+000;

ELSIFclk_en=‘1’THEN

input_register<=x;

ENDIF;

ENDIF;

ENDPROCESSinput_reg_process;

scale1<=input_register*scaleconst1;

2)移位單元

將輸入寄存器上一時(shí)刻的數(shù)據(jù)送入delay_section1(0),同時(shí)又將delay_section1(0)上一時(shí)刻的數(shù)據(jù)送入delay_section1(1),其VHDL描述如下:

delay_process_section1:PROCESS(clk)

BEGIN

IFclk‘eventANDclk=’1‘THEN

IFreset=’1‘THEN

delay_section1(0TO1)<=(OTHERS=>

0.0000000000000000E+000);

ELSIFclk_en=‘1’THEN

delay_section1(0)<=a1sum1;

delay_section1(1)<=delay_section1(0);

ENDIF;

ENDIF;

ENDPROCESSdelay_process_section1;

3)乘加單元

先將系數(shù)與其相關(guān)數(shù)據(jù)相乘,再進(jìn)行相加,其VHDL描述如下:

PROCESS(scale1,delay_section1,a1sum1)

BEGIN

inputconv1<=scale1;

a2mul1<=delay_section1(0)*coeff_a2_section1;

a3mul1<=delay_section1(1)*coeff_a3_section1;

b1mul1<=a1sum1;

b2mul1<=delay_section1(0)*coeff_b2_section1;

b3mul1<=delay_section1(1);

a2sum1<=inputconv1-a2mul1;

a1sum1<=a2sum1-a3mul1;

b2sum1<=b1mul1+b2mul1;

b1sum1<=b2sum1+b3mul1;

scale2<=b1sum1*scaleconst2;

4)輸出控制單元

將輸出數(shù)據(jù)送入輸出寄存器輸出,其VHDL描述如下:

output_register_process:PROCESS(clk)

BEGIN

IFclk‘eventANDclk=’1‘THEN

IFreset=’1‘THEN

output_register<=0.0000000000000000E+000

ELSIFclk_enable=‘1’THEN

output_register<=output_typeconvert;

ENDIF;

ENDIF;

ENDPROCESSoutput_register_process;

result<=output_register;將設(shè)計(jì)好的各模塊按照二階節(jié)電路連接,即構(gòu)成4階IIR濾波器其中一個(gè)二階節(jié),同理再設(shè)計(jì)另一個(gè)二階節(jié)濾波器,然

后連接起來(lái)即構(gòu)成一個(gè)4階的IIR濾波器,其波形仿真如圖8-13所示。圖8-13IIR濾波器波形仿真8.2.4IIR濾波器的其他FPGA/CPLD實(shí)現(xiàn)方案

1.基于LPM的IIR濾波器設(shè)計(jì)

(1)?LPM乘加器的VHDL源文件如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

LIBRARYaltera_mf;

USEaltera_mf.all;

ENTITYfmaddIS

PORT(aclr3:INSTD_LOGIC:=‘0’;

clock0:INSTD_LOGIC:='1';

dataa_0:INSTD_LOGIC_VECTOR(17DOWNTO0):

=(OTHERS=>'0');

dataa_1:INSTD_LOGIC_VECTOR(17DOWNTO0):

=(OTHERS=>'0');

dataa_2:INSTD_LOGIC_VECTOR(17DOWNTO0):

=(OTHERS=>'0');

datab_0:INSTD_LOGIC_VECTOR(17DOWNTO0):

=(OTHERS=>'0');

datab_1:INSTD_LOGIC_VECTOR(17DOWNTO0):

=(OTHERS=>'0');

datab_2:INSTD_LOGIC_VECTOR(17DOWNTO0):

=(OTHERS=>'0');

ena0:INSTD_LOGIC:='1';

result:OUTSTD_LOGIC_VECTOR(37DOWNTO0));

ENDfmadd;ARCHITECTURESYNOFfmaddIS

SIGNALsub_wire0:STD_LOGIC_VECTOR(37DOWNTO0);

SIGNALsub_wire1:STD_LOGIC_VECTOR(17DOWNTO0);

SIGNALsub_wire2:STD_LOGIC_VECTOR(53DOWNTO0);

SIGNALsub_wire3:STD_LOGIC_VECTOR(17DOWNTO0);

SIGNALsub_wire4:STD_LOGIC_VECTOR(17DOWNTO0);SIGNALsub_wire5:STD_LOGIC_VECTOR(17DOWNTO0);

SIGNALsub_wire6:STD_LOGIC_VECTOR(53DOWNTO0);

SIGNALsub_wire7:STD_LOGIC_VECTOR(17DOWNTO0);

SIGNALsub_wire8:STD_LOGIC_VECTOR(17DOWNTO0);

COMPONENTaltmult_add

GENERIC(

addnsub_multiplier_aclr1:STRING;

addnsub_multiplier_pipeline_aclr1:STRING;

addnsub_multiplier_pipeline_register1:STRING;

addnsub_multiplier_register1:STRING;

dedicated_multiplier_circuitry:STRING;

input_aclr_a0:STRING;

input_aclr_a1:STRING;

input_aclr_a2:STRING;

input_aclr_b0:STRING;

input_aclr_b1:STRING;

input_aclr_b2:STRING;

input_register_a0:STRING;

input_register_a1:STRING;

input_register_a2:STRING;

input_register_b0:STRING;

input_register_b1:STRING;

input_register_b2:STRING;

input_source_a0:STRING;

input_source_a1:STRING;

input_source_a2:STRING;

input_source_b0:STRING;

input_source_b1:STRING;

input_source_b2:STRING;

intended_device_family:STRING;

lpm_type:STRING;

multiplier1_direction:STRING;

multiplier_aclr0:STRING;

multiplier_aclr1:STRING;

multiplier_aclr2:STRING;

multiplier_register0:STRING;

multiplier_register1:STRING;

multiplier_register2 :STRING;

number_of_multipliers:NATURAL;

output_aclr:STRING;

output_register:STRING;

port_addnsub1:STRING;

port_signa:STRING;

port_signb:STRING;

representation_a:STRING;

representation_b:STRING;

signed_aclr_a:STRING;

signed_aclr_b:STRING;

signed_pipeline_aclr_a:STRING;

signed_pipeline_aclr_b:STRING;

signed_pipeline_register_a:STRING;

signed_pipeline_register_b:STRING;

signed_register_a:STRING;

signed_register_b:STRING;

width_a:NATURAL;

width_b:NATURAL;

width_result:NATURAL);

PORT(dataa:INSTD_LOGIC_VECTOR(53DOWNTO0);

datab:INSTD_LOGIC_VECTOR(53DOWNTO0);

clock0:INSTD_LOGIC;

aclr3:INSTD_LOGIC;

ena0:INSTD_LOGIC;

result:OUTSTD_LOGIC_VECTOR(37DOWNTO0));

ENDCOMPONENT;

BEGIN

sub_wire8<=datab_2(17DOWNTO0);

sub_wire7<=datab_0(17DOWNTO0);

sub_wire4<=dataa_2(17DOWNTO0);

sub_wire3<=dataa_1(17DOWNTO0);

result<=sub_wire0(37DOWNTO0);

sub_wire1<=dataa_0(17DOWNTO0);

sub_wire2<=sub_wire4(17DOWNTO0)&sub_wire3(17DOWNTO0)&

?sub_wire1(17DOWNTO0);

sub_wire5<=datab_1(17DOWNTO0);

sub_wire6<=sub_wire8(17DOWNTO0)&sub_wire5(17DOWNTO0)&

sub_wire7(17DOWNTO0);

altmult_add_component:altmult_add

GENERICMAP(

addnsub_multiplier_aclr1=>"ACLR3",

addnsub_multiplier_pipeline_aclr1=>"ACLR3",

addnsub_multiplier_pipeline_register1=>"CLOCK0",

addnsub_multiplier_register1=>"CLOCK0",

dedicated_multiplier_circuitry=>"AUTO",

input_aclr_a0=>"ACLR3",

input_aclr_a1=>"ACLR3",

input_aclr_a2=>"ACLR3",

input_aclr_b0=>"ACLR3",

input_aclr_b1=>"ACLR3",

input_aclr_b2=>"ACLR3",

input_register_a0=>"CLOCK0",

input_register_a1=>"CLOCK0",

input_register_a2=>"CLOCK0",

input_register_b0=>"CLOCK0",

input_register_b1=>"CLOCK0",

input_register_b2=>"CLOCK0",

input_source_a0=>"DATAA",

input_source_a1=>"DATAA",

input_source_a2=>"DATAA",

input_source_b0=>"DATAB",

input_source_b1=>"DATAB",

input_source_b2=>"DATAB",

intended_device_family=>"FLEX10K",

lpm_type=>"altmult_add",

multiplier1_direction=>"ADD",

multiplier_aclr0=>"ACLR3",

multiplier_aclr1=>"ACLR3",

multiplier_aclr2=>"ACLR3",

multiplier_register0=>"CLOCK0",

multiplier_register1=>"CLOCK0",

multiplier_register2=>"CLOCK0",

number_of_multipliers=>3,

output_aclr=>"ACLR3",

output_register=>"CLOCK0",

port_addnsub1=>"PORT_UNUSED",

port_signa=>"PORT_UNUSED",

port_signb=>"PORT_UNUSED",

representation_a=>"SIGNED",

representation_b=>"SIGNED",

signed_aclr_a=>"ACLR3",

signed_aclr_b=>"ACLR3",

signed_pipeline_aclr_a=>"ACLR3",

signed_pipeline_aclr_b=>"ACLR3",

signed_pipeline_register_a=>"CLOCK0",

signed_pipeline_register_b=>"CLOCK0",

signed_register_a=>"CLOCK0",

signed_register_b=>"CLOCK0",

width_a=>18,

width_b=>18,

width_result=>38)

PORTMAP(

dataa=>sub_wire2,

datab=>sub_wire6,

clock0=>clock0,

aclr3=>aclr3,

ena0=>ena0,

result=>sub_wire0

);

ENDSYN;

(2)?LPM加法器的VHDL源程序如下:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

LIBRARYlpm;

USElpm.ALL;ENTITYadderIS

PORT(dataa:INSTD_LOGIC_VECTOR(17DOWNTO0);

datab:INSTD_LOGIC_VECTOR(17DOWNTO0);

cout :OUTSTD_LOGIC;

overflow :OUTSTD_LOGIC;

result:OUTSTD_LOGIC_VECTOR(17DOWNTO0));

ENDadder;ARCHITECTURESYNOFadderIS

SIGNALsub_wire0:STD_LOGIC;

SIGNALsub_wire1:STD_LOGIC;

SIGNALsub_wire2:STD_LOGIC_VECTOR(17DOWNTO0);

COMPONENTlpm_add_sub

GENERIC(lpm_direction:STRING;

lpm_hint :STRING;

lpm_type :STRING;

lpm_width:NATURAL );

PORT(dataa :INSTD_LOGIC_VECTOR(17DOWNTO0);

datab:INSTD_LOGIC_VECTOR(17DOWNTO0);

overflow :OUTSTD_LOGIC;

cout :OUTSTD_LOGIC;

result:OUTSTD_LOGIC_VECTOR(17DOWNTO0));

ENDCOMPONENT;

BEGIN

overflow<=sub_wire0;

cout<=sub_wire1;

result<=sub_wire2(17DOWNTO0);

lpm_add_sub_component:lpm_add_sub

GENERICMAP(lpm_direction=>"ADD",

lpm_hint=>"ONE_INPUT_IS_CONSTANT=NO,CIN_USED=NO",

lpm_type=>"LPM_ADD_SUB",

lpm_width=>18)

PORTMAP(dataa=>dataa,

datab=>datab,

overflow=>sub_wire0,

cout=>sub_wire1,

result=>sub_wire2);

ENDSYN;

(3)二階節(jié)IIR濾波器模塊iir_1的VHDL構(gòu)造體源程序如下:

ARCHITECTUREtranslatedOFiir_1IS

COMPONENTadder

PORT(dataa:INSTD_LOGIC_VECTOR(17DOWNTO0);

datab:INSTD_LOGIC_VECTOR(17DOWNTO0);

result:OUTSTD_LOGIC_VECTOR(17DOWNTO0);

cout:OUTSTD_LOGIC;

overflow:OUTSTD_LOGIC);

ENDCOMPONENT;

SIGNALcoef_b1:STD_LOGIC_VECTOR(DLY_WIDTH-1DOWNTO0);

SIGNALcoef_b2:STD_LOGIC_VECTOR(DLY_WIDTH-1DOWNTO0);

SIGNALcoef_a0:STD_LOGIC_VECTOR(DLY_WIDTH-1DOWNTO0);

SIGNALcoef_a1:STD_LOGIC_VECTOR(DLY_WIDTH-1DOWNTO0);

SIGNALcoef_a2:STD_LOGIC_VECTOR(DLY_WIDTH-1DOWNTO0);

SIGNALcoef_a2:STD_LOGIC_VECTOR(DLY_WIDTH-1DOWNTO0);

SIGNALresult_xhdl1:STD_LOGIC_VECTOR(OUTPUT_WIDTH-1DOWNTO0);

SIGNALfeedback_fp_xhdl2:STD_LOGIC_VECTOR(OUTPUT_WIDTH-2DOWNTO0);

SIGNALwn_xhdl3:STD_LOGIC_VECTOR(DLY_WIDTH01-DOWNTO0);

SIGNALfeedback_xhdl4:STD_LOGIC_VECTOR(DLY_WIDTH01-1DOWNTO0);COMPONENTfmaddIS

PORT(clock0:INSTD_LOGIC;

dataa_0:INSTD_LOGIC_VECTOR(17DOWNTO0);

aclr3:INSTD_LOGIC;

datab_0:INSTD_LOGIC_VECTOR(17DOWNTO0);

dataa_2:INSTD_LOGIC_VECTOR(17DOWNTO0);

datab_1:INSTD_LOGIC_VECTOR(17DOWNTO0);

ena0:INSTD_LOGIC;

datab_2:INSTD_LOGIC_VECTOR(17DOWNTO0);

result:OUTSTD_LOGIC_VECTOR(37DOWNTO0));ENDCOMPONENT;

COMPONENTtmaddIS

PORT(clock0:INSTD_LOGIC;

dataa_0:INSTD_LOGIC_VECTOR(17DOWNTO0);

aclr3:INSTD_LOGIC;

datab_0:INSTD_LOGIC_VECTOR(17DOWNTO0);

datab_1:INSTD_LOGIC_VECTOR(17DOWNTO0);

ena0:INSTD_LOGIC;

result:OUTSTD_LOGIC_VECTOR(36DOWNTO0));ENDCOMPONENT;

BEGIN

result<=result_xhdl1;

feedback_fp<=feedback_fp_xhdl2;

wn<=wn_xhdl3;

feedback<=feedback_xhdl4;

coef_b1<=conv_STD_LOGIC_VECTOr(-b1,18);

coef_b2<=conv_STD_LOGIC_VECTOR(-b2,18);

coef_a0<=conv_STD_LOGIC_VECTOR(a0,18);

coef_a1<=conv_STD_LOGIC_VECTOR(a1,18);

coef_a2<=conv_STD_LOGIC_VECTOR(a2,18);

feedback_xhdl4<=feedback_fp_xhdl2(27DOWNTO10);

four_mult_add_inst:fmadd

PORTMAP(

clock0=>clk,

aclr3=>reset,

ena0=>clken,

dataa_0=>wn_xhdl3,

dataa_2=>wn_xhdl3,

datab_0=>coef_a1,

datab_1=>coef_a2,

datab_2=>coef_a0,

result=>result_xhdl1);

two_mult_add_inst:tmadd

PORTMAP(

clock0=>clk,

dataa_0=>wn_xhdl3,

aclr3=>reset,

datab_0=>coef_b1,

datab_1=>coef_b2,

ena0=>clken,

result=>feedback_fp_xhdl2);

adder_inst:adder

PORTMAP(

dataa=>x,

datab=>feedback_xhdl4,

result=>wn_xhdl3,

cout=>open,

overflow=>open);

ENDtranslated;總體設(shè)計(jì)的構(gòu)造體VHDL源程序如下:

ARCHITECTUREtranslatedOFiir_topIS

SIGNALout_1:BIT_VECTOR(OUTPUT_WIDTH-1DOWNTO0);

SIGNALpzeros:BIT_VECTOR(F_BITS-1DOWNTO0);

SIGNALxn:BIT_VECTOR(DLY_WIDTH-1DOWNTO0);

SIGNALresult_w:BIT_VECTOR(OUTPUT_WIDTH-1DOWNTO0);

SIGNALxn_reg:BIT_VECTOR(DLY_WIDTH-1DOWNTO0);

SIGNALin_2:BIT_VECTOR(DLY_WIDTH-1DOWNTO0);

SIGNALresult_xhdl1:BIT_VECTOR(OUTPUT_WIDTH-1DOWNTO0);COMPONENTiir_1is

PORT(reset:INBIT;

clk:INBIT;

clken:INBIT;

x:INBIT_VECTOR(INPUT_WIDTH-1DOWNTO0);

result:OUTBIT_VECTOR(OUTPUT_WIDTH-1DOWNTO0);

feedback_fp:OUTBIT_VECTOR(OUTPUT_WIDTH-2DOWNTO0);

feedback:OUTBIT_VECTOR(DLY_WIDTH-1DOWNTO0);

wn:OUTBIT_VECTOR(DLY_WIDTH-1DOWNTO0));

ENDCOMPONENT;

BEGIN

result<=result_xhdl1;

pzeros<=“0000”;

xn<=x(INPUT_WIDTH-1)&x(INPUT_WIDTH-1DOWNTO0)&pzeros

(F_BITS-1DOWNTO0);

PROCESS

BEGIN

WAITUNTIL(clk'EVENTANDclk='1');

IF(reset='1')THEN

xn_reg<=(OTHERS=>'0');

result_xhdl1<=(OTHERS=>'0');

in_2<=(OTHERS=>'0');

ELSE

IF(clken='1')THEN

xn_reg<=xn;

result_xhdl1<=result_w;

in_biquad2<=out_1(27DOWNTO10);

ENDIF;

ENDIF;

ENDPROCESS;

base_iir_1:iir_1

GENERICMAP(a0=>a10,

a1=>a11,

a2=>a12,

b1=>b11,

b2=>b12)

PORTMAP(clk=>clk,

clken=>clken,

reset=>reset,

x=>xn_reg,

result=>out_1);

base_iir_2:iir_1

GENERICMAP(a0=>a20,

a1=>a21,

a2=>a22,

b1=>b21,

b2=>b22)

PORTMAP(clk=>clk,

clken=>clken,

reset=>reset,

x=>in_2,

result=>result_w);

ENDtranslated;

2.基于DSPBuilder的IIR濾波器設(shè)計(jì)

(1)在MATLAB/Simulink中進(jìn)行設(shè)計(jì)輸入,即在MATLAB的Simulink環(huán)境中建立一個(gè)mdl模型文件,用圖形方式調(diào)用AlteraDSPBuilder和其他Simulink庫(kù)中的圖形模塊(Block),構(gòu)成系統(tǒng)級(jí)或算法級(jí)設(shè)計(jì)框圖(或稱Simulink設(shè)計(jì)模型)。DSPBuilder模塊庫(kù)如圖8-14所示。圖8-14DSPBuilder模塊庫(kù)

(2)利用Simulink強(qiáng)大的圖形化仿真、分析功能,分析此設(shè)計(jì)模型的正確性,完成模型仿真。

(3)打開SingalCompiler,選定對(duì)應(yīng)器件,把模型轉(zhuǎn)成VHDL文件,并在SignalCompiler中選擇Quartus?Ⅱ進(jìn)行綜合。

(4)適配下載。在QuartusⅡ中打開SignalCompiler建立的Quartus項(xiàng)目文件,選擇具體器件,鎖定管腳,完成適配后下載至FPGADSP開發(fā)板中。

3.基于IP核的IIR濾波器設(shè)計(jì)

Altera以及其他FPGA廠商提供了IIRFilterCore。IIR濾波器核既可以與DSPBuilder銜接開發(fā),也可以在Quartus?Ⅱ中直接使用。下面主要介紹在Quartus?Ⅱ中使用IPCore的方法。在QuatusⅡ中使用IP核設(shè)計(jì)IIR濾波器步驟如下:

(1)配置Quartus?Ⅱ以便使用IIR濾波器核。打開Quartus?Ⅱ集成環(huán)境,新建一個(gè)項(xiàng)目。選擇菜單“Assignments”→“Settings”,打開Quartus?Ⅱ的設(shè)置對(duì)話框,在對(duì)話框的左側(cè)選擇“UserLibraries(用戶庫(kù))”,如圖8-15所示。圖8-15IP核配置

(2)使用IIR濾波器核。首先完成IIR濾波器核的安裝配置,然后按照第2章給出的類似的方法,定制使用IIR濾波器核。具體步驟如下:

①打開MegaWizardPlug-InManager。選擇菜單“Tools”→

“MegaWizardPlug-InManager”,接著打開MegaCore向?qū)?。在窗口的左?cè)選中“IIRFilterv1.3.3”,在右側(cè)選擇實(shí)現(xiàn)時(shí)的HDL類型,并輸入生成IIR濾波器核的名字,如圖8-16所示。圖8-16選擇IIR濾波器核②選擇IIR濾波器結(jié)構(gòu)。Altera的IIR濾波器核對(duì)這三種IIR結(jié)構(gòu)都是支持的。圖8-17是IIR濾波器結(jié)構(gòu)設(shè)置對(duì)話框,在這里我們選擇了級(jí)聯(lián)型(Cascaded)進(jìn)行實(shí)現(xiàn),濾波器階數(shù)設(shè)為4。圖8-17選擇濾波器結(jié)構(gòu)③導(dǎo)入濾波器系數(shù)。這里我們使用MATLAB的FDATool來(lái)完成濾波器系數(shù)的計(jì)算,再通過圖8-18所示的對(duì)話框?qū)?通過文件)濾波系數(shù)。圖8-18導(dǎo)入濾波器系數(shù)

(3)?IIR濾波系數(shù)的量化。IIR系數(shù)必須進(jìn)行量化處理,如圖8-19所示。在這里設(shè)置了輸入信號(hào)的位寬為13位,系數(shù)位寬為10位,采用自動(dòng)方式讓IIRCompiler具體決定系數(shù)的歸一化問題。圖8-19量化IIR濾波系數(shù)

(4)?IIR濾波器的具體實(shí)現(xiàn)。為了提高IIR濾波器的性能,同時(shí)減少IIR濾波器耗費(fèi)的資源,有時(shí)需要對(duì)IIR濾波器實(shí)現(xiàn)時(shí)的某些細(xì)節(jié)進(jìn)行調(diào)整,如圖8-20所示。圖8-20IIR濾波器調(diào)整

(5)設(shè)置仿真參數(shù)。這一步主要設(shè)置仿真模型及測(cè)試信號(hào),如圖8-21所示。圖8-21仿真參數(shù)設(shè)置經(jīng)過前面幾個(gè)步驟,即完成了基于IP核的IIR濾波器的設(shè)計(jì),點(diǎn)擊“Finish”按鈕完成設(shè)計(jì),系統(tǒng)自動(dòng)輸出相關(guān)文件,如圖8-22所示。圖8-22輸出設(shè)計(jì)文件8.3簡(jiǎn)單電子琴電路設(shè)計(jì)

8.3.1系統(tǒng)設(shè)計(jì)要求

(1)設(shè)計(jì)一個(gè)簡(jiǎn)單的八音符(1,2,3,4,5,6,7,8,其中8表示高音1)電子琴,可通過按鍵輸入來(lái)控制音響。

(2)演奏時(shí)可以選擇是手動(dòng)演奏(鍵盤輸入)還是自動(dòng)演奏已存入的樂曲。

(3)能夠自動(dòng)演奏多首樂曲,且每首樂曲可重復(fù)演奏。8.3.2系統(tǒng)設(shè)計(jì)

簡(jiǎn)單電子琴電路的原理方框圖如圖8-23所示,其主要由以下幾個(gè)模塊組成:

(1)基準(zhǔn)頻率產(chǎn)生器。該電路由晶振和反相器CC4069構(gòu)成時(shí)鐘脈沖振蕩器。振蕩器輸出頻率為4MHz,作為系統(tǒng)的基準(zhǔn)頻率。圖8-23簡(jiǎn)單電子琴電路原理方框圖

(2)自動(dòng)演奏及鍵盤編碼模塊。該模塊主要實(shí)現(xiàn)兩大功能:鍵盤輸入編碼及樂曲自動(dòng)演奏。該模塊可對(duì)系統(tǒng)時(shí)鐘4MHz的信號(hào)(CLK)分頻得到4Hz的自動(dòng)演奏地址計(jì)數(shù)頻率,用來(lái)控制每個(gè)音階之間的停頓時(shí)間;地址計(jì)數(shù)器的計(jì)數(shù)范圍為0~63,音樂存儲(chǔ)模塊中音符的最大地址用于完成自動(dòng)演奏樂曲的地址累加,同時(shí)實(shí)現(xiàn)樂曲循環(huán)演奏;記錄所選樂曲的樂譜,根據(jù)樂譜產(chǎn)生發(fā)聲控制輸出INDEX0信號(hào)。

(3)聲音輸出控制模塊。該模塊主要電路為數(shù)控分頻器。CLK輸入系統(tǒng)的基準(zhǔn)頻率為4MHz,TONE1接TONE來(lái)的分頻預(yù)置數(shù),SPKS輸出端接音色產(chǎn)生器,輸出各音符所對(duì)應(yīng)頻率的聲音信號(hào)。

(4)音符產(chǎn)生電路模塊。該模塊的作用是產(chǎn)生各音符的分頻預(yù)置值。根據(jù)各音符名與頻率的關(guān)系(如表8-3所示)以及聲音輸出控制模塊(FENPIN)中數(shù)控分頻器的設(shè)計(jì),分別計(jì)算出高音區(qū)、中音區(qū)、低音區(qū)不同音符的分頻預(yù)置數(shù)。

(5)各類開關(guān)按鍵及琴鍵。初步設(shè)計(jì)出自動(dòng)演奏及鍵盤編碼模塊、各類開關(guān)按鍵及琴鍵等聲音輸出控制模塊、音符產(chǎn)生電路模塊,再設(shè)計(jì)頂層電路。8.3.3模塊設(shè)計(jì)與實(shí)現(xiàn)

1.自動(dòng)演奏模塊(YANZOU)設(shè)計(jì)

樂曲演奏是通過記譜的方式來(lái)記錄一段音樂,它可以極大地減少存儲(chǔ)容量。聲音的頻譜范圍一般在幾十到幾千赫茲,利用程序來(lái)控制FPGA芯片輸出一定頻率的矩形波,配上一些必要的外圍電路就可以發(fā)出相應(yīng)頻率的聲音。樂曲中的每一個(gè)音符對(duì)應(yīng)著一個(gè)確定的頻率,因此,想要發(fā)出不同音符的音調(diào),只要能控制輸出相應(yīng)音符的頻率即可。樂曲都是由一連串音符組成的,因此按照樂曲的樂譜依次輸出這些音符所對(duì)應(yīng)的頻率,就可以通過揚(yáng)聲器連續(xù)播放這些音符所對(duì)應(yīng)的音樂。要準(zhǔn)確地演奏一首樂曲,僅僅讓揚(yáng)聲器發(fā)聲是不夠的,還必須準(zhǔn)確地控制樂曲的節(jié)奏,即每個(gè)音符的持續(xù)時(shí)間,也就是節(jié)拍。音樂存儲(chǔ)模塊的作用是產(chǎn)生音符發(fā)聲控制輸入INDEX。當(dāng)AUTO?=?“0”時(shí),由存儲(chǔ)在此模塊中的8位二進(jìn)制數(shù)作為發(fā)聲控制輸入,可自動(dòng)演奏樂曲。此模塊的VHDL程序包括三個(gè)進(jìn)程:第一個(gè)進(jìn)程為分頻器,實(shí)現(xiàn)4Hz的分頻;第二個(gè)進(jìn)程為地址計(jì)數(shù)器,計(jì)數(shù)范圍為0~63,表示音樂存儲(chǔ)模塊中音符的最大地址數(shù),該進(jìn)程完成自動(dòng)演奏樂曲的地址累加。同時(shí)實(shí)現(xiàn)樂曲循環(huán)演奏;第三個(gè)進(jìn)程主要用來(lái)記錄所選樂曲的樂譜,根據(jù)樂譜產(chǎn)生8位發(fā)聲控制輸出INDEX0信號(hào),當(dāng)AUTO為“0”時(shí),將存儲(chǔ)在此模塊中的8位二進(jìn)制數(shù)作為發(fā)聲控制信號(hào),自動(dòng)演奏樂曲。在記

溫馨提示

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