EDA 课程设计报告
简易电子琴设计
小组成员姓名:
专业班级:
指导教师:
起止日期:2011.09.01~2011.12.30
EDA 课程设计任务书
一、设计题目:简易电子琴设计
二、设计目的
1、掌握可编程逻辑器件的基本原理及利用 EDA 开发工具 QuartusII 进行可编程逻辑器件
设计的方法;
2、掌握用 VHDL 语言设计节拍、分频系数、音符产生电路、音符显示数据产生电路以及可
控分频电路的方法;
3、熟练掌握可编程逻辑器件的原理图层次化设计方法;
4、掌握利用 QuartusII 进行软件仿真及对可编程逻辑器件进行硬件下载的方法。
三、设计任务及要求
利用 FPGA 器件和 VHDL 语言设计一个音乐播放电路,下载芯片:Altera 的 MAXII 系列 EPM240/570。
具体要求:
1、能够实现乐曲的播放功能,同时在音乐播放时能够显示音的高低;
2、播放和演奏功能可以通过按键切换。
四、指导教师评语及学生成绩
指导教师评语:
成绩
指导教师(签字):
年
月
日
1
一 实训目的
1、掌握基本的 VHDL 语言。
2、理解音乐播放电路的设计方案。
3、掌握用 VHDL 语言设计节拍与音符产生电路。
4、掌握用 VHDL 语言设计分频系数、音符显示数据产生电路。
5、掌握用 VHDL 语言设计可控分频电路。
6、学会用 FPGA 器件和 VHDL 语言设计一个简易电子琴。
二 实训内容及要求
利用 FPGA 器件和 VHDL 语言设计一个音乐播放电路,包括节拍、分频系数、音符
产生电路、音符显示数据产生电路以及可控分频电路。具体要求:
1、能够实现乐曲的播放功能,同时在音乐播放时能够显示音的高低;
2、播放和演奏功能可以通过按键切换;
3、用 QuartusII 进行软件仿真及对可编程逻辑器件进行硬件下载
4、分组讨论,独立撰写项目报告,提交 Word 及设计电子文档。
三 实训报告正文
1、设计规划:
根据系统设计要求,系统设计采用自上而下模块化设计方法,系统的整体组装设
计原理图如下图所示,它由 4Hz 时钟信号模块、控制电路模块(节拍产生模块和
音符产生模块)、分频系数、音符显示数据产生模块和可控分频模块四部分组成。
2、各模块的原理及其程
(1)、4Hz 时钟信号模块
输出 4Hz 的时钟信号。VHDL 程序(div_f)如下:
library ieee;
use ieee.std_logic_1164.all;
entity div_f is
port(clk
:in std_logic;
2
miao_out
:out std_logic);
end div_f;
architecture miao of div_f is
begin
p1:process(clk)
variable cnt:integer range 0 to 6249999;
variable ff:std_logic;
begin
if clk'event and clk='1' then
if cnt<6249999 then
cnt:=cnt+1;
else
cnt:=0;
ff:=not ff;
end if;
end if;
miao_out<=ff;
end process p1;
end
miao;
(2)、控制电路模块(节拍产生模块和音符产生模块)
控制电路模块的输入时钟信号与 4Hz 时钟信号模块相连,Index 表示音符信
息,由于 Index 取值为 1—15,故用四进制信号即可表示。此控制电路模块有两
个进程,CNT8 进程描述的是一个时序逻辑电路计数器(节拍产生模块),Search
进程描述的是一个组合逻辑译码电路(音符产生模块),两模块由 Counter 信号
相连。VHDL 程序(aaa)如下:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
ENTITY aaa IS
PORT(clk:IN
STD_LOGIC;
Index:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END;
ARCHITECTURE one OF aaa IS
SIGNAL Counter:INTEGER RANGE 0 TO 138;
SIGNAL DateOut:INTEGER RANGE 0 TO 15;
BEGIN
CNT8:PROCESS(clk, Counter)
BEGIN
3
IF Counter=138 THEN
Counter<=0;
ELSIF (clk'EVENT AND clk='1') THEN
Counter<=Counter+1;
END IF;
END PROCESS;
Search: PROCESS(Counter)
BEGIN
CASE Counter IS
WHEN 00=>DateOut<=3; WHEN 01=>DateOut<=3;
WHEN 02=>DateOut<=3; WHEN 03=>DateOut<=3;
WHEN 04=>DateOut<=5; WHEN 05=>DateOut<=5;
WHEN 06=>DateOut<=5; WHEN 07=>DateOut<=6;
WHEN 08=>DateOut<=8; WHEN 09=>DateOut<=8;
WHEN 10=>DateOut<=8; WHEN 11=>DateOut<=9;
WHEN 12=>DateOut<=6; WHEN 13=>DateOut<=8;
WHEN 14=>DateOut<=5; WHEN 15=>DateOut<=5;
WHEN 16=>DateOut<=12;WHEN 17=>DateOut<=12;
WHEN 18=>DateOut<=12;WHEN 19=>DateOut<=15;
WHEN 20=>DateOut<=13;WHEN 21=>DateOut<=12;
WHEN 22=>DateOut<=10;WHEN 23=>DateOut<=12;
WHEN 24=>DateOut<=9; WHEN 25=>DateOut<=9;
WHEN 26=>DateOut<=9; WHEN 27=>DateOut<=9;
WHEN 28=>DateOut<=9;WHEN 29=>DateOut<=9;
WHEN 30=>DateOut<=9;WHEN 31=>DateOut<=9;
WHEN 32=>DateOut<=9;WHEN 33=>DateOut<=9;
WHEN 34=>DateOut<=9;WHEN 35=>DateOut<=10;
WHEN 36=>DateOut<=7;WHEN 37=>DateOut<=7;
WHEN 38=>DateOut<=6;WHEN 39=>DateOut<=6;
WHEN 40=>DateOut<=5;WHEN 41=>DateOut<=5;
WHEN 42=>DateOut<=5;WHEN 43=>DateOut<=6;
WHEN 44=>DateOut<=8;WHEN 45=>DateOut<=8;
WHEN 46=>DateOut<=9;WHEN 47=>DateOut<=9;
WHEN 48=>DateOut<=3;WHEN 49=>DateOut<=3;
WHEN 50=>DateOut<=8;WHEN 51=>DateOut<=8;
WHEN 52=>DateOut<=6;WHEN 53=>DateOut<=5;
WHEN 54=>DateOut<=6;WHEN 55=>DateOut<=8;
WHEN 56=>DateOut<=5;WHEN 57=>DateOut<=5;
4
WHEN 58=>DateOut<=5;WHEN 59=>DateOut<=5;
WHEN 60=>DateOut<=5;WHEN 61=>DateOut<=5;
WHEN 62=>DateOut<=5;WHEN 63=>DateOut<=5;
WHEN 64=>DateOut<=10;WHEN 65=>DateOut<=10;
WHEN 66=>DateOut<=10;WHEN 67=>DateOut<=12;
WHEN 68=>DateOut<=7;WHEN 69=>DateOut<=7;
WHEN 70=>DateOut<=9;WHEN 71=>DateOut<=9;
WHEN 72=>DateOut<=6;WHEN 73=>DateOut<=8;
WHEN 74=>DateOut<=5;WHEN 75=>DateOut<=5;
WHEN 76=>DateOut<=5;WHEN 77=>DateOut<=5;
WHEN 78=>DateOut<=5;WHEN 79=>DateOut<=5;
WHEN 80=>DateOut<=3;WHEN 81=>DateOut<=5;
WHEN 82=>DateOut<=3;WHEN 83=>DateOut<=3;
WHEN 84=>DateOut<=5;WHEN 85=>DateOut<=6;
WHEN 86=>DateOut<=7;WHEN 87=>DateOut<=9;
WHEN 88=>DateOut<=6;WHEN 89=>DateOut<=6;
WHEN 90=>DateOut<=6;WHEN 91=>DateOut<=6;
WHEN 92=>DateOut<=6;WHEN 93=>DateOut<=6;
WHEN 94=>DateOut<=5;WHEN 95=>DateOut<=6;
WHEN 96=>DateOut<=8;WHEN 97=>DateOut<=8;
WHEN 98=>DateOut<=8;WHEN 99=>DateOut<=9;
WHEN 100=>DateOut<=12;WHEN 101=>DateOut<=12;
WHEN 102=>DateOut<=12;WHEN 103=>DateOut<=10;
WHEN 104=>DateOut<=9;WHEN 105=>DateOut<=9;
WHEN 106=>DateOut<=10;WHEN 107=>DateOut<=9;
WHEN 108=>DateOut<=8;WHEN 109=>DateOut<=8;
WHEN 110=>DateOut<=6;WHEN 111=>DateOut<=5;
WHEN 112=>DateOut<=3;WHEN 113=>DateOut<=3;
WHEN 114=>DateOut<=3;WHEN 115=>DateOut<=3;
WHEN 116=> DateOut<=8;WHEN 117=>DateOut<=8;
WHEN 118=>DateOut<=8;WHEN 119=>DateOut<=8;
WHEN 120=>DateOut<=6;WHEN 121=>DateOut<=8;
WHEN 122=>DateOut<=6;WHEN 123=>DateOut<=5;
WHEN 124=>DateOut<=3;WHEN 125=>DateOut<=5;
WHEN 126=>DateOut<=6;WHEN 127=>DateOut<=8;
WHEN 128=>DateOut<=5;WHEN 129=>DateOut<=5;
WHEN 130=>DateOut<=5;WHEN 131=>DateOut<=5;
WHEN 132=>DateOut<=5;WHEN 133=>DateOut<=5;
5
WHEN 134=>DateOut<=5;WHEN 135=>DateOut<=5;
WHEN 136=>DateOut<=0;WHEN 137=>DateOut<=0;
WHEN 138=>DateOut<=0;
WHEN OTHERS=>DateOut<=0;
END CASE;
END PROCESS;
Index<=CONV_STD_LOGIC_VECTOR(DateOut,4);
(3)、分频系数、音符显示数据产生模块
END;
在设计文件中,Index 为四位二进制信号,表示输入音符信息,CODE 为四位
二进制信号,是提供给外围数码管的用于显示简谱音符符号的数据,LED 是提供
给外围 LED 的用于显示高低音的数据,Tone 是供给可控分频模块的分频系数。
VHDL 程序(aaa)如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ToneTaba IS
PORT ( Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ;
CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO
0) ;
LED : OUT STD_LOGIC;
Tone : OUT STD_LOGIC_VECTOR (10 DOWNTO 0) );
END;
ARCHITECTURE one OF ToneTaba IS
BEGIN
Search : PROCESS(Index)
BEGIN
CASE Index IS
WHEN "0000" => Tone<="11111111111" ; CODE<="0000"; LED <='0';
WHEN "0001" => Tone<="01001101000" ; CODE<="0001"; LED <='0';
WHEN "0010" => Tone<="01100000101" ; CODE<="0010"; LED <='0';
WHEN "0011" => Tone<="01110010000" ; CODE<="0011"; LED <='0';
WHEN "0100" => Tone<="01111010000" ; CODE<="0100"; LED <='0';
WHEN "0101" => Tone<="10001000100" ; CODE<="0101"; LED <='0';
WHEN "0110" => Tone<="10010101101" ; CODE<="0110"; LED <='0';
WHEN "0111" => Tone<="10100001010" ; CODE<="0111"; LED <='0';
WHEN "1000" => Tone<="10101011100" ; CODE<="0001"; LED <='1';
WHEN "1001" => Tone<="10110000010" ; CODE<="0010"; LED <='1';
WHEN "1010" => Tone<="10111001000" ; CODE<="0011"; LED <='1';
6
WHEN "1011" => Tone<="10111101000" ; CODE<="0110"; LED <='1';
WHEN "1100" => Tone<="11000100010" ; CODE<="0101"; LED <='1';
WHEN "1101" => Tone<="11001010110" ; CODE<="0110"; LED <='1';
WHEN "1110" => Tone<="11010000100" ; CODE<="0111"; LED <='1';
WHEN "1111" => Tone<="11010011010" ; CODE<="0001"; LED <='1';
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
END
(4)、可控分频模块
可控分频模块的功能是用一个可控分频电路来产生播放音乐所需的每个音,
其实质是设计一个可预置数的计数器,预置数就是分频系数。可控分频模块是一
个具有 12 预分频和 2 后分频的可控分频电路,输入时钟 clk 频率选 12MHz,输
入时钟先经 12 分频,为了使输出信号 SpkS 具有较高的驱动功率,可控分频后再
经过 2 分频,使输出信号 SpkS 具有 50%的占空比,从而具有较高的驱动频率。
VHDL 程序(Speakera)如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY Speakera IS
PORT ( clk : IN STD_LOGIC;
Tone : IN STD_LOGIC_VECTOR (10 DOWNTO 0);
SpkS : OUT STD_LOGIC );
END;
ARCHITECTURE one OF Speakera IS
SIGNAL PreCLK, FullSpkS : STD_LOGIC;
BEGIN
DivideCLK : PROCESS(clk)
VARIABLE Count4 : STD_LOGIC_VECTOR (3 DOWNTO 0) ;
BEGIN
IF clk'EVENT AND clk = '1'
THEN
if Count4>11 THEN PreCLK <= '1'; Count4 := "0000";
else Count4 := Count4 + 1; PreCLK <= '0';END IF;
END IF;
END PROCESS;
GenSpkS : PROCESS(PreCLK, Tone)
VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0);
BEGIN
7