




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VHDL硬件描述语言程序设计简易电子琴演奏器姓名:chi目录一、设计课题的任务要求3二、系统设计3三、仿真波形及波形分析11四、源程序12五、功能说明41六、元器件清单及资源利用情况41七、故障及问题分析43八、总结和结论44一、 设计课题的任务要求基本要求:1、 用88点阵显示“1 2 3 4 5 6 7”七个音符构成的电子琴键盘。其中点阵的第一列用一个LED点亮表示音符“1”,第二列用二个LED点亮表示音符“2”,依此类推,如下图所示。1 2 3 4 5 6 7图1 点阵显示的电子琴键盘2、 用BTN1BTN7七个按键模拟电子琴手动演奏时的“1 2 3 4 5 6 7”七个音符。当某个按键按下时,数码管显示相应的音符,点阵上与之对应的音符显示列全灭,同时蜂鸣器演奏相应的声音;当按键弹开时数码管显示的音符灭掉,点阵显示恢复,蜂鸣器停止声音的输出。下图所示为按下BTN3按键时点阵的显示情况。1 2 3 4 5 6 7图2 按键按下后的点阵显示3、 由拨码开关切换选择高、中、低音,并用数码管进行相应的显示。4、 通过按键BTN0进行复位,控制点阵显示图1的初始状态。提高要求:1、 可通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能。2、 增加手动演奏的音符存储、播放功能。二、 系统设计1. 设计思路简易电子琴的制作主要是利用不同频率的波来驱动蜂鸣器发出声响。通过输入不同的音符来设置不同的分频系数,使得50MHz的主频分频出不同频率的波。同时,演奏的音符还可以通过数码管和8*8点阵来动态显示。根据系统设计要求,该电子琴设计采用自顶向下的设计方法。整体的功能通过不同的底层模块配合来完成电子琴的功能。底层模块主要包括乐曲自动演奏模块、分频预置值产生模块和数控分频模块,数码管显示模块,8*8点阵显示模块五部分组成。用这种设计思路把整个系统分为了若干个模块,然后再在顶层文件中将各个模块组合在一起,从而体现出超、高速硬件描述语言VHDL的优势, 关于提高要求中通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能,我打算将一首曲子的音符储存在自动播放的数组里面,然后通过计数器来顺序播放储存的音符。关于提高要求中的手动演奏的音符存储、播放功能,我打算通过编程实现类似数据结构中队列的模块,来储存手动输入的音符,然后在要播放的时候,队列里面的音符依次出队,从而实现音符储存播放的功能。2. 总体框图数码管显示8*8点阵显示蜂鸣器输出音符输入高低音,自动手动图3简易电子琴总体结构框图是否自动播放查找对应的频率值结束开始输入按键点阵显示蜂鸣器输出数码管显示选择高低音是否图4简易电子琴逻辑流程图图5简易电子琴VHDL电路原理图3. 分块设计(1) 分频模块div0由于实验电路板的主频是50Mhz,为了数码管和点阵的刷新显示,我们必须将50Mhz的频率进行分频。分频的程序来自电路中心的网站上面。在这个模块里,我设置分频系数为cnt=2499。从实验结果看,这个分频对数码管和点阵的显示有很好的效果(2) 数码管显示模块shuma我使用了2个数码管,第一个数码管显示17的音符,第二个数码管显示相关的信息,比如高音用H表示,低音用L表示,自动播放用A表示。两个数码管分别刷新,但由于刷新频率太快,人眼不能察觉,以为是两个数码管是同时亮的。在程序中我们通过duan : out std_logic_vector(7 downto 0)和 cat : out std_logic_vector(5 downto 0)来控制数码管的显示。当输入不同的音符和不同的控制信息时,duan和cat向量都有不同的值与之对应。(3) 8*8点阵显示模块dianzhen8*8点阵的显示和数码管的显示运用了同样的原理,在程序中我们通过row : out std_logic_vector(7 downto 0)和col : out std_logic_vector(7 downto 0)这两个向量来控制点阵的显示。当输入不同的音符时,点阵显示相应的形状。(4) 音符产生模块auto。这个模块的功能是,选择的不同模式来产生不同的音符。当选择自动播放模式时,随着计数器count的值增加,即地址值递增时,程序自动读取出事先储存的音符,并把这个音符输出。当选择手动演奏模式时,直接将通过BTN1BTN7输入的向量当做音符输出yin :out std_logic_vector(6 downto 0);。(5) 分频预置值产生模块该模块的功能是通过音符以及高低音选项来查表找到对应的频率值。在程序中设置了全部音符对应的分频预置数。通过判断音符产生模块输出的音符 yin :in std_logic_vector(6 downto 0),以及拨码开关的高低音highlow :in std_logic_vector(1 downto 0)控制键,来查找出该音符的频率值,然后将该频率赋值给tone :out integer range 0 to 2000000);。 (6) 数控分频发声模块从实验板上面输入的时钟是50MHz的,必须经过分频后由clk_out输出,驱动蜂鸣器发声。Clk_out的输出频率就对应着音符的音调。分频系数由来自分频预置值模块的tone :out integer range 0 to 2000000)。由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号。为了利用驱动蜂鸣器,需要再增加一个进程,多波形进行整理,均衡占空比三、 仿真波形及波形分析1. 数码管显示模块仿真波形 波形分析:不同的yin,和highlow组合,数码管显示不同的字符。duan0duan7对应着数码管的a段到h段,cat0cat5控制不同的数码管2. 点阵显示模块仿真波形波形分析:不同的yin输入,点阵的col和row会有不同的波形,利用clk_in的上升沿来动态扫描点阵。从而得显示出指定的图形。3. 自动播放模块仿真波形波形分析:当auto 置1,clear置0,yin_out输出储存在程序里面的曲子音符,这时候相当于自动播放。当auto置0,clear置0,yin_out输出从BTN1BTN7读取的手动输入的信号,这时候相当于手动演奏。4. 分频预置值产生模块仿真波形波形分析:输入不同的高低音highlow,和音符yin,输出不同的tone。而tone将作为发声模块的分频预置值四、 源程序1. 分频模块源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity div0 isport(clk_in : in std_logic; -输入时钟 clk_tmp : out std_logic); -输出时钟end;architecture b of div0 is signal clk : std_logic;beginp0:process(clk_in) variable cnt : integer range 0 to 2499;beginif (clk_inevent and clk_in=1) thenif cnt=2499 then -分频系数为2499cnt:=0;clk= not clk;elsecnt:=cnt+1; -每个输入时钟上升沿到来时cnt加1end if;end if;end process p0;clk_tmp=clk;end b ;2. 数码管显示源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity shuma isport(clk_in : in std_logic; -以分频的时钟输入 yin : in std_logic_vector(6 downto 0); -输入音符 highlow :in std_logic_vector(1 downto 0); -输入高低音 auto : in std_logic; -自动播放 auto1 : in std_logic; -自动播放1 duan : out std_logic_vector(7 downto 0); cat : out std_logic_vector(5 downto 0) );end;architecture b of shuma issignal duant : std_logic_vector(7 downto 0);signal catt : std_logic_vector(5 downto 0);beginp1: process(clk_in,yin,highlow,auto,auto1) beginif auto =1 thencatt=111101;duant=00111111; -显示“8”表示自动播放elsif auto1 =1 then catt=111101;duant catt=111110;duant catt=111110;duant catt=111110;duant catt=111110;duant catt=111110;duant catt=111110;duant catt=111110;duant catt=111111;duant catt=111101;duant catt=111101;duant catt=111111;duant=00000000; end case; end if;end if; end process p1; cat= catt; duan= duant;end b;3. 点阵显示源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dianzhen isport(clk_in : in std_logic; -时钟输入 yin : in std_logic_vector(6 downto 0); -输入音符 row : out std_logic_vector(7 downto 0); -点阵行向量 col : out std_logic_vector(7 downto 0) -点阵列向量 );end;architecture b of dianzhen issignal count : integer range 0 to 6;signal rowt : std_logic_vector(7 downto 0);signal colt : std_logic_vector(7 downto 0);beginp1:process(clk_in)beginif (clk_inevent and clk_in=1) thenif count = 6 then count=0;elsecount rowt=11111110;colt rowt=11111101;colt rowt=11111011;colt rowt=11110111;colt rowt=11101111;colt rowt=11011111;colt rowt=10111111;colt rowt=11111111;colt rowt=11111110;colt rowt=11111101;colt rowt=11111011;colt rowt=11110111;colt rowt=11101111;colt rowt=11011111;colt rowt=10111111;colt rowt=11111111;colt rowt=11111110;colt rowt=11111101;colt rowt=11111011;colt rowt=11110111;colt rowt=11101111;colt rowt=11011111;colt rowt=10111111;colt rowt=11111111;colt rowt=11111110;colt rowt=11111101;colt rowt=11111011;colt rowt=11110111;colt rowt=11101111;colt rowt=11011111;colt rowt=10111111;colt rowt=11111111;colt rowt=11111110;colt rowt=11111101;colt rowt=11111011;colt rowt=11110111;colt rowt=11101111;colt rowt=11011111;colt rowt=10111111;colt rowt=11111111;colt rowt=11111110;colt rowt=11111101;colt rowt=11111011;colt rowt=11110111;colt rowt=11101111;colt rowt=11011111;colt rowt=10111111;colt rowt=11111111;colt rowt=11111110;colt rowt=11111101;colt rowt=11111011;colt rowt=11110111;colt rowt=11101111;colt rowt=11011111;colt rowt=10111111;colt rowt=11111111;colt rowt=11111110;colt rowt=11111101;colt rowt=11111011;colt rowt=11110111;colt rowt=11101111;colt rowt=11011111;colt rowt=10111111;colt rowt=11111111;colt=00000000;end case;end if; end process p2; row= rowt; col= colt;end b;4. 选择音符及自动播放源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity auto isport( clk_in :in std_logic;-输入时钟 auto :in std_logic;-自动播放 auto1 :in std_logic;-试音播放 clear :in std_logic;-复位 yin_in :in std_logic_vector(6 downto 0);-输入音符 yin_out :out std_logic_vector(6 downto 0); -输出音符end auto;architecture a of auto issignal count : integer range 0 to 35;signal n: integer range 0 to 6;signal yin : std_logic_vector(6 downto 0);begin p1:process(clk_in,clear)variable i : integer range 0 to 63000000;begin if clear =1 then count=0; elsif (clk_inevent and clk_in=1) thenif (i=20000000) then i:=0; if count =15 then count =0;-自动播放count记数 else count =count+1; end if; if n =6 then n =0; -试音播放n记数 else n =n+1; end if;else i:=i+1;end if; end if;end process p1;p2:process(count,auto,yin_in,clear)begin if clear=1 then yin yin yin yin yin yin yin yin yin yin yin yin yin yin yin yin yin yin yin yin yin yin yin yin=0000000;end case;elseyin=yin_in;-动手演奏end if;end if;end process p2;yin_out tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0 tone0=2000000;end case; end if;end process ;tone =tone0;end a;6. 分频发音模块源代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity div isport(clk_in : in std_logic;-输入时钟 tone: in integer range 0 to 2000000;-预置频率 clk_out : out std_logic);-输出时钟end div;architecture a of div issignal clk_tmp0 : std_logic;signal clk_tmp1: std_logic;begin p0:process(clk_in, tone)variable cnt : integer range 0 to 49999999;beginif (clk_inevent and clk_in=1) then if cnt 12999999/tone then-分频系数 cnt:=cnt+1; clk_tmp0=1; else cnt:=0; clk_tmp0=0; end if;end if;end process p0;p1:process(clk_tmp0)variable count :std_logic;beginif(clk_tmp0event and clk_tmp0=1) thencount:=not count;if count =1 thenclk_tmp1 =1;-输出平稳的波形elseclk_tmp1 =0;end if;end if;end process p1;clk_outclk,auto=auto_in,yin_in=yin,yin_out=yin_tmp,clear=clear,auto1=auto1);u2: seletone port map (highlow=highlow,yin=yin_tmp,tone=tone_tmp); u3: shuma port map (duan=duan,cat=cat,yin=yin_tmp,clk_in=clk_tmp,highlow=highlow,auto=auto_in,auto1=auto1); u4: dianzhen port map (row=row,col=col,yin=yin_tmp,clk_in=clk_tmp); u5: div port map (clk_in=clk,tone=tone_tmp,clk_out=clk_out);u6: div0 port map (clk_in=clk,clk_tmp=clk_tmp);end a;五、 功能说明初始状态,88点阵显示“1 2 3 4 5 6 7”七个音符构成的电子琴键盘,其中点阵的第一列用一个LED点亮表示音符“1”,第二列用二个LED点亮表示音符“2”,依此类推,用BTN1BTN7七个按键模拟电子琴手动演奏时的“1 2 3 4 5 6 7”七个音符。当某个按键按下时,数码管显示相应的音符,点阵上与之对应的音符显示列全灭,同时蜂鸣器演奏相应的声音;当按键弹开时数码管显示的音符灭掉,点阵显示恢复,蜂鸣器停止声音的输出。由拨码开关切换选择高、中、低音,并用数码管进行相应的显示可通过一个拨码开关进行手动/自动演奏的切换,并与点阵显示配合增加自动演奏乐曲的功能。六、 元器件清单及资源利用情况1. 元器件清单基本功能:Altra公司MaxII系列EPM71270T144C5开发板一块及电源线、下载线各一根。开发板内元器件利用情况如下:元器件数量88点阵显示屏1拨码开关4按键8数码管2蜂鸣器12. 管脚设置 3. 资源利用情况七、 故障及问题分析在编写各个元件程序的时候,我通过仿真查找问题,然后编程修改。单个元件的仿真都通过了。但是整个系统配合起来就不行了。这可能是我各个元件之间的线没连好。于是我重新思考了整个系统的设计,重新画了系统框图。修改程序之后可以下载到板子上面运行,不过效果不太理想。有些问题仿真看不出来,实际运行时会出问题。就像老师说的,要设计一个电路总要先用仿真成功之后才实际接线的,但是最后的成品却不一定与仿真时完全一样。所以调试的工作很重要。下载完后,一开始音不好听,我调整了分频系
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 报关实务考试题及答案
- 2025年甘肃省兰州石化职业技术大学教师选聘考试笔试试题(含答案)
- 2025年大庆市属国有企业招聘考试笔试试题(含答案)
- 从业人员法律法规培训试卷(附答案)
- 2024年院感知识竞赛备考试题库50题几答案(含各题型)
- 无菌技术理论知识考核试题及答案
- Ⅲ类射线装置辐射工作人员考试题(附答案)
- 2025年政府采购基本法律法规考试题库与答案
- (2025)党校入党积极分子培训结业考试试题库及答案
- 2024山东省安全生产月知识竞赛竞答试题含参考答案
- 履带吊安装拆除作业安全管理与实施方案
- 儿科护理进修
- 人员资质认定管理办法
- 2025年安防生产行业技能考试-安全防范系统安装维护员历年参考题库含答案解析(5套共100道单选合辑)
- 16种英语时态教学课件
- 2025年新版保安员考试试题附(答案+解析)
- 2025至2030钢铁行业市场发展分析及前景趋势与发展趋势分析与未来投资战略咨询研究报告
- 有色金属工程结构荷载规范2025年
- 2025年中级注册安全工程师《道路运输安全实务》考试真题及答案
- 道路试验车辆管理办法
- DR射线检测培训课件
评论
0/150
提交评论