verilog课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
设计题目:基于FPGA的乐曲演奏电路设计
✧指导教师:蒋俊华
✧学院:物理与电子学院
✧专业:电子信息科学与技术
✧姓名:郭志勇
✧学号:10230*******
✧实验地点:特种功能实验室(实验室502)
摘要:本文根据层次化的设计思路并在EDA开发工具Quartus II 9.0 (32-Bit) 平台上,采用Verilog语言、原理图、定制LPM-ROM块以及实例化的设计方法,利用数控分频的原理实现了基于FPGA片上系统(本实验用的是康芯GW48系列EDA设备)乐曲演奏的设计。
关键词 FPGA,EDA,Verilog,数控分频器
一. 概述部分:
(1)设计所要实现的功能
能够很好的演奏出“梁祝”的谱子,将音乐通过实验箱上的喇叭播放出;演奏发音相对应的简谱码输出显示由在数码管5显示;高八度音指示由发光管D5指示
(2)设计所采用的基本思想
根据层次化的设计思路,可把乐曲硬件演奏电路分为3个模块,音乐节拍发生模块,音符译码电路模块,数控分频模块。
音乐节拍发生模块的设计:将编辑好的音符填入MIF文件中再定制LPM-ROM块将音符数据加载入ROM再通过计数器逐步计数rom块的地址来提取音符;音符译码电路模块、数控分频模块的设计:都是由verilog代码实例化生成
通过输入原理图的方法将各个模块连接起来生成一个block块的.qpf文件作为最终的顶层文件。
二.系统设计部分
(1)整个设计的组织结构
(2)各个子单元的设计思路
音乐节拍发生模块的设计:
LPM-ROM块该模块为音乐曲谱的存放块。其中设置了“梁祝”乐曲全部音符所对应的分频预置数。其利用LPM_ROM宏模块将共设定256个音符,每个音符宽度为4位。 Mif文件存放乐曲中的音符数据,它是利用LPM-ROM来实现的,将乐谱中相应的音符放在一个连续的地址上。它首先是编写音符数据文件,将乐谱中相应的音符存放在一个连续的地址上。因为1拍的时间定为1秒,提供的是4Hz的时钟频率(即1/4拍的整数倍),则需将这个音符存储在相应次数的连续几个地址上。.mif文件如下:
CNT138块这个计数器的计数频率选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒,四四拍的4分音符持续时间。例如,地址发生器在以下的Verilog逻辑描述中,“梁祝”乐曲的第一个音符为“3”,此音在逻辑中停留了4个时钟节拍,即1秒时间。模块程序如下:
module cnt138t(clk,cnt);
input clk;
output [7:0]cnt;
reg [7:0]cnt;
always @ (posedge clk)
begin
if(cnt==8'b10001010) cnt<=8'b00000000;
else cnt<=cnt+1;
end
endmodule
音符译码电路模块的设计:
音符译码电路模块即分频预置数模块是乐曲简谱码对应的分频预置数查表电路。它提供了每个音符所对应的分频预置数,即给数控分频模块提供计数初值,这里以“梁祝”乐曲为例,列出了在这个乐曲中所用到的13个音符的分频预置数。在这个模块的Verilog逻辑描述中设置了“梁祝”乐曲中全部音符所对应的分频预置数,共13个,每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定,在此为4Hz。这13个值的输出由计数模块的index[3..0]确定,而index[3..0]的值又由地址发生器模块的输出q[3..0]的输出值和持续时间决定。程序如下:
module tonetaba(index,code,high,tone);
input [3:0]index;
output [3:0]code;
output [10:0]tone;
output high;
reg [3:0]code;
reg [10:0]tone;
reg high;
always @ (index)
begin
case(index)
4'b0000: begin tone<=11'b11111111111; code<=4'b0000; high<=1'b0; end
4'b0001: begin tone<=11'b01100000101; code<=4'b0001; high<=1'b0; end
4'b0010: begin tone<=11'b01110010000; code<=4'b0010; high<=1'b0; end
4'b0011: begin tone<=11'b10000001100; code<=4'b0011; high<=1'b0; end
4'b0101: begin tone<=11'b10010101101; code<=4'b0101; high<=1'b0; end
4'b0110: begin tone<=11'b10100001010; code<=4'b0110; high<=1'b0; end
4'b0111: begin tone<=11'b10101011100; code<=4'b0111; high<=1'b0; end
4'b1000: begin tone<=11'b10110000010; code<=4'b0001; high<=1'b1; end
4'b1001: begin tone<=11'b10111001000; code<=4'b0010; high<=1'b1; end
4'b1010: begin tone<=11'b11000000110; code<=4'b0011; high<=1'b1; end