1、EDA技术及其应用,第4章 应用VHDL设计数字系统,项目1:电子琴的设计,设计目标:设计一个电子琴,具有8个按键,当按下某一个按键的时候,能够演奏8个音符之一: 1、2、3、4、5、6、7、H1 视频演示 知识点:熟练掌握计数器的设计方法;熟练掌握可变分频器的设计方法;熟练掌握IF语句的使用;熟练掌握CASE语句的使用;,项目1:电子琴的设计,项目分析: 设计问题:如何发出不同音调的声音?,需要:可变分频器(数控分配器),项目1:电子琴的设计,项目1:电子琴的设计,项目分析: 设计关键1:可变分频器(数控分配器)!,项目1:电子琴的设计,LIBRARY IEEE; USE IEEE.STD_
2、LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT10 ISPORT (CLK,RST,EN : IN STD_LOGIC; CNT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC ); END CNT10;,知识回顾:10进制计数器设计,项目1:电子琴的设计,ARCHITECTURE behav OF CNT10 IS BEGINPROCESS(CLK, RST, EN)VARIABLE CNTI : STD_LOGIC_VECTOR(3 DOWNTO 0);
3、BEGINIF RST = 1 THENCNTI := (OTHERS =0) ; -计数器异步复位 ELSIF CLKEVENT AND CLK=1 THEN -检测时钟上升沿IF EN = 1 THEN -检测是否允许计数(同步使能)IF CNTI 0); -大于等于9,计数值清零 END IF;END IF;END IF; IF CNTI = 9 THEN COUT = 1; -计数等于9,输出进位信号ELSE COUT = 0;END IF;CNT = CNTI; -将计数值向端口输出END PROCESS; END behav;,知识回顾:10进制计数器设计,仿真结果:10进制计数器
4、设计,结论: 计数器就可以完成分频器的任务!,项目1:电子琴的设计,项目1:电子琴的设计,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT_N ISPORT (CLK,RST,EN : IN STD_LOGIC; N : IN STD_LOGIC_VECTOR(11 DOWNTO 0); CNT : OUT STD_LOGIC_VECTOR(11 DOWNTO 0); COUT : OUT STD_LOGIC ); END CNT_N;,设计关键:N进制计数器设计可变分频器
5、,项目1:电子琴的设计,ARCHITECTURE behav OF CNT_N IS BEGINPROCESS(CLK, RST, EN)VARIABLE CNTI : STD_LOGIC_VECTOR(11 DOWNTO 0); BEGINIF RST = 1 THENCNTI := (OTHERS =0) ; -计数器异步复位 ELSIF CLKEVENT AND CLK=1 THEN -检测时钟上升沿IF EN = 1 THEN -检测是否允许计数(同步使能)IF CNTI 0); -大于等于N-1,计数值清零 END IF;END IF;END IF; IF CNTI = N-1 TH
6、EN COUT = 1; -计数等于N-1,输出进位信号ELSE COUT = 0;END IF;CNT = CNTI; -将计数值向端口输出END PROCESS; END behav;,设计关键:N进制计数器设计可变分频器,设计关键:N进制计数器设计可变分频器,结论: COUT实现了N分频, 但是占空比是1/N,能量不足,无法驱动蜂鸣器工作。,N分频,占空1/N,项目1:电子琴的设计,项目1:电子琴的设计,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT_N ISPOR
7、T (CLK,RST,EN : IN STD_LOGIC; N : IN STD_LOGIC_VECTOR(11 DOWNTO 0); CNT : OUT STD_LOGIC_VECTOR(11 DOWNTO 0); COUT : OUT STD_LOGIC ); END CNT_N;,设计关键: 改进的N进制计数器可变分频器, COUT占空比50%,项目1:电子琴的设计,ARCHITECTURE behav OF CNT_N IS BEGINPROCESS(CLK, RST, EN)VARIABLE CNTI : STD_LOGIC_VECTOR(11 DOWNTO 0); BEGINIF
8、RST = 1 THENCNTI := (OTHERS =0) ; -计数器异步复位 ELSIF CLKEVENT AND CLK=1 THEN -检测时钟上升沿IF EN = 1 THEN -检测是否允许计数(同步使能)IF CNTI 0); -大于等于N/2,计数值清零 END IF;END IF;END IF;IF CNTI CONV_INTEGER(N)/2 THEN COUT = 0;ELSE COUT = 1;END IF;CNT = CNTI; COUT = COUTI; -将计数值向端口输出END PROCESS; END behav;,设计关键: 改进的N进制计数器可变分频器
9、, COUT占空比50%,IF CNTI = N-1 THEN COUT = 1; -计数等于N-1,输出进位信号ELSE COUT = 0;END IF;,占空比非50%,占空比接近50%,结论: COUT实现了N分频, 当N比较大时,占空比是接近50%,能量足以驱动蜂鸣器工作。,设计关键: 改进的N进制计数器可变分频器, COUT占空比50%,项目1:电子琴的设计,项目1:电子琴的设计,项目分析: 设计关键2:向可变分频器(数控分配器)提供分频数字,需要一个“频率”到“分频数”的转换模块。,项目1:电子琴的设计,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.A
10、LL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY converter IS PORT ( key : IN STD_LOGIC_VECTOR (7 DOWNTO 0) ; en : OUT STD_LOGIC;div_num : OUT integer range 0 to 4095;CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ; HIGH : OUT STD_LOGIC ); END entity converter ;,设计关键2:“频率”到“分频数”的转换模块。,项目1:电子琴的设计,ARCHITECTURE o
11、ne OF converter IS BEGIN PROCESS(converter ) BEGIN CASE key IS - 译码电路,查表方式,控制音调的预置数 WHEN “00000000“ = div_num div_num div_num div_num div_num div_num div_num div_num div_num div_num=0 ; en = 0; CODE=“0000“; HIGH =0; - 同时按多个键,0Hz,不响END CASE; END PROCESS; END one;,设计关键2:“频率”到“分频数”的转换模块。,项目1:电子琴的设计,设计关
12、键2:“频率”到“分频数”的转换模块。,设计关键3:在顶层原理图中组装各个功能模块。,项目1:电子琴的设计,项目1:电子琴的设计总结,知识点回顾:IF语句的使用;CASE语句的使用;计数器的设计;可变分频器的设计;,项目1:电子琴的设计总结,知识点回顾:IF语句的使用; IF语句既可以描述组合电路,也可以描述时序电路; 完整条件IF语句用来描述组合电路;,IF s = 0 THENy = a ; ELSE y = b ; END IF;,IF CLKEVENT AND CLK = 1 THEN CNT = CNT + 1 ; END IF;,不完整条件IF语句用来描述时序电路;,项目1:电子琴
13、的设计总结,知识点回顾:CASE语句的使用; CASE语句最适合于描述译码器电路; 不完整的CASE语句会生成不必要的锁存器;,CASE key IS - 译码电路,查表方式,控制音调的预置数 WHEN “00000000“ = div_num div_num div_num div_num div_num div_num div_num div_num div_num div_num=0 ; en = 0; CODE=“0000“; HIGH =0; - 同时按多个键,0Hz,不响END CASE;,项目1:电子琴的设计总结,知识点回顾:计数器的设计;可变分频器的设计;,项目2:课后练习,音乐播放器的设计,设计目标: 设计一个音乐播放器,具有“开始播放”、“暂停播放”和“停止播放”3个按键; 当按下“开始播放”按键的时候,能够重新开始演奏一首动听的乐曲; 当按下“暂停播放”按键的时候能够在暂停演奏和继续演奏之间切换; 当按下“停止播放”按键的时候能够中止播放。,