当前位置:
文档之家› EDA技术实验 乐曲硬件演奏电路设计
EDA技术实验 乐曲硬件演奏电路设计
4、DIRP 选择器,和 DIR 选择器一样,可以根据 dirp 的值选择不同的输出,如果 dirp 等于 1,则选择 keyboard 作为输出,如果 dirp 等于 0,则选择 key 作为输出。此部分可以作 为 4x4 键盘输入和板子上的键盘输入之间的转换。
5、F_CODE:INX 为输入端,CODE 为译码,输出给七段译码馆,H 为高低音显示,TO 为 译码,将输入译成 SPKER 需要的数据。
○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 的数据比较。
(4)实验内容 2:对图 4-37 中所有模块,分别仿真测试,特别是通过联合测试模块 F_CODE 和 SPKER, 进一步确认 F_CODE 中的音符预置数的精确性,因为这些数据决定了音准。可以根据图 4-38 的数据进行核 对,如果有偏差要修正。
(5)实验内容 3:完成系统仿真调试和硬件验证。演奏发音输出口是 SPK。与演奏发音相对应的简谱
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)
○4 模块 DIR 是一个二选一选择器,可以根据输入端 dir 的值决定输出端 dirout 的选择,实现键盘弹
奏和自动播放之间的切换 dir 等于 1 时,dirout 选择 keyboard 作为输出,即键盘弹奏,dir 等于 0 时,dirout 选择 music 作为输出,即自动播放。
○5 KEYBOARD 模块是 4x4 键盘,如下图所示:假设其两个 4 位口,A[3:0]和 B[3:0]都有上拉电阻。
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
(2)制作锁相环: (3)依次制作各种模块 (4)生成顶层文件 (5)编译仿真 (6)设置引脚 (7)下载调试
五、仿真:
1、CNT138T: LOAD 若 LOAD 等于 0,则 CNT 会随着时钟从 0 加到 138,然后又从 0 开始加到 138,如 此循环。 此过程即为选第一首歌的过程。
若 LOAD 等于 1,则 CNT 会从 139 开始直到 255,又从 139 开始加到 255,如此循环。此过 程即为选第二首歌的过程。
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
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
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;
终上所述,LOAD 的值决定了 CNT 从哪个地址开始计数,每首歌都有自己的首地址,如果 CNT 从哪首歌开始计数,就是选哪首歌来播放,所以 LOAD 有选歌的功能。
2、七段译码管:
3、DIR 选择器,只要 dir 等于 0,dirout 输出端就会选择 music 作为输出,如果 dirou 等于 1, dirout 就会选择 keyboard 作为输出,此部分可以作为键盘输入和自动播放之间的切换。
码输出显示可由 LED[3:0]输出在数码管 LEDA 显示;HIGH 为高八度音指示,可由发光管指示。 (6)实验内容 4:在模块 MUSIC 填入新的乐曲。针对新乐曲的曲长和节拍情况改变模块 CNT138T 的
计数长度(注意,一个计数值就是一个 1/4 拍)。 (7)实验内容 5:争取可以在一个 ROM 装上多首歌曲,可手动或自动选择歌曲。 (8)实验内容 6:根据此项实验设计一电子琴,有 16 个键。用 4X4 键盘,程序可参考实验 4-19。 (9)实验内容 7:为以上的电子琴增加一到两个 RAM,用以记录弹琴时的节拍,音符和对应的分频
③ 模块 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 模块,“梁祝”乐曲就开始连续自然地演奏起来了。
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;
在应用中,当按下某键后,为了辨别和读取键信息,一种比较常用的方法是,向 A 口扫描输入一组分 别只含一个 0 的 4 位数据,如 1110,1101,1011 等。若有键按下,则 B 口一定会输出对应的数据, 这时,只要结合 A,B 口的数据,就能判断出键的位置。如当键 S0 按下,对于输入的 A=1110 时,那 么输出的 B=0111。于是{B,A}=0111_告
课 题: 专 业: 学生姓名: 学 号: