1.89k likes | 2.08k Views
学 习 情 境 三: 简易电子琴. 主要内容. A. 项目任务 B. 项目目标 C. 实施步骤 D. 相关知识 E. 评价与总结. 掌握基本的 VHDL 语言。用 VHDL 语言设计乐音的节拍与音符产生电路;用 VHDL 语言设计分频系数、音符显示数据产生电路;用 VHDL 语言设计可控分频器电路;用 VHDL 语言设计琴键输入电路。理解简易电子琴总体设计方案,把音乐播放与演奏电路总装成简易电子琴。. A. 项目任务.
E N D
学 习 情 境 三:简易电子琴 Electronic Design Automation
主要内容 • A.项目任务 • B.项目目标 • C.实施步骤 • D.相关知识 • E.评价与总结 Electronic Design Automation
掌握基本的VHDL语言。用VHDL语言设计乐音的节拍与音符产生电路;用VHDL语言设计分频系数、音符显示数据产生电路;用VHDL语言设计可控分频器电路;用VHDL语言设计琴键输入电路。理解简易电子琴总体设计方案,把音乐播放与演奏电路总装成简易电子琴。掌握基本的VHDL语言。用VHDL语言设计乐音的节拍与音符产生电路;用VHDL语言设计分频系数、音符显示数据产生电路;用VHDL语言设计可控分频器电路;用VHDL语言设计琴键输入电路。理解简易电子琴总体设计方案,把音乐播放与演奏电路总装成简易电子琴。 A. 项目任务
任务1.1目标:掌握基本的VHDL语言;理解音乐播放电路设计方案。掌握用VHDL语言设计节拍与音符产生电路;掌握用VHDL语言设计分频系数、音符显示数据产生电路;掌握用VHDL语言设计可控分频器电路。设计结果:原理图与原程序、电路仿真图、能在实训系统上播放悦耳动听的音乐。任务1.1目标:掌握基本的VHDL语言;理解音乐播放电路设计方案。掌握用VHDL语言设计节拍与音符产生电路;掌握用VHDL语言设计分频系数、音符显示数据产生电路;掌握用VHDL语言设计可控分频器电路。设计结果:原理图与原程序、电路仿真图、能在实训系统上播放悦耳动听的音乐。 B.项目目标 任务1.2目标:掌握键盘电路设计、键盘输入去抖动方法;掌握层次电路设计方法;初步具备独立的VHDL编程能力。设计结果:原理图与原程序、电路仿真图、能在实训系统上弹奏曲子或播放悦耳动听的音乐。
任务3.1实施步骤 • 一、资讯 • 1.明确任务 • 一般来说,所有乐音有四个基本要素——“音的长短”(决定节拍)、“音的高低”(频率决定)、“音的强度”、“音色”。而其中最重要的是 “音的长短” 和 “音的高低”。为了简化设计,本任务设计的音乐播放电路只考虑音的最重要的两个方面: “音的长短” 和“音的高低”,忽略音的强度和音色。要求音乐播放电路最少能连续循环播放一首歌曲,在此基础上可再做进一步的扩展。 • 为实现播放 “音的长短” 和 “音的高低” ,可根据乐谱用一个控制电路模块产生 “音的长短” 和 “音的高低”信号,控制电路模块包括一个节拍产生子模块(控制“音的长短”)与音符产生子模块(控制“音的高低”)。 用一个分频系数、音符显示数据产生模块把音符信号转换为分频系数、音符显示数据和高低音显示电平。用一个可控分频模块根据分频系数产生不同频率信号驱动喇叭或蜂鸣器播放音乐。 Electronic Design Automation
任务3.1实施步骤 • 电路输入是两路时钟信号:一路作为可控分频电路模块的输入时钟,经可控分频电路模块分频后,得到各种所需的乐音信号。另一路作为控制电路模块的输入时钟,用来产生节拍。这两路时钟信号的频率根据具体的实验条件和所选歌曲可有所不同。 • 电路的输出有:一路一线是乐音信号输出,用来驱动外接喇叭或蜂鸣器播放音乐;一路四线用来驱动外接的数码管,显示播放的音符简谱符号;一路一线用来驱动外接的一个LED,播放高音时发光。 • 2.查阅资料 • 到图书馆、互联网查找有关资料。前人发表的有关音乐电路的文章主要散见在学术期刊和有关网页上。可用乐曲播放电路、音乐发生器等关键词查找。另外,要理解这些文章所介绍的原理,还要具有音乐谱、乐音频率的有关知识。 Electronic Design Automation
任务3.1实施步骤 • 二、计划 • 音乐电路是模仿人歌唱的电路,故可用人歌唱作为原型来分析设计本任务的总体方案。人通过声带振动发出声音,声带振动频率不同发出不同声音。故在用数字电路来模仿时,用一个控制电路,实现声带振动功能,控制音符信号的产生;用一个电路把音符信号转换为可控分频模块可用的分频系数;可控分频电路在分频系数作用下产生不同频率信号来驱动外接喇叭或蜂鸣器播放音乐。 • 控制电路模块根据歌谱控制可控分频电路模块按照一定节拍在不同时间发出不同的乐音。而控制电路模块应该分为两个子模块,一个用于产生节拍,称节拍产生模块;另一个用于根据歌谱控制可控分频电路模块在不同时间发出不同的乐音,称音符产生模块。音乐电路是连续循环播放的,故控制电路模块的核心部分——节拍产生模块是一个计数器,每个状态持续的时间是需播放的所有音的音长的最小公因数,比如是一个十六分音符时值,具体时间长度应根据需播放的歌曲而定。这样,每个音符持续的时间是每个状态持续的时间的整数倍,故占据整数倍个状态。具体占据状态的个数要根据每个音的音长来决定。控制电路的计数器的模即状态数,可由需播放歌曲的各个音所占据状态个数累加而得。例如,一首用于播放“梁祝”乐曲的音乐电路的控制电路的计数器的模是139。节拍产生电路的计数器是用来产生节拍定的,音符产生模块则将节拍产生电路的计数器的状态翻译成对应的音符,如需播放的歌曲中所用到的音符为9~16个,则音符产生模块的输出信号应有四位,其他情况依此类推。 Electronic Design Automation
任务3.1实施步骤 • 控制电路模块只是根据歌谱产生控制可控分频模块按照一定节拍在不同时间发出不同乐音的音符信号。控制电路模块要具体控制可控分频模块,还要把音符信号转换为分频系数作为可控分频模块的输入信号,也要根据音符信号决定提供给外围数码管的用于显示简谱音符符号的数据和提供给外围LED的用于显示高低音的数据,这就需要另一个模块——分频系数、LED数据产生模块。分频系数、LED数据产生模块根据音符产生模块输出的音符信息,产生每个时刻提供给可控分频模块的分频系数、提供给外围数码管的用于显示谱音符符号的数据和提供给外围LED的用于显示高低音的数据。 • 可控分频模块根据分频系数产生不同频率信号驱动喇叭或蜂鸣器播放音乐。 • 播放音乐电路设计总体参考方案如图3-1所示,其中的两个时钟频率的取值将在下面介绍实施的部分做分析。 Electronic Design Automation
任务3.1实施步骤 • 。 图3-1播放电路总体方案 Electronic Design Automation
任务3.1实施步骤 • 三、决策 • 本音乐电路设计重点在控制电路模块和可控分频模块设计,下面讨论这两个模块以及顶层模块的设计方案的选择。 • 1、控制电路模块(节拍产生模块与音符产生模块)设计方案的选择 • 节拍产生模块是一个计数器,可采用通常的方法设计。 • 音符产生模块的输入信号是节拍产生模块输出的计数值,输出信号是表示音符的音符序号。在节拍产生模块输出的计数值变化范围不大并且音符产生模块的输出数值不需灵活改变时,可用VHDL语句直接来描述音符产生模块。在节拍产生模块输出的计数值变化范围较大或音符产生模块的输出数值需灵活改变时,可使用LPM_ROM来存储对应于不同计数值的音符序号。 • 2、可控分频模块设计方案的选择 • (1)等占空比和非等占空比方案选择 • 可控分频电路按输出时钟的占空比来分,有等占空比和非等占空比两类方案。为了得到足够驱动蜂鸣器的功率,采用等占空比输出的可控分频电路方案。 Electronic Design Automation
任务3.1实施步骤 • (2)偶数分频、整数分频方案的选择 • 常见的分频电路有偶数分频、奇数分频和整数分频电路,本任务从原理来看,既有偶数分频又有奇数分频,故应属于整数分频电路。非等占空比的偶数分频、奇数分频电路有统一的设计方法并且比较简单,但等占空比的偶数分频、奇数分频电路设计方法则不相同。对于偶数(2N)的等占空比分频,可先做N非等占空比分频,再做2分频即可,比较简单。对于等占空比的奇数分频电路则不能采用这种方法,比较复杂。本任务可采取用较高频率(比如12 MHz)的输入时钟,这样分频比就比较大,故对于初学者,作为初步解决方案,可采用偶数分频比近似代替奇数分频比的方法,把整数分频电路变成偶数(2N)分频电路,用先做N非等占空比分频,再做2分频这种较简单的方法来设计;作为提高,可采用比较复杂的真正的整数分频电路设计方法设计。 • 3.、VHDL输入设计法和原理图输入设计法的选择 • 在本任务中,底层模块采用VHDL语言设计较简单,顶层模块采用原理图设计与VHDL设计均可,我们采用原理图设计顶层电路。 Electronic Design Automation
任务3.1实施步骤 • 四、实施 • 下面以用于播放“梁祝”乐曲的音乐电路为例,对音乐电路各模块的实施进行进一步的设计实现。 • (一)控制电路模块 • 控制电路模块包含节拍产生模块和音符产生模块两个子模块,合写成一个文件。 • 1、节拍产生模块设计分析 • 根据以上分析,此模块为一个计数器,现在需进一步决定计数器的模与输入时钟频率。 • 根据乐曲“梁祝”简谱,见图3—2,此乐曲以四分音符为一拍,四拍为一节,所有音的音长最小公因数是一个十六分音符时值,所以,以十六分音符时值作为一个状态持续时间,把乐曲“梁祝”中各个音符所占据状态个数累加而得知节拍产生模块计数器的模是139,其中最后体止符用了3个时间单位。 • 乐曲“梁祝”的简谱没有明确标出播放速度,根据经验设定1 min播放60拍,因此一拍持续时间即四分音符的时值为1s,一个状态持续时间即一个十六分音符时值为0.25 s。故节拍产生模块输入时钟周期为0.25s,频率为4Hz。 Electronic Design Automation
任务3.1实施步骤 图3-2 《梁祝化蝶》简谱 Electronic Design Automation
任务3.1实施步骤 • 2、音符产生模块设计分析 • 音符产生模块的功能是将节拍产生电路的计数器的值按照乐曲“梁祝”的简谱翻译成对应的音符。规定用Counter表示计数器的值,Index表示15个音符符号。播放乐曲“梁祝”需低音7个、中音7个与高音1个,共15个音符,用15个数字(Index)1—15来表示,则乐曲“梁祝”简谱的15个音符与数字(Index)的对应关系见表3-1。 • 表3-1 乐曲“梁祝”简谱音符与数字对应关系 Electronic Design Automation
任务3.1实施步骤 见表3-2 音符产生模块——计数器值与音符对应表 • 根据乐曲“梁祝”简谱可得其计数器值与音符对应关系,见表3-2。 Electronic Design Automation
任务3.1实施步骤 • 3、控制电路模块(节拍产生模块和音符产生模块)VHDL描述 • 控制电路模块的输入时钟信号与C1k4Hz相连;Index表示音符信息,因为Index取值为1 ~15,故为四位二进制信号。 • 此控制电路模块VHDL描述有两个进程,CNT8进程描述的是一个时序逻辑电路计数器(节拍产生模块),Search进程描述的是一个组合逻辑译码电路(音符产生模块),两模块由Counter信号相连,这是一个数字系统的控制模块描述。具体程序描述如下: 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; Electronic Design Automation
任务3.1实施步骤 • 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 • IF Counter=138 THEN • Counter<=0; • ELSIF (clk'EVENT AND clk='1') THEN • Counter<=Counter+1; • END IF; • END PROCESS; Electronic Design Automation
任务3.1实施步骤 • 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; Electronic Design Automation
任务3.1实施步骤 • 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; • 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; Electronic Design Automation
任务3.1实施步骤 • 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; Electronic Design Automation
任务3.1实施步骤 • 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; • 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); • END; Electronic Design Automation
任务3.1实施步骤 • 4、仿真图 • 图3-3是控制电路模块在Quartus软件中的仿真图,其中四位二进制数Index用十进制表示。 图3-3 控制电路模块 Electronic Design Automation
任务3.1实施步骤 • (二) 分频系数、音符显示数据产生模块 • 1、设计分析 • 此模块的功能是产生提供给可控分频模块的分频系数、提供给外围数码管和外围LED的数据。乐曲“梁祝”是F调,其音符对应的频率数据见表3-3,又因为可控分频模块的输入时钟设为12 MHz,可控分频模块设计有12预分频和2后分频,经12预分频和2后分频后的频率为500 000 Hz,故供给可控分频模块的分频系数Tone =211 -500 000/f,又考虑到最大分频系数为1397,其二进制表示是11010011010,故可控分频模块的计数器为十一位二进制计数器。可得音符信号对应的分频系数、音符显示数据和高低音指示电平见表3-3 Electronic Design Automation
任务3.1实施步骤 表3-3 音符信号对应的分频系数、音符显示数据和高低音指示电平 Electronic Design Automation
任务3.1实施步骤 • 2、设计文件VHDL描述 • 对于简单的组合逻辑模块的VHDL描述,最常用的方法是应用CASE语句或IF语句来描述。在设计文件中: • Index为四位二进制信号,表示输入音符信息; • CODE为四位二进制信号,是提供给外围数码管的用于显示简谱音符符号的数据; • LED是提供给外围LED的用于显示高低音的数据; • Tone是供给可控分频模块的分频系数。 Electronic Design Automation
任务3.1实施步骤 • 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'; Electronic Design Automation
任务3.1实施步骤 • 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'; • 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; Electronic Design Automation
任务3.1实施步骤 • 3、仿真图 • 图3-4是分频系数、音符显示数据产生模块在Quartus软件中的仿真图,其中CODE用十进制(总线形式)表示简谱音符符号的数据,Index用二进制(总线形式)表示输入音符信息、Tone用二进制(总线形式)表示分频系数。 图3-4 分频系数、音符显示数据产生模块仿真图 Electronic Design Automation
任务3.1实施步骤 • (三) 可控分频模块 • 1、设计分析 • 此模块的功能是用一个可控分频电路来产生播放音乐所需的每个音。其实质是设计一个可预置数的计数器,预置数就是分频系数。 • 作为初步解决方案,本任务采用偶数分频近似代替奇数分频的方法,把整数分频电路变成偶数分频电路来设计。可控分频模块是一个具有12预分频和2后分频的可控分频电路。可控分频模块的输入时钟clk频率选12 MHz,为了使可控分频模块分频系数取值范围比较合适,输入时钟先经12分频,同时为了使输出信号SpkS具有较高的驱动功率,可控分频后再经2分频,使输出信号 SpkS具有50%的占空比,从而具有较高的驱动功率。 • 2、设计文件VHDL描述 Electronic Design Automation
任务3.1实施步骤 • 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) --12分频计数器 • 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; Electronic Design Automation
任务3.1实施步骤 • GenSpkS : PROCESS(PreCLK, Tone)-- 11位可预置计数器,非等占空比分频电路 • VARIABLE Count11 : STD_LOGIC_VECTOR (10 DOWNTO 0); • BEGIN • IF PreCLK'EVENT AND PreCLK = '1' THEN • IF Count11 = 16#7FF# THEN Count11 := Tone ; FullSpkS <= '1'; • ELSE Count11 := Count11 + 1; FullSpkS <= '0'; END IF; • END IF; • END PROCESS; • DelaySpkS : PROCESS(FullSpkS)--将输出再2分频,等占空比频电路,故整个电路构成等占空比频电路,使扬声器有足够功率发音 • VARIABLE Count2 : STD_LOGIC; • BEGIN • IF FullSpkS'EVENT AND FullSpkS = '1' THEN • Count2 := NOT Count2; • IF Count2 = '1' THEN SpkS <= '1'; • ELSE SpkS <= '0'; END IF; • END IF; • END PROCESS; • END; Electronic Design Automation
任务3.1实施步骤 • 3、仿真图 • 图3-5是可控分频模块在Quartus软件中的仿真图。其中clk输入频率为12M,由于频率太大,显示的是一条黑带,Tone是用二进制(总线形式)表示的分频系数,Spks是可控分频模块输出音频信号。 图3-5 可控分频模块仿真图 Electronic Design Automation
任务3.1实施步骤 • (四) 播放电路顶层模块设计 • 播放电路顶层模块用原理图输入法设计。把以上各子模块在Quartus创建图元,新建一个原理图编辑文件,然后把创建的图元组装起来构成一个完整的电路进行编译,仿真。 • 1、播放电路顶层原理图输入描述。 图3-6 播放电路原理图输入 Electronic Design Automation
任务3.1实施步骤 • 2、播放电路仿真图 图3-7 播放电路仿真图 Electronic Design Automation
任务3.1实施步骤 • 五、检查 • 分别编译各底层模块和顶层电路,并分别仿真底层模块和顶层电路。通过后,应将源代码下载到硬件中做最后的验证。 • 六、评估 • 对本次设计进行评估,可尝试更好的方案、方法。写出设计报告,设计报告应包括所应用到的EDA方法及知识的总结。 Electronic Design Automation
任务3.2实施步骤 • 一、资讯 • 音乐演奏电路由琴键输入识别模块电路;分频系数、LED数据产生模块;可控分频模块电路构成。在音乐播放电路设计中我们已设计分频系数、LED数据产生模块;可控分频模块电路。所以设计音乐演奏电路重点在设计琴键输入识别模块电路;以及把音乐演奏电路与音乐播放电路总装成一个简易电子琴。 • 二、计划 • 设计一个琴键输入识别模块电路,产生歌谱的音符信号;改进分频系数、LED数据产生模块电路,设置音乐演奏与播放功能选择端;把音乐演奏电路与音乐播放电路总装成一个简易电子琴。 Electronic Design Automation
任务3.2实施步骤 • 三、决策 • 1. 琴键输入识别模块电路设计方案 • 琴键输入识别模块电路主要解决按键后产生相应的音符信号与键盘去抖动。音符信号产生用VHDL选择语句容易实现;键盘去抖动的方法有计数器、移位寄存器、D型触发器延时、采样型防抖微分电路四种,可选择一种完成去抖动设计 • 2.改进分频系数、LED数据产生模块电路 • 主要改进分频系数、LED数据产生模块电路,实现音乐演奏与播放功能选择 • 3.音乐演奏电路与音乐播放电路总装 • 把音乐演奏电路与音乐播放电路总装成简易电子琴,然后编译、仿真、下载。 • 四、实施 • 这个任务学生自己动手做,老师现场指导,学生在做中完成学习任务。下面给出演奏电路与简易电子琴参考设计方案。 • 1.演奏电路设计(参考) • 学生在方案实施过程中,可先设计一个琴键输入识别模块电路(注意键盘去抖动设计)。然后利用琴键输入识别模块电路,音乐播放电路中已设计好的分频系数、LED数据产生模块,可控分频模块组装音乐演奏电路顶层文件(原理图输入或VHDL设计输入均可)。演奏电路顶层设计文件,见图3-8。 Electronic Design Automation
任务3.2实施步骤 图3-8 演奏电路顶层设计文件 Electronic Design Automation
任务3.2实施步骤 • 2. 简易电子琴总装电路设计(参考) • 改进分频系数、LED数据产生模块电路设计,使其具有音乐播放与演奏选择功能。然后把各模块总装成一个简易电子琴电路如图3-9所示,仿真图如图3-10所示 图3-9 简易电子琴顶层设计文件 Electronic Design Automation
任务3.2实施步骤 图3-10 简易电子琴仿真 Electronic Design Automation
任务3.2实施步骤 • 五、检查 • 分别编译各底层模块和整个电路设计,并分别仿真控制电路模块和分频系数、LED数据产生模块。通过后,将源代码下载到硬件中做最后的验证。 • 六、评估 • 对本次设计进行评估,可尝试更好的方案、方法。写出设计报告,设计报告应包括所应用到的EDA方法及知识的总结。 Electronic Design Automation
D.相关知识 硬件描述语言VHDL 音乐知识
3.1 引言3.2 VHDL的基础知识3.3 VHDL结构体的描述方式3.4 结构体的子结构形式3.5 顺序语句和并发语句3.6 VHDL中的信号和信号处理3.7 元件例化3.8 配置 硬件描述语言VHDL--目录 Electronic Design Automation
3.1 引言 • VHDL的特点: • 1.支持多种设计方法和技术。 • 2.与工艺技术独立。 • 3.多层次描述能力。 • 4.标准化,易于共享和复用。 • VHDL程序的构件 • 实体 结构体 程序包 配置 库 • VHDL的版本:IEEE STD 1076.1987[LRM87] • IEEE STD 1076.1993[LRM93] Electronic Design Automation
3.2 VHDL的基础知识 Electronic Design Automation
实体 count clk count_out ena load clear data_in 3.2.1 VHDL程序的结构 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164 .ALL; USE IEEE.STD_LOGIC_ARITH .ALL; USE IEEE.STD_LOGIC _UNSIGNED.ALL; • 8位计数器 ENTITY counter IS PORT( data_in: IN INTEGER RANGE 0 TO 255; clk,ena,load,clear: IN STD_LOGIC; Count_out: OUT INTEGER RANGE 0 TO 255); END counter; Electronic Design Automation
8位计数器的功能描述:ARCHITECTURE behav_count OF counter IS SIGNAL counter_data: INTEGER RANGE 0 TO 255; BEGIN PROCESS( clk,clear,load ) BEGIN IF ( clear =‘0’ ) THEN counter_data=0; ELSIF ( clk ‘EVENT AND clk=‘1’ ) THEN IF ( load=‘1’ ) THEN counter_data <=data_in; ELSE IF ( ena=‘1’) THEN IF counter_data=255 THEN counter_data<=0; ELSE counter_data<=counter_data+1; ENDIF; ELSE counter_data<=counter_data; ENDIF; ENDIF; ENDIF; END PROCESS; count_out<=counter_data; END behav_count; 3.2.1 VHDL程序的结构 结 构 体 进 程 Electronic Design Automation
3.2.1 VHDL程序的结构 1 实体( ENTITY) 说明 ENTITY 实体名 IS [GENERIC ( 类属表 ) ;] [PORT ( 端口表 ) ;] [实体说明部分 ;] [BEGIN 实体语句部分 ;] END 实体名 ; (1)类属说明 GENERIC ( 端口名{,端口名}:类型名[:=初始值] {端口名{,端口名}:类型名[:=初始值]}); 例 GENERIC ( m :TIME :=3ns); Electronic Design Automation
3.2.1 VHDL程序的结构 (2) 端口说明 PORT ( 端口名{,端口名} : 方向 数据类型; : : 端口名{,端口名} : 方向 数据类型 ); 实 体 IN OUT 端口方向 INOUT BUFFER LINKAGE Electronic Design Automation