EDA期末大作业设计Word文档格式.docx
《EDA期末大作业设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《EDA期末大作业设计Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
![EDA期末大作业设计Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/13/c05bc809-bb4b-470a-bf91-75d627a5626a/c05bc809-bb4b-470a-bf91-75d627a5626a1.gif)
=1290是根据产生该音阶频率所对应的分频比获得的。
简易电子琴电路结构
模块SPEAKER中的主要电路是一个数控分频器,它由一个初值可预置的加法计数器构成,当模块SPEAKER由端口TONE获得一个2进制数后,将以此值为计数器的预置数,对端口CLK12MHZ输入的频率进行分频,之后由SPKOUT向扬声器输出发声。
模块NOTETABS,用于控制音乐的暂停与播放,产生节拍控制(INDEX数据存留时间)和音阶选择信号,即在NOTETABS模块放置一个乐曲曲谱真值表,由一个计数器的计数值来控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。
试完成此项设计,并在EDA实验系统上的FPGA目标器件中实现之。
5、实验内容:
编译适配以上4个示例文件,给出仿真波形,最后进行下载和硬件测试实验。
建议使用实验电路模式“3”,用短路帽选择“CLOCK9”的输入频率选择12MHz,此信号作为系统输入信号CLK12MHZ;
CLK8HZ与clock2相接,接受4Hz频率;
键盘按键0-7作为输入信号控制各音阶。
3、实验代码
enc16_4
libraryieee;
useieee.std_logic_1164.all;
entityenc16_4is
port(I:
instd_logic_vector(7downto0);
--输入的待编码信号
Y:
outstd_logic_vector(3downto0));
--编码输出
endenc16_4;
architectureoneofenc16_4is
SIGNALL:
STD_LOGIC_VECTOR(7DOWNTO0);
begin
Search:
PROCESS(I)
CASEIIS
WHEN"
01101100"
=>
Y<
="
1000"
;
01110100"
0111"
01110011"
0110"
01101011"
0101"
01111010"
0100"
01110010"
0011"
01101001"
0010"
01110000"
0001"
WHENOTHERS=>
0000"
ENDCASE;
endprocess;
endone;
Tone
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
ENTITYToneIS
PORT(Index:
INSTD_LOGIC_VECTOR(3DOWNTO0);
CODE:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
HIGH:
OUTSTD_LOGIC;
Tone:
OUTSTD_LOGIC_VECTOR(10DOWNTO0));
END;
ARCHITECTUREoneOFToneIS
BEGIN
PROCESS(Index)
BEGIN
CASEIndexIS--译码电路,查表方式,控制音调的预置数
WHEN"
Tone<
=CONV_STD_LOGIC_VECTOR(2047,11);
--CONV_STD_LOGIC_VECTOR(139,11);
CODE<
=CONV_STD_LOGIC_VECTOR(1,4);
HIGH<
='
0'
=CONV_STD_LOGIC_VECTOR(347,11);
CODE<
=CONV_STD_LOGIC_VECTOR(2,4);
HIGH<
=CONV_STD_LOGIC_VECTOR(533,11);
=CONV_STD_LOGIC_VECTOR(3,4);
=CONV_STD_LOGIC_VECTOR(615,11);
=CONV_STD_LOGIC_VECTOR(4,4);
=CONV_STD_LOGIC_VECTOR(773,11);
=CONV_STD_LOGIC_VECTOR(5,4);
=CONV_STD_LOGIC_VECTOR(912,11);
CODE<
=CONV_STD_LOGIC_VECTOR(6,4);
=CONV_STD_LOGIC_VECTOR(1036,11);
=CONV_STD_LOGIC_VECTOR(7,4);
=CONV_STD_LOGIC_VECTOR(1092,11);
1'
=CONV_STD_LOGIC_VECTOR(1197,11);
1001"
=CONV_STD_LOGIC_VECTOR(1290,11);
1010"
=CONV_STD_LOGIC_VECTOR(1372,11);
1011"
=CONV_STD_LOGIC_VECTOR(1410,11);
1100"
=CONV_STD_LOGIC_VECTOR(1480,11);
1101"
=CONV_STD_LOGIC_VECTOR(1542,11);
1110"
=CONV_STD_LOGIC_VECTOR(1622,11);
1111"
=CONV_STD_LOGIC_VECTOR(1728,11);
WHENOTHERS=>
=CONV_STD_LOGIC_VECTOR(0,4);
HIGH<
ENDPROCESS;
PS2VHDL
--VHDLlibraryDeclarations
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------TheEntityDeclarations
ENTITYPS2VHDLISPORT(
ClkFilter:
INSTD_LOGIC;
--1MHzRESET:
INSTD_LOGIC;
KBDATA:
KBCLK:
EOC:
PDATA:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDPS2VHDL;
---------------------------------------------------------------------------------------------------
--TheArchitectureofEntityDeclarations
ARCHITECTUREBehavioralOFPS2VHDLIS
SIGNALspdata:
STD_LOGIC_VECTOR(10DOWNTO0);
SIGNALTT:
STD_LOGIC;
SIGNALcnt8:
INTEGERRANGE0TO10;
BEGIN-------------------------------------------------
--Optimize
PROCESS(RESET,KBCLK,ClkFilter)
VARIABLECount:
STD_LOGIC_VECTOR(3DOWNTO0);
IF(RESET='
ORKBCLK='
)THEN
TT<
Count:
=(OTHERS=>
'
);
ELSIF(ClkFilter'
EVENTANDClkFilter='
)THEN
IF(Count<
"
)THEN
=Count+1;
TT<
ELSE
="
ENDIF;
ENDPROCES---------------------------------------------------Recevie
Recevie:
PROCESS(RESET,TT,KBDATA,spdata,cnt8)
IFRESET='
THEN
cnt8<
=0;
spdata<
ELSIFTT'
eventANDTT='
IF(cnt8<
10)THEN
spdata(cnt8)<
=KBDATA;
=cnt8+1;
ELSE
ENDPROCESS;
---------------------------------------------------Endofrecevie
PROCESS(RESET,cnt8)
THENEOC<
ELSIFcnt8/=0
ELSEEOC<
--------------------------------------------------------------------------------------------------PDATA<
=spdata(8downto1);
ENDBehavioral;
clkdiv10
--占空比为1:
1的任意偶数倍分频
LibraryIEEE;
UseIEEE.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
Entityclkdiv10is
Port(clk:
instd_logic;
clk_out:
outstd_logic);
endclkdiv10;
architecturearchofclkdiv10is
signalcount:
integerrange0to49;
--分频倍数-1
begin
process(clk)--分频器
ifclk'
eventandclk='
then
ifcount=count'
highthencount<
=0;
elsecount<
=count+1;
endif;
endprocess;
process(clk)
ifcount>
count'
high/2thenclk_out<
='
elseclk_out<
--count_out<
=count;
endarch;
clkdiv50
Entityclkdiv50is
--count_out:
outintegerrange0to119;
endclkdiv50;
architecturearchofclkdiv50is
ifcount>
PULSE12
ENTITYPULSE12IS
PORT(CLK:
D:
INSTD_LOGIC_VECTOR(10DOWNTO0);
FOUT:
OUTSTD_LOGIC);
ARCHITECTUREoneOFPULSE12IS
SIGNALFULL:
SIGNALCNT8:
SIGNALCNT2:
P_REG:
PROCESS(CLK)
BEGIN
IFCLK'
EVENTANDCLK='
THEN
IFCNT8="
11111111111"
CNT8<
=D;
--当CNT8计数计满时,输入数据D被同步预置给计数器CNT8
FULL<
--同时使溢出标志信号FULL输出为高电平
ELSE
=CNT8+1;
--否则继续作加1计数
--且输出溢出标志信号FULL为低电平
ENDIF;
ENDPROCESSP_REG;
P_DIV:
PROCESS(FULL)
IFFULL'
EVENTANDFULL='
CNT2<
=NOTCNT2;
--如果溢出标志信号FULL为高电平,D触发器输出取反
ENDPROCESSP_DIV;
FOUT<
=CNT2;
4、实验总结
通过本次实验,使我对使用VHDL编写模块来实现音乐播放有了更深一步的了解,在本次实验中,在原先的基础上加入了播放暂停的功能,并更换了歌曲。
使仿真更具有功能性,并且更加熟悉了利用数控分频器设计硬件,受益匪浅。