EDA技术实验 乐曲硬件演奏电路设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C<=C+1;
case(C)
0: B=4'B0111; 1: B=4'B1011; 2: B=4'B1101; 3: B=4'B1110;
endcase
case({B,A} )
8'B0111_1110 : R=4'H0; 8'B0111_1101 : R=4'H1;
8'B0111_1011 : R=4'H2; 8'B0111_0111 : R=4'H3;
预置数。当演奏乐曲后,可以通过控制功能自动重播曾经弹奏的乐曲。
四、实验步骤:
(1)定制 ROM 存储音乐数据,方法如下: ○1 先生成 mif 文件:NewMemory Initialization Fileword size 改成 4把数据输入表格保存成 music.mif
○2 定制 musicRAM:
③ 模块 CNT138T 是一个 8 位二进制计数器,内部设置计数最大值为 256,作为音符数据 ROM 的地址 发生器。这个计数器的计数频率即为 4Hz。即每一计数值的停留时间为 0.25 秒,恰为当全音符设为 1 秒时, 四四拍的 4 分音符持续时间。例如,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了 4 个时钟节拍, 即 1 秒时间,相应地,所对应的“3”音符分频预置值为 11'H40C,在 SPKER 的输入端停留了 1 秒。随着 计数器 CNT138T 按 4Hz 的时钟速率作加法计数时,即随地址值递增时,音符数据 ROM 模块 MUSIC 中的 音符数据将从 ROM 中通过 q[3..0]端口输向 F_CODE 模块,“梁祝”乐曲就开始连续自然地演奏起来了。
在应用中,当按下某键后,为了辨别和读取键信息,一种比较常用的方法是,向 A 口扫描输入一组分 别只含一个 0 的 4 位数据,如 1110,1101,1011 等。若有键按下,则 B 口一定会输出对应的数据, 这时,只要结合 A,B 口的数据,就能判断出键的位置。如当键 S0 按下,对于输入的 A=1110 时,那 么输出的 B=0111。于是{B,A}=0111_1110 就成了 S0 的代码。
6、FDIV:分频器,将 2000HZ 的频率分成 4HZ。 7、Key:板子上的键盘
8、KEYBOARD:4x4 键盘 9、SPKER:
六、附录:
源程序: 1、 CNT138T: module CNT138T (CLK,LOAD,CNT);
input CLK,LOAD; output[7:0] CNT ; reg[7:0] CNT; always @(posedge CLK ) begin
码输出显示可由 LED[3:0]输出在数码管 LEDA 显示;HIGH 为高八度音指示,可由发光管指示。 (6)实验内容 4:在模块 MUSIC 填入新的乐曲。针对新乐曲的曲长和节拍情况改变模块 CNT138T 的
计数长度(注意,一个计数值就是一个 1/4 拍)。 (7)实验内容 5:争取可以在一个 ROM 装上多首歌曲,可手动或自动选择歌曲。 (8)实验内容 6:根据此项实验设计一电子琴,有 16 个键。用 4X4 键盘,程序可参考实验 4-19。 (9)实验内容 7:为以上的电子琴增加一到两个 RAM,用以记录弹琴时的节拍,音符和对应的分频
② 音符的持续时间需根据乐曲的速度及每个音符的节拍数来确定,图 1-1 中模块 F_CODE 的功能首先 是为模块 SPKER(11 位分频器)提供决定所发音符的分频预置数,而此数在 SPKER 输入口停留的时间即 为此音符的节拍周期。模块 F_CODE 是乐曲简谱码对应的分频预置数查表电路,每一音符的停留时间则由 音乐节拍和音调发生查表模块 MUSIC 中简谱码和工作时钟 inclock 的频率决定,在此为 4Hz。这 4Hz 频率 来自分频模块 FDIV,模块 MUSIC 是一个 LPM_ROM。它的输入频率来自锁相环 PLL20 的 2kHz 输出频率。 而模块 F_CODE 的 14 个值的输出由对应于 MUSIC 模块输出的 q[3..0]及 4 位输入值 INX[3..0]确定,而 INX[3..0]最多有 16 种可选值。输向模块 F_CODE 中 INX[3..0]的值在 SPKER 中对应的输出频率值与持续的 时间由模块 MUSIC 决定。
○6 key 模块是板子上的键盘,其实是一个译码电路,输入端 key 不同的值输出端都有相应的值与其
的对应,其中 K 端是为了选择高低音而设置的,当 K 等于 1 时,输出的是高音,反之低音。
○7 顶层图:
图 1-1
三、实验内容:
(3)实验内容 1:定制音符数据 ROM MUSIC。该 ROM 中对应“梁祝”乐曲的音符数据已列于例 4-12 中。注意该例数据表中的数据位宽、深度和数据的表达类型。此外,为了节省篇幅,例中的数据都横排了, 实际程序中必须以每一分号为一行来展开。最后对该 ROM 进行仿真,确认例 4-12 中的音符数据已经进入 ROM 中。图 4-39 是利用 Quartus II 的在系统存储器读写编辑器(In-System Memory Content Editor)读取 FPGA 内 MUSIC ROM 中的数据,请与例 4-12 的数据比较。
3、KEYBOARD :
module KEYBOARD (CLK,A,B,R);
input CLK; input [3:0] A; output [3:0] B; output [3:0] R;
reg [1:0] C ;
reg [3:0] R,B ;
always @ (posedge CLK) begin
8'B1011_1110 : R=4'H4; 8'B1011_1101 : R=4'H5;
8'B1011_1011 : R=4'H6; 8'B1011_0111 : R=4'H7;
8'B1101_1110 : R=4'H8; 8'B1101_1101 : R=4'H9;
8'B1101_1011 : R=4'HA; 8'B1101_0111 : R=4'HB;
mode=1; else mode=0; end always@(posedge clk ) begin case(mode) 0: case (key)
8'b10111111: begin count=4'h7;end 8'b11011111: begin count=4'h6;end 8'b11101111: begin count=4'h5;end 8'b11110111: begin count=4'h4;end 8'b11111011: begin count=4'h3;end 8'b11111101: begin count=4'h2;end 8'b11111110: begin count=4'h1;end default: count=0; endcase 1: case (key) 8'b01111111: begin count=4'hf;end 8'b10111111: begin count=4'he;end 8'b11011111: begin count=4'hd;end 8'b11101111: begin count=4'hc;end 8'b11110111: begin count=4'hb;end 8'b11111011: begin count=4'ha;end 8'b11111101: begin count=4'h9;end 8'b11111110: begin count=4'h8;end default: count=0; endcase endcase end endmodule
编号:
EDA 综合设wenku.baidu.com实验报告
课 题: 专 业: 学生姓名: 学 号:
硬件乐曲演奏电路设计
年月日
一、概述:
硬件乐曲演奏电路顶层模块图如图 1-1 所示,电路图由 11 个子模块组成,能够实现: (1) 梁祝乐曲的自动演奏;(2)键盘弹奏歌曲;(3)ROM 中能存两首歌曲,并能手动选歌。
二、实验原理:
○4 模块 DIR 是一个二选一选择器,可以根据输入端 dir 的值决定输出端 dirout 的选择,实现键盘弹
奏和自动播放之间的切换 dir 等于 1 时,dirout 选择 keyboard 作为输出,即键盘弹奏,dir 等于 0 时,dirout 选择 music 作为输出,即自动播放。
○5 KEYBOARD 模块是 4x4 键盘,如下图所示:假设其两个 4 位口,A[3:0]和 B[3:0]都有上拉电阻。
终上所述,LOAD 的值决定了 CNT 从哪个地址开始计数,每首歌都有自己的首地址,如果 CNT 从哪首歌开始计数,就是选哪首歌来播放,所以 LOAD 有选歌的功能。
2、七段译码管:
3、DIR 选择器,只要 dir 等于 0,dirout 输出端就会选择 music 作为输出,如果 dirou 等于 1, dirout 就会选择 keyboard 作为输出,此部分可以作为键盘输入和自动播放之间的切换。
case (LOAD) 0: begin if(CNT<=138) CNT<=CNT+1; else CNT=0; end 1: begin if(CNT>=139&&CNT<=256) CNT<=CNT+1; else CNT=139; end endcase end endmodule
2、key: module key(clk,key,mode,count,k); input clk; input[7:0] key; input k; output[3:0] count; output[3:0] mode; reg mode; reg[3:0] count; always@(posedge clk) begin if(k!=0)
① 音符的频率可以由图 1-1 中的 SPKER 获得。 这是一个数控分频器。由其 CLK 端输入一具有较高 频率(1MHz)的时钟,通过 SPKER 分频后,经由 D 触发器构成的分频电路,由 SPK_KX 口输出。由于 直接从分频器中出来的输出信号是脉宽极窄的信号,为了有利于驱动扬声器,需另加一个 D 触发器分频以 均衡其占空比,但这时的频率将是原来的 1/2。SPKER 对 CLK 输入信号的分频比由输入的 11 位预置数 TN[10..0]决定。SPK_KX 的输出频率将决定每一音符的音调;这样,分频计数器的预置值 TN[10..0] 与输 出频率就有了对应关系,而输出的频率又与音乐音符的发声有对应关系,例如在 F_CODE 模块中若取 TN[10..0]=11'H40C,将由 SPK_KX 发出音符为“3”音的信号频率。
4、DIRP 选择器,和 DIR 选择器一样,可以根据 dirp 的值选择不同的输出,如果 dirp 等于 1,则选择 keyboard 作为输出,如果 dirp 等于 0,则选择 key 作为输出。此部分可以作 为 4x4 键盘输入和板子上的键盘输入之间的转换。
5、F_CODE:INX 为输入端,CODE 为译码,输出给七段译码馆,H 为高低音显示,TO 为 译码,将输入译成 SPKER 需要的数据。
(4)实验内容 2:对图 4-37 中所有模块,分别仿真测试,特别是通过联合测试模块 F_CODE 和 SPKER, 进一步确认 F_CODE 中的音符预置数的精确性,因为这些数据决定了音准。可以根据图 4-38 的数据进行核 对,如果有偏差要修正。
(5)实验内容 3:完成系统仿真调试和硬件验证。演奏发音输出口是 SPK。与演奏发音相对应的简谱
(2)制作锁相环: (3)依次制作各种模块 (4)生成顶层文件 (5)编译仿真 (6)设置引脚 (7)下载调试
五、仿真:
1、CNT138T: LOAD 若 LOAD 等于 0,则 CNT 会随着时钟从 0 加到 138,然后又从 0 开始加到 138,如 此循环。 此过程即为选第一首歌的过程。
若 LOAD 等于 1,则 CNT 会从 139 开始直到 255,又从 139 开始加到 255,如此循环。此过 程即为选第二首歌的过程。