6ewMyirQFL
智能函数发生器原理图
四、设计内容
1.递减模块的设计jianxie.vhd
递减模块的设计,递减模块是用VHDL程序描述的递增函数,它的实体部分部分说明三个端口,其中两个输入端口时钟信号clk3、复位信号rst3和一个输出端口jout3。
结构体部分定义一个8位二进制变量,然后使用进程语句,设定敏感信号clk3和rst3,通过设计一个中间变量从00000101到00000000的递减赋值给输出信号jout3,编译无误后,即额可以创建递减元件符号。
kavU42VRUs
2.递增模块的设计zengxie.vhd
递增模块的设计与递减模块相似,其中两个输入端口时钟信号clk2、复位信号rst2和一个输出端口zout2。
结构体部分定义一个8位二进制变量,然后使用进程语句,设定敏感信号clk2和rst2,通过设计一个中间变量从00000000到00000101的递增赋值给输出信号zout2,编译无误后,即额可以创建递增元件符号。
y6v3ALoS89
3.三角波模块的设计rect.vhd
三角波模的设计完成功能异步复位和三角波的形成,程序定义两个中间变量,一个中间变量即为输出赋值,另一个完成三角波分段,当p为0时,完成三角波的前段从00000000到00000101递增;当p为1时,完成后段的从00000101到00000000的递减,形成一个完整的三角波。
M2ub6vSTnP
4.梯形波模块的设计trap.vhd
梯形波模块的设计通过运用case语句,设计三个状态,使信号在“00”状态时从00000000到00000101递增,在“01”状态时保持00000101,在“10”状态
时从00000101到00000000递减,形成一个完整的梯形波。
0YujCfmUCw
5.方波模块的设计reta.vhd
方波模块即是完成方波输出地设计,以及有异步复位的功能,该程序采用了两个进程语句,第一个进程是完成在时钟上升沿同步时,r<6时输出rout1=00000110,否则输出rout1=00000000。
在第二个进程中,完成在时钟上升沿的时候,r从00000000递增到00001011,创建的元件符号同样是三个端口,即时钟信号clk1和复位信号rst1,以及一个8位二进制的输出端口rout1。
eUts8ZQVRd
6.正弦波模块的设计sindata.vhd
正弦波的设计是通过建立正弦波形数据、定制LPMROM来实现的。
7.选择模块的设计wavsel.vhd
选择模块的设计通过运用case语句,设计六个状态,通过控制输入信号key
11、key22、key33,选择输出波形。
“000”输出递增斜波,“001”输出递减斜波,“010输出”方波,“011”输出梯形波,“100”输出三角波,“101”输出正弦波。
sQsAEJkW5T
五、仿真结果
1.递增斜波
2.递减斜波
3.方波
4.梯形波
5.三角波
6.正弦波
一、设计题目:
乐曲硬件演奏电路的VHDL设计
二、设计目标
能够播放“梁祝”乐曲。
<2)能够通过LED显示音阶。
<3)具有“播放/停止”功能,并在此基础上实现“按键演奏”的电子琴功能。
GMsIasNXkA
三、设计原理
主系统由三个模块组成,songer.vhd为顶层设计文件,其内部有三个功能模块:
tonetaba.vhd、notetabs.vhd和speakera.vhd。
TIrRGchYzg
我们知道,组成乐曲的每个音符的发音频率值及其持续时间是乐曲能连续演奏所需的两个基本要素,问题是如何来获取了这两个要素所对应的数值以及通过纯硬件的手段来利用这些数值事先所希望乐曲的演奏效果。
原理图中,模块U1类似于探亲人的手指;U2类似于琴键;U3类似于琴弦或音调发生器。
7EqZcWLZNX
四、设计类容
1.数控分频器模块Speakera.vhd
这是一个数控分频器,有其clk端输入已具有较高频率<这里是12MHz)的信号,通过Speakera分频后又SPKOUT输出。
Speakera对clk输入信号的分频比由11位预置数Tone[10..0]决定。
lzq7IGf02E
2.按键模块ToneTaba.vhd
模块ToneTaba的功能首先是为Speakera提供决定所发音符的分频预置数,而此数在Speakera输入口停留的时间即为此音符的节拍值。
模块ToneTaba是乐曲简谱码对应得分频预置数查表电路,其中预置了“梁祝”乐曲全部音符所对应的分频预置数,共13个,这13个值的输出有对应于ToneTaba的4位输入值Index[3..0]确定。
zvpgeqJ1hk
3.输入控制模块NoteTabs.vhd
在NoteTabs中设置了一个8位二进制计数器,作为音符数据ROM的地址发生器。
这个计数器的计数频率选为4Hz,即每一计数值得停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。
rst0具有“播放停止”功能。
当kz=‘1’时,shuru1、shuru2、shuru2、shuru3实现“按键演奏”功能。
NrpoJac3v1
五、仿真结果
1.自动播放
2.按键演奏
六、总结
通过编译原理课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识是机械的,表面的。
把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。
通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。
这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。
1nowfTG4KI
而且,这对于我们的将来也有很大的帮助。
以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。
fjnFLDa5Zo
七、附录
(一>交通灯控制器VHDL的设计
1.交通灯顶层文件jtd.vhd
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entityjtdis
port(clk:
instd_logic。
rst:
instd_logic。
red_east,yellow_east,green_east,red_north,yellow_north,green_north:
outstd_logic。
tfnNhnE6e5
ten_east,one_east,ten_north,one_north:
outstd_logic_vector(6downto0>>。
HbmVN777sL
end。
architectureoneofjtdis
componentmoore
port(clk0,rst0,c0:
instd_logic。
ld0:
outstd_logic。
red_east1,yellow_east1,green_east1,red_north1,yellow_north1,green_north1:
outstd_logic。
V7l4jRB8Hs
dinl0,dinh0:
outstd_logic_vector(3downto0>>。
endcomponent。
componentjishu
port(clk1:
instd_logic。
ld1:
instd_logic。
dinl1:
instd_logic_vector(3downto0>。
dinh1:
instd_logic_vector(3downto0>。
ql1:
outstd_logic_vector(3downto0>。
qh1:
outstd_logic_vector(3downto0>。
c1:
outstd_logic>。
endcomponent。
componentled7s
port(a:
instd_logic_vector(3downto0>。
led7s:
outstd_logic_vector(6downto0>>。
endcomponent。
signalc,ld:
std_logic。
signaldinl,dinh,led7sh,led7sl:
std_logic_vector(3downto0>。
83lcPA59W9
begin
u1:
mooreportmap(clk0=>clk,rst0=>rst,c0=>c,ld0=>ld,dinl0=>dinl,dinh0=>dinh,red_east1=>red_east,yellow_east1=>yellow_east,green_east1=>green_east,red_north1=>red_north,yellow_north1=>yellow_north,green_north1=>green_north>。
mZkklkzaaP
u2:
jishuportmap(clk1=>clk,ld1=>ld,dinl1=>dinl,dinh1=>dinh,qh1=>led7sh,ql1=>led7sl,c1=>c>。
AVktR43bpw
u3:
led7sportmap(a=>led7sh,led7s=>ten_east>。
u4:
led7sportmap(a=>led7sl,led7s=>one_east>。
u5:
led7sportmap(a=>led7sh,led7s=>ten_north>。
u6:
led7sportmap(a=>led7sl,led7s=>one_north>。
end。
2.Morre型状态机的设计moore.vhd
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entitymooreis
port(clk0,rst0,c0:
instd_logic。
ld0:
outstd_logic。
red_east1,green_east1,yellow_east1,red_north1,green_north1,yellow_north1:
outstd_logic。
ORjBnOwcEd
dinl0,dinh0:
outstd_logic_vector(3downto0>>。
end。
architectureoneofmooreis
typest_typeis(s0,s1,s2,s3>。
signalc_st:
st_type。
signalclk2:
std_logic。
begin
process(clk0,rst0>
begin
ifrst0='0'then
c_st<=s0。
dinh0<="0100"。
dinl0<="0101"。
ld0<='0'。
red_east1<='0'。
yellow_east1<='0'。
green_east1<='1'。
red_north1<='1'。
yellow_north1<='0'。
green_north1<='0'。
2MiJTy0dTT
elsifclk0'eventandclk0='1'then
casec_stis
whens0=>ifc0='1'thenc_st<=s1。
dinh0<="0000"。
dinl0<="0101"。
ld0<='0'。
gIiSpiue7A
elsec_st<=s0。
ld0<='1'。
endif。
red_east1<='0'。
yellow_east1<='0'。
green_east1<='1'。
red_north1<='1'。
yellow_north1<='0'。
green_north1<='0'。
uEh0U1Yfmh
whens1=>ifc0='1'thenc_st<=s2。
dinh0<="0010"。
dinl0<="0101"。
ld0<='0'。
IAg9qLsgBX
elsec_st<=s1。
ld0<='1'。
endif。
red_east1<='0'。
yellow_east1<='1'。
green_east1<='0'。
red_north1<='1'。
yellow_north1<='0'。
green_north1<='0'。
WwghWvVhPE
whens2=>ifc0='1'thenc_st<=s3。
dinh0<="0000"。
dinl0<="0101"。
ld0<='0'。
asfpsfpi4k
elsec_st<=s2。
ld0<='1'。
endif。
red_east1<='1'。
yellow_east1<='0'。
green_east1<='0'。
red_north1<='0'。
yellow_north1<='0'。
green_north1<='1'。
ooeyYZTjj1
whens3=>ifc0='1'thenc_st<=s0。
dinh0<="0100"。
dinl0<="0101"。
ld0<='0'。
BkeGuInkxI
elsec_st<=s3。
ld0<='1'。
endif。
red_east1<='1'。
yellow_east1<='0'。
green_east1<='0'。
red_north1<='0'。
yellow_north1<='1'。
green_north1<='0'。
PgdO0sRlMo
whenothers=>red_east1<='0'。
yellow_east1<='0'。
green_east1<='1'。
red_north1<='1'。
yellow_north1<='0'。
green_north1<='0'。
ld0<='0'。
3cdXwckm15
endcase。
endif。
endprocess。
end。
3.减法计数器的设计jishu.vhd
libraryieee。
useieee.std_logic_1164.all。
useieee.std_logic_unsigned.all。
entityjishuis
port(clk1:
instd_logic。
ld1:
instd_logic。
dinl1:
instd_logic_vector(3downto0>。
dinh1:
instd_logic_vector(3downto0>。
ql1:
outstd_logic_vector(3downto0>。
qh1:
outstd_logic_vector(3downto0>。
c1:
outstd_logic>。
end。
architectureoneofjishuis
signalqa,qat:
std_logic_vector(3downto0>。
signalqb,qbt:
std_logic_vector(3downto0>。
signalca,cb:
std_logic。
begin
qh1<=qb。
ql1<=qa。
process(clk1>
begin
qat<=dinl1。
ifclk1'eventandclk1='1'then
ifld1='0'thenqa<=qat。
ca<='0'。
elsif(qa="0000">thenqa<="1001"。
ca<='0'。
elsif(qa="0001">thenca<='1'。
qa<="0000"。
elseqa<=qa-1。
ca<='0'。
endif。
endif。
endprocess。
process(ca,clk1>
begin
qbt<=dinh1。
ifclk1'eventandclk1='1'then
ifld1='0'thenqb<=qbt。
cb<='0'。
c1<='0'。
elsif(qb="0000"andqa="0001">thenc1<='0'。
elsif(qb="0000"andqa="0010">thenc1<='1'。
elsif(qb="0000"andqa="1000">thenc1<='1'。
elsif(qb="0000"andqa="0111">thenc1<='0'。
elsif(ca='1'>thenqb<=qb-1。
endif。
endif。
endprocess。
end。
4.译码器的设计led7s.vhd
libraryieee。
useieee.std_logic_1164.all。
entityled7sis
port(a:
instd_logic_vector(3downto0>。
led7s:
outstd_logic_vector(6downto0>>。
endled7s。
architectureoneofled7sis
begin
process(a>
begin
caseAis
when"0000"=>led7s<="0111111"。
when"0001"=>led7s<="0000110"。
h8c52WOngM
when"0010"=>led7s<="1011011"。
when"0011"=>led7s<="1001111"。
v4bdyGious
when"0100"=>led7s<="1100110"。
when"0101"=>led7s<="1101101"。
J0bm4qMpJ9
when"0110"=>led7s<="1111101"。
when"0111"=>led7s<="0000111"。
XVauA9grYP
when"1000"=>led7s<="1111111"。
when"1001"=>led7s<="1101111"。
bR9C6TJscw
when"1010"=>led7s<="1110111"。
when"1011"=>led7s<="1111100"。
pN9LBDdtrd
when"1100"=>led7s<="0111001"。
when"1101"=>led7s<="1011110"。
DJ8T7nHuGT
when"11