eda电子设计使用verilog语言电子琴实验报告

合集下载

Verilog实验报告(电子)参考模板

Verilog实验报告(电子)参考模板

西安邮电大学Verilog HDL大作业报告书学院名称:电子工程学院学生姓名:专业名称:电子信息工程班级:实验一异或门设计一、实验目的(1)熟悉Modelsim 软件(2)掌握Modelsim 软件的编译、仿真方法(3)熟练运用Modelsim 软件进行HDL 程序设计开发二、实验内容my_or,my_and和my_not门构造一个双输入端的xor门,其功能是计算z=x’y+xy’,其中x和y为输入,z为输出;编写激励模块对x和y的四种输入组合进行测试仿真1、实验要求用Verilog HDL 程序实现一个异或门,Modelism仿真,观察效果。

2、步骤1、建立工程2、添加文件到工程3、编译文件4、查看编译后的设计单元5、将信号加入波形窗口6、运行仿真实验描述如下:module my_and(a_out,a1,a2);output a_out;input a1,a2;wire s1;nand(s1,a1,a2);nand(a_out,s1,1'b1);endmodulemodule my_not(n_out,b);output n_out;input b;nand(n_out,b,1'b1); endmodulemodule my_or(o_out,c1,c2);output o_out;input c1,c2;wire s1,s2;nand(s1,c1,1'b1);nand(s2,c2,1'b1);nand(o_out,s1,s2); endmodulemodule MY_XOR(z,x,y);output z;input x,y;wire a1,a2,n1,n2;my_not STEP01(n1,x);my_not STEP02(n2,y);my_and STEP03(a1,n1,y);my_and STEP04(a2,n2,x);my_or STEP05(z,a1,a2); Endmodulemodule stimulus;reg X,Y;wire OUTPUT;MY_XOR xor01(OUTPUT,X,Y);initialbegin$monitor($time,"X=%b,Y=%b --- OUTPUT=%b\n",X,Y,OUTPUT);endinitialbeginX = 1'b0; Y = 1'b0;#5 X = 1'b1; Y = 1'b0;#5 X = 1'b1; Y = 1'b1;#5 X = 1'b0; Y = 1'b1;endendmodule二、实验结果波形图:三、分析和心得通过这次的实验,我基本熟悉Modelsim 软件,掌握了Modelsim 软件的编译、仿真方法。

eda实验报告模板

eda实验报告模板

eda实验报告模板EDA 实验报告模板一、实验目的EDA(Electronic Design Automation,电子设计自动化)实验的目的通常包括以下几个方面:1、熟悉 EDA 工具的使用方法和操作流程,如 Quartus II、ModelSim 等。

2、掌握数字电路的设计、仿真和综合过程,提高逻辑思维和电路设计能力。

3、深入理解数字逻辑的基本概念,如组合逻辑、时序逻辑等。

4、培养解决实际问题的能力,通过实验项目的实践,学会分析和处理电路中的故障和错误。

二、实验设备与环境1、计算机:配置应满足 EDA 软件的运行要求,具备一定的处理能力和内存。

2、 EDA 软件:如 Quartus II、Vivado 等,用于电路设计、仿真和综合。

3、实验开发板(可选):用于硬件验证和测试设计的电路。

三、实验原理1、组合逻辑电路由逻辑门组成,输出仅取决于当前输入的逻辑值。

常见的组合逻辑电路有加法器、编码器、译码器等。

2、时序逻辑电路包含存储元件(如触发器),输出不仅取决于当前输入,还与之前的状态有关。

计数器、寄存器、移位寄存器等是常见的时序逻辑电路。

四、实验内容与步骤(一)实验内容1、设计一个简单的组合逻辑电路,如 2 输入异或门。

2、设计一个时序逻辑电路,如 4 位同步计数器。

3、对设计的电路进行功能仿真,验证其逻辑功能的正确性。

4、进行综合和布线,将设计下载到实验开发板上进行硬件验证(如有开发板)。

(二)实验步骤1、打开 EDA 软件,创建新的工程。

选择合适的芯片型号和目标器件。

设置工程的相关参数,如时钟频率等。

2、编写电路的 Verilog 或 VHDL 代码。

对于组合逻辑电路,根据逻辑表达式直接编写代码。

对于时序逻辑电路,要考虑时钟信号和状态的变化。

3、进行功能仿真添加输入激励信号,设置仿真时间和精度。

观察输出波形,与预期结果进行比较,验证电路功能是否正确。

4、综合与布线软件对代码进行综合优化,生成门级网表。

Verilog 电子琴程序

Verilog 电子琴程序

如题,,,再附加上程序的控制说明.......是用GW48教学实验箱仿真的如果对你有帮助,请大家顶上...程序直接贴上了控制说明:1、电子琴:程序设计采用八个输入端口,分别与实验箱上的按键8~1引脚相连接,采用一个输出端口,与扬声器的引脚连接,时钟频率采用6MHz和4Hz。

按键7~1分别用于中音的七个音符的发音(DO,RE,MI,FA,SO,LA,SI),按键8用于控制乐曲的播放。

程序的编写采用状态机的编写方法,对按键的状态进行判断,对应相应的音符或乐曲。

2、电子钟:程序的设计模块有:时钟初始化模块、时钟工作模块、时钟设置模块、闹钟设置模块、闰年的月份天数判断模块、数码管显示模块、闹钟铃声模块及其它的设置模块。

程序使用8个输入分别与8个按键连接,用按键8对应时钟工作状态(work_state),当work_state 为0时,时钟正常工作,当work_state为1时,进入时钟设置状态。

按键7对应输入端口display_set控制时钟显示状态(display_state),每按2次(用于产生上升沿触发)则数码管的输出不同。

Display_state与work_state相结合使用,以区分设置的参数。

按键6~4对应输入个脚in_set,该参数共有三位,用以表示三个状态:state_yorh (设置年或小时)、state_morm (设置月份或分钟)、state_dors(设置日期或秒钟)。

按键3~2对应数值设置端口up各down。

Up用于产生上升沿触发,当down为0时,则每一个上升沿产生时,相应的参数加1,当down为1时,则每一个上升沿产生时,相应的参数减1。

按键1与输入端口clock_on相连,用于闹钟的开与关,当clock_on为1时开闹钟,否则关闹钟。

扬声器与输出端口speaker 相连,用于输出闹钟铃声。

附录:源程序一、电子琴:module piano(in,clk_6MHz,clk_4Hz,song,speaker);input in,clk_6MHz,clk_4Hz,song;output speaker;reg speaker;reg[7:0] state;reg song_on;wire[6:0] in;reg[3:0] high,med,low;reg[13:0] divider,origin;reg[7:0] counter;reg out;wire carry;reg[20:0] i;parameter zero=8'b0000_0000,one=8'b0000_0001,two=8'b0000_0010,three=8'b0000_0100,four=8'b0000_1000,five=8'b0001_0000,six=8'b0010_0000,seven=8'b0100_0000;initialbeginsong_on<=0;endalways @(posedge song)beginsong_on<=~song_on;endalways @(posedge clk_6MHz)beginif(song_on)speaker<=out;elsebegincase(in)zero:beginspeaker<=0;i<=0;endone:begin //doif(i>=11451)beginspeaker=!speaker;i<=0;endelsei<=i+1;endtwo:begin //reif(i>=10204)beginspeaker=!speaker;i<=0;endelsei<=i+1;endthree:begin //miif(i>=9091)beginspeaker=!speaker;i<=0;endelsei<=i+1;endfour:begin // fa if(i>=8596)beginspeaker=!speaker;i<=0;endelsei<=i+1;endfive:begin //soif(i>=7653)beginspeaker=!speaker;i<=0;endelsei<=i+1;endsix:begin //loif(i>=6818)beginspeaker=!speaker;i<=0;endelsei<=i+1;endseven:begin //siif(i>=6073)beginspeaker=!speaker;i<=0;endelsei<=i+1;enddefault:beginspeaker<=0;i<=0;endendcaseendendassign carry=(divider==16383);always @(posedge clk_6MHz)beginif(carry)divider<=origin;elsedivider<=divider+1;endalways @(posedge carry)beginout<=~out; //2 分频产生方波信号endalways @(posedge clk_4Hz)begincase({high,med,low}) //分频比预置'b000000000011: origin<=7281;'b000000000101: origin<=8730;'b000000000110: origin<=9565;'b000000000111: origin<=10310;'b000000010000: origin<=10647;'b000000100000: origin<=11272;'b000000110000: origin<=11831;'b000001010000: origin<=12556;'b000001100000: origin<=12974;'b000100000000: origin<=13516;'b000000000000: origin<=16383;endcaseendalways @(posedge clk_4Hz)beginif(counter==63)counter<=0; //计时,以实现循环演奏elsecounter<=counter+1;case(counter) //记谱0: {high,med,low}<='b000000000011; //低音“3”1: {high,med,low}<='b000000000011; //持续4 个时钟节拍2: {high,med,low}<='b000000000011;3: {high,med,low}<='b000000000011;4: {high,med,low}<='b000000000101; //低音“5”5: {high,med,low}<='b000000000101; //发3 个时钟节拍6: {high,med,low}<='b000000000101;7: {high,med,low}<='b000000000110; //低音“6”8: {high,med,low}<='b000000010000; //中音“1”9: {high,med,low}<='b000000010000; //发3 个时钟节拍10: {high,med,low}<='b000000010000;11: {high,med,low}<='b000000100000; //中音“2”12: {high,med,low}<='b000000000110; //低音“6”13: {high,med,low}<='b000000010000;14: {high,med,low}<='b000000000101;15: {high,med,low}<='b000000000101;16: {high,med,low}<='b000001010000; //中音“5”17: {high,med,low}<='b000001010000; //发3 个时钟节拍18: {high,med,low}<='b000001010000;19: {high,med,low}<='b000100000000; //高音“1”20: {high,med,low}<='b000001100000;21: {high,med,low}<='b000001010000;22: {high,med,low}<='b000000110000;23: {high,med,low}<='b000001010000;24: {high,med,low}<='b000000100000; //中音“2”25: {high,med,low}<='b000000100000; //持续11 个时钟节拍26: {high,med,low}<='b000000100000;27: {high,med,low}<='b000000100000;28: {high,med,low}<='b000000100000;29: {high,med,low}<='b000000100000;30: {high,med,low}<='b000000100000;31: {high,med,low}<='b000000100000;32: {high,med,low}<='b000000100000;33: {high,med,low}<='b000000100000;34: {high,med,low}<='b000000100000;35: {high,med,low}<='b000000110000; //中音“3”36: {high,med,low}<='b000000000111; //低音“7”37: {high,med,low}<='b000000000111;38: {high,med,low}<='b000000000110; //低音“6”39: {high,med,low}<='b000000000110;40: {high,med,low}<='b000000000101; //低音“5”41: {high,med,low}<='b000000000101;42: {high,med,low}<='b000000000101;43: {high,med,low}<='b000000000110; //低音“6”44: {high,med,low}<='b000000010000; //中音“1”45: {high,med,low}<='b000000010000;46: {high,med,low}<='b000000100000; //中音“2”47: {high,med,low}<='b000000100000;48: {high,med,low}<='b000000000011; //低音“3”49: {high,med,low}<='b000000000011;50: {high,med,low}<='b000000010000; //中音“1”51: {high,med,low}<='b000000010000;52: {high,med,low}<='b000000000110;53: {high,med,low}<='b000000000101; //低音“5”54: {high,med,low}<='b000000000110;55: {high,med,low}<='b000000010000; //中音“1”56: {high,med,low}<='b000000000101; //低音“5”57: {high,med,low}<='b000000000101; //持续8 个时钟节拍58: {high,med,low}<='b000000000101;59: {high,med,low}<='b000000000101;60: {high,med,low}<='b000000000101;61: {high,med,low}<='b000000000101;62: {high,med,low}<='b000000000101;63: {high,med,low}<='b000000000101;endcaseendendmodule。

电子琴设计报告

电子琴设计报告

EDA技术课程设计设计题目:简易电子琴设计专业:应用物理学学生XX:赵骉学号:日期:2011/8/31摘要随着基于CPLD的EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制用计算机等领域的重要性日益突出。

作为一个学电子信息专业的学生,我们必须不断地了解更多的新产品信息,这就更加要求我们对EDA有个全面的认识。

本程序设计的是简易电子琴的设计。

采用EDA作为开发工具,VHDL语言为软件描述语言,QuartusII6.1作为程序运行平台,所开发的程序通过调试运行、波形仿真验证,初步实现了设计目标。

本程序使用的硬件描述语言VHDL,可以大大降低了硬件数字系统设计的入门级别,让人感觉就是C语言的近亲。

通过老师的指导和自己的学习完成了预想的功能。

1 课程设计的目的及任务1.1 课程设计的目的巩固和运用所学课程,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力,通过对一个简易的八音符电子琴的设计,进一步加深对计算机原理以及数字电路应用技术方面的了解与认识,进一步熟悉数字电路系统设计、制作与调试的方法和步骤。

巩固所学课堂知识,理论联系实际,提高分析、解决计算机技术实际问题的独立工作能力。

为了进一步了解计算机组成原理与系统结构,深入学习EDA技术,用VHDL语言去控制将会使我们对本专业知识可以更好地掌握。

1.2 课程设计的内容设计一个简易电子琴,利用试验箱的脉冲电源产生1,2,3,4,5,6,7共7个音阶信号,当按下一个键时,有相应的乐音发出,同时用指示灯显示乐音,用数码管显示音符。

2 原理描述2.1音名与频率的关系根据声乐知识,产生音乐的两个因素是音乐频率的持续时间,音乐的十二平均率规定,每两个八音度之间的频率相差一倍,在两个八音度之间,又可分为12个半音。

每两个半音的频率比为4。

另外,音名A(乐谱中的低音6)的频率为440HZ,音名B到C之间,E到F之间为半音,其余为全音。

VHDL电子琴实验报告

VHDL电子琴实验报告

VHDL电子琴实验报告
实验目的:
本实验的目的是设计一个VHDL电子琴,通过FPGA实现,实现按键发出不同的音调,并通过扬声器输出对应的音频信号,达到模拟真实电子琴的效果。

实验原理:
VHDL(Very High Speed Integrated Circuit Hardware Description Language)是一种硬件描述语言,用于描述数字电路的行为和结构。

在本实验中,我们将使用VHDL语言描述电子琴的按键和音调的对应关系,通过FPGA实现电子琴的功能。

电子琴实验主要包含两个部分:输入部分和输出部分。

输入部分是按键,按下不同的按键会发出不同的音调。

输出部分是扬声器,通过扬声器输出对应的音频信号。

实验步骤:
1.确定电子琴的按键数量和对应的音调。

2.使用VHDL语言描述电子琴的按键和音调的对应关系。

3.将VHDL代码综合成逻辑电路网表。

4.将逻辑电路网表烧录到FPGA中。

5.连接扬声器到FPGA输出引脚。

6.按下不同的按键,测试扬声器输出的音频信号是否正确。

实验结果:
经过实验测试,我们成功实现了一个简单的VHDL电子琴。

按下不同的按键,扬声器输出对应的音调。

通过调整VHDL代码中的音频频率,可以改变电子琴的音调高低。

实验总结:
通过本实验,我们深入理解了VHDL语言的应用和FPGA的原理。

电子琴作为一个实际应用案例,充分展示了数字电路设计的魅力。

在今后的学习和工作中,我们将能更加熟练地应用VHDL语言和FPGA技术,设计更加复杂的数字电路系统。

电子琴的实验报告

电子琴的实验报告

单片机课程设计设计题目电子琴指导老师:苏参与实验者:moxiaoxiao 专业:统本电信0801 地点:3#楼北楼605一.设计目的:(1).培养综合运用知识的能力(2).朋友查阅资料,使用工程设计标准及编写设计文档的能力.(3).掌握单片机应用系统的设计方法.(4).提高计算机绘图能力二.设计任务:利用DP51PROC 实验系统上的定时器/计数器,按键和蜂鸣器单元。

用单片机I/O 口线控制蜂鸣器发出不同的音调,程序检测按键状态,7 个按键中某一键按下时,蜂鸣器对应标称音阶.三.设计与调试环境KEIL uVision2 是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51 架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM ,汇编和 C 语言的程序设计,它的界面和常用的微软VC++ 的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。

1:按下面的步骤建立一个项目:图1- 4 选取芯片图1- 5 新建程序文件(1)点击图1-5 中的 3 保存新建的程序,也可以用菜单File -Save 或快捷键Ctrl+S 进行保存。

因是新文件所以保存时会弹出类似图1- 3 的文件操作窗口,我们把第一个程序命名为,保存在项目所在的目录中,这时程序单词有了不同的颜色,说明KEIL 的 C 语法检查生效了。

如图1- 6 鼠标在屏幕左边的Source Group1 文件夹图标上右击弹出菜单,在这里可以做项目中增加减少文件等操作。

我们选“ Add File t o Group ‘ SourceGroup 1”'弹出文件窗口,选择刚刚保存的文件,按ADD 按钮,关闭文件窗,程序文件已加到项目中了。

这时在Source Group1 文件夹图标左边出现了一个小+ 号说明,文件组中有了文件,点击它可以展开查看。

图1- 6 把文件加入到项目文件组中编译程序(2)进入调试模式,软件窗口样式大致如图1-8 所示。

EDA_电子琴课程设计 2(1).

EDA_电子琴课程设计 2(1).

《EDA技术实用教程》课程设计课程设计报告课题: EDA电子琴课程名称: EDA技术实用教程学院名称:物理电气信息学院班级: 2011级通信工程(1)班学生姓名:安昱学号: 12011243986 指导教师:杨泽林2013年12月26日EDA技术实用教程课程设计EDA电子琴摘要:本课程设计主要采用EDA技术设计一个简易的八音符电子琴,它可通过按键输入来控制音响从而演奏出已存入的乐曲。

在课程设计中,系统开发平台为Windows XP,程序设计采用VHDL语言,程序运行平台为Quartus II。

然后编写程序实现电子琴的各项功能,使不同的音阶对应不同频率的正弦波,按下不同的键时发出对应频率的声音。

程序通过调试运行,时序仿真,电路功能验证,顺利地实现了设计目标。

关键词:电子琴;EDA;VHDL;音阶;频率1、引言随着信息科学的进步,现代电子产品的性能越来越高,复杂度越来越大,更新步伐也越来越快,电子技术的发展进入了划时代的阶段。

其中电子技术的核心便是电子设计自动化EDA(Electronic Design Automatic)技术。

EDA是指以计算机为工作平台,融合了应用电子技术、计算机技术、智能化技术的最新成果而开发出的电子CAD 通用软件包,它根据硬件描述语言VHDL完成的设计文件,自动完成逻辑编译、化简、分割、综合、优化、布局布线及仿真,直至完成对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。

本课程设计就是采用EDA技术描述语言VHDL编程实现简易电子琴的各项功能,是EDA技术应用于实际的一个很好的例子。

1.1 课程设计目的本课程设计主要是基于VHDL文本输入法设计乐曲演奏电路,该系统基于计算机中时钟分频器的原理,采用自顶向下的设计方法来实现,通过按键输入来控制音响或者自动演奏已存入的歌曲。

系统由乐曲自动演奏模块、音调发生模块和数控分频模块三个部分组成。

系统实现是用硬件描述语言VHDL按模块化方式进行设计,然后进行编程、时序仿真、电路功能验证,奏出美妙的乐曲。

EDA技术及应用—基于FPGA的电子系统设计:基于Verilog hdl的数字电路设计

EDA技术及应用—基于FPGA的电子系统设计:基于Verilog hdl的数字电路设计

10100
1111
15
10101
8421BC 余三码 D码
0000
0011
0001
0100
0010
0101
0011
0110
0100
0111
0101
1000
0110
1001
0111
1010
1000
1011
1001
1100
-
-
-
-
-
-
-
-
-
-
-
-
4位格雷码
0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000
4'b0011:a_to_g=7'b1111001; //显示3
4'b0100:a_to_g=7'b0110011; //显示4
4'b0101:a_to_g=7'b1011011; //显示5
4'b0110:a_to_g=7'b1011111; //显示6
4'b0111:a_to_g=7'b1110000; //显示7
4: y= {d[2:0],d[3]}; // rol
5: y= {d[3],d[3:1]}; // asr
6: y= {d[1:0],d[3:2]}; // ror2
7: y= d;
// noshift
default: y = d;
图6-2 基本门电路仿真结果
综合结果如图6-3所示。
图6-3 基本门电路综合结果
2、 三态逻辑电路
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电子设计自动化课程设计报告院系:信息工程学院专业:电子信息工程学号:姓名:指导教师:2013 年月日目录1设计目的 (3)2题目描述与要求 (3)3课程设计报告内容 (3)3.1设计原理与思路 (3)3.2操作过程 (4)3.3设计和调试过程中出现的问题及解决方法 (7)4设计总结和心得体会 (8)一、课程设计目的使用VerilogHDL语言进行前端设计,并使用Quaruts软件在实验箱上实现仿真,实现硬件电子琴。

电子琴要求有8个音阶,使用外部时钟信号32MHz,能同步显示音阶。

二、课程设计题目描述和要求题目:简易电子琴的设计主要功能:(1)设计一个八音电子琴。

(2)由键盘输入控制音响,同时可自动演奏乐曲。

(3)用户可以将自己编制的乐曲存入电子琴,演奏时可选择键盘输入乐曲或者已存入的乐曲。

三、课程设计报告内容3.1设计原理与思路系统由数控分频器、乐曲存储模块以及发声模块组成。

数控分频器对FPGA的基准频率进行分频,得到与各个音阶对应的频率输出。

乐曲存储模块产生节拍控制和音阶选择信号,即在此模块中可存放一个乐曲曲谱真值表,由一个计数器来控制此真值表的输出,而由计数器的计数时钟信号作为乐曲节拍控制信号。

由发声模块产生音符对应的频率的信号来使扬声器发音。

(1)模块automusic模块automsic由auto信号来选择发声的方式,auto=0时系统自动播放内置的音乐,auto=1时由键盘来手动演奏音乐。

(2)模块TONE模块Tone是音阶发生器,当8位发声控制输入Index中某一位为高电平时,则对应某一音阶的数值将从端口Tone输出,作为获得该音阶的分频预置值;同时由Code输出对应该音阶简谱的显示数码,如‘5’,并由High输出指示音阶高8度显示。

(3)模块Speaker模块Speaker中的主要电路是一个数控分频器,它由一个初值可预置的加法计数器构成,当模块Speaker由端口Tone获得一个2进制数后,将以此值为计数器的预置数,对端口Clk12MHZ输入的频率进行分频,之后由Spkout向扬声器输出发声。

3.2操作过程新建工程添加模块查找对应芯片调试程序波形仿真生成逻辑图设置管脚3.3设计和调试过程中出现的问题及解决方法在初次编写分频模块时候,使用的是比较基本的计数器分频法,编写程序后在modelsim软件中进行了仿真,发现无法观察到分频情况。

经过分析,原因是由于分频比过大,因此在波形图中很难观察到。

而且由于预分频的占空比很小,更难以观察到高电平。

在原因找到后,为了考察程序的性能,我们将输入频率减小。

同时适当缩小分频比,这样就得到了模块仿真中的分频波形。

四、设计总结和心得体会通过这次课程设计发现,只有理论水平提高了;才能够将课本知识与实践相整合,理论知识服务于教学实践,以增强自己的动手能力。

这个实验十分有意义我获得很深刻的经验。

通过这次课程设计,我们知道了理论和实际的距离,也知道了理论和实际想结合的重要性,,也从中得知了很多书本上无法得知的知识。

学习不但要立足于书本,以解决理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课程研究,学生自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。

学习就应该采取理论与实践结合的方式,理论的问题,也就是实践性的课题。

这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。

参考文献:(五号,宋体加粗)[1]潘松,《EDA实用教程》,科学出版社,2004年附录:(源程序)module top(clk32MHz,handTOauto, code1,index1,high1,spkout);input clk32MHz,handTOauto; //32MHz系统时钟,键盘输入/自动演奏input [7:0] index1;//键盘输入信号output [6:0] code1; //音符显示信号output high1,spkout;//高低音节信号,音频信号wire [10:0] tone;wire [7:0] indx;automusic u0(.clk(clk32MHz),.index2(index1),.index0(indx),.auto(handTOauto)); tone u1(.index(indx),.tone0(tone),.code(code1),.high(high1));speaker u2(.clk1(clk32MHz),.tone1(tone),.spks(spkout));Endmodulemodule automusic(clk,auto,index2,index0);//实现自动演奏功能。

input clk,auto;//系统时钟;键盘输入/自动演奏input [7:0] index2;//键盘输入信号output [7:0] index0;//音符信号输出reg [7:0] index0;reg [4:0] count0;reg clk2;reg [22:0] count;always @(clk,auto) //此过程完成对系统时钟8M的分频,得到4Hz的信号clk2beginif (auto)begincount=23'd0;clk2<=1'b1;endelse if (clk)begincount=count+1'b1;if (count==23'd4000000) clk2<=1'b1;else if (count==23'd8000000) begin clk2<=1'b0; count=23'd0;end endendalways @(posedge clk2)//此过程完成自动演奏部分曲的地址累加beginif (count0==5'd31)count0<=5'd0;elsecount0<=count0+1'b1;endalways @(count0,auto,index2)beginif (!auto)case(count0) //此case语句:存储自动演奏部分的曲5'd0: index0<=8'b00000100; //35'd1: index0<=8'b00000100;5'd2: index0<=8'b00000100;5'd3: index0<=8'b00000100;5'd4: index0<=8'b00010000;//55'd5: index0<=8'b00010000;5'd6: index0<=8'b00010000;5'd7: index0<=8'b00100000;//65'd8: index0<=8'b10000000;//85'd9: index0<=8'b10000000;5'd10: index0<=8'b10000000;5'd11: index0<=8'b00000100;5'd12: index0<=8'b00000010;//25'd13: index0<=8'b00000010;5'd14: index0<=8'b00000001;//15'd15: index0<=8'b00000001;5'd16: index0<=8'b00010000;//55'd17: index0<=8'b00010000;5'd18: index0<=8'b00001000;//45'd19: index0<=8'b00001000;5'd20: index0<=8'b00001000;5'd21: index0<=8'b00000100;5'd22: index0<=8'b00000010;5'd23: index0<=8'b00000010;5'd24: index0<=8'b00010000;5'd25: index0<=8'b00010000;5'd26: index0<=8'b00001000;5'd27: index0<=8'b00001000;5'd28: index0<=8'b00000100;5'd29: index0<=8'b00000100;5'd30: index0<=8'b00000010;5'd31: index0<=8'b00000010;default: ;endcaseelse index0<=index2; //键盘输入音符信号输出endEndmodulemodule tone(index,code,high,tone0); //音阶发生器程序。

input [7:0] index;//音符输入信号output [6:0] code;//音符显示信号output high;//高低音显示信号output [10:0] tone0;//音符的分频系数reg high;reg [6:0] code;reg [10:0] tone0;always @(index)//此过程完成音符到音符的分频系数译码,音符的显示,高低音阶begincase(index)8'b00000001: begin tone0=11'd773; code=6'b1001111;high=1'b1;end8'b00000010: begin tone0=11'd912; code=6'b0010010;high=1'b1;end8'b00000100: begin tone0=11'd1116;code=6'b1001100;high=1'b1;end8'b00010000: begin tone0=11'd1197;code=6'b0100100;high=1'b1;end8'b00100000: begin tone0=11'd1290;code=6'b0100000;high=1'b0;end8'b01000000: begin tone0=11'd1372;code=6'b0001111;high=1'b0;end8'b10000000: begin tone0=11'd1410;code=6'b0000000;high=1'b0;enddefault: begin tone0=11'd2047;code=6'b0000001;high=1'b0;endendcaseendendmodulemodule speaker(clk1,tone1, spks);//实现数控分频input clk1;//系统时钟input [10:0] tone1;//音符分频系数output spks;//驱动扬声器的音频信号reg [10:0] tone2;reg spks;reg preclk,fullspks,count2;reg [3:0] count;reg [10:0] count11;always @(posedge clk1) //此过程对系统时钟进行4分频begincount=count+1'b1;if (count==4'h2)preclk<=1'b1;elseif (count==4'h4)beginpreclk<=1'b0;count=4'h0;endendalways @(posedge preclk) //此过程按照tone1输入的分频系数对8MHz的脉冲再次分频,得到所需要的音符频率beginif (count11<tone1)begincount11=count11+1;fullspks<=1'b1;endelsebegincount11<=0;fullspks<=1'b0;endendalways @(posedge fullspks) //此进程对fullspks进行2分频begincount2=~count2;if (count2)spks<=1'b1;elsespks<=1'b0;endEndmodule。

相关文档
最新文档