EDA技术及其应用第4章应用VHDL设计数字系统项目1:电子琴的设计设计目标:设计一个电子琴,具有8个按键,当按下某一个按键的时候,能够演奏8个音符之一:1、2、3、4、5、6、7、H1视频演示知识点:熟练掌握计数器的设计方法;熟练掌握可变分频器的设计方法;熟练掌握IF语句的使用;熟练掌握CASE语句的使用;项目1:电子琴的设计项目分析:设计问题:如何发出不同音调的声音?音符对应频率(Hz)1523.25113061.5554.3652622587.32953582.5622.25396743659.25511384698.45646294.5739.98884545783.9908725.5830.609395268806.5932.3275237987.7666025高音H11046.502261中音音符对应频率(Hz)分频数1523.251130628671.5554.3652622587.329535825542.5622.25396743659.255113822754698.456462921484.5739.98884545783.99087219135.5830.6093952688017056.5932.3275237987.76660251519高音H11046.5022611433中音时钟频率1.5MHz需要:可变分频器(数控分配器)项目1:电子琴的设计项目1:电子琴的设计项目分析:设计关键1:可变分频器(数控分配器)!CNT_NinstCLKCLKRSTRSTENENN[3..0]N[3..0]CNT[3..0]CNT[3..0]COUTCOUT项目1:电子琴的设计LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT10ISPORT(CLK,RST,EN:INSTD_LOGIC;CNT:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);ENDCNT10;知识回顾:10进制计数器设计CNT10instCLKCLKRSTRSTENENCNT[3..0]CNT[3..0]COUTCOUT项目1:电子琴的设计ARCHITECTUREbehavOFCNT10ISBEGINPROCESS(CLK,RST,EN)VARIABLECNTI:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFRST='1'THENCNTI:=(OTHERS='0');--计数器异步复位ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿IFEN='1'THEN--检测是否允许计数(同步使能)IFCNTI9THEN--检测是否小于9CNTI:=CNTI+1;--小于9,允许加1计数ELSECNTI:=(OTHERS=‘0’);--大于等于9,计数值清零ENDIF;ENDIF;ENDIF;IFCNTI=9THENCOUT=‘1’;--计数等于9,输出进位信号ELSECOUT='0';ENDIF;CNT=CNTI;--将计数值向端口输出ENDPROCESS;ENDbehav;知识回顾:10进制计数器设计CNT10instCLKCLKRSTRSTENENCNT[3..0]CNT[3..0]COUTCOUT仿真结果:10进制计数器设计结论:计数器就可以完成分频器的任务!项目1:电子琴的设计项目1:电子琴的设计LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT_NISPORT(CLK,RST,EN:INSTD_LOGIC;N:INSTD_LOGIC_VECTOR(11DOWNTO0);CNT:OUTSTD_LOGIC_VECTOR(11DOWNTO0);COUT:OUTSTD_LOGIC);ENDCNT_N;设计关键:N进制计数器设计——可变分频器CNT_NinstCLKCLKRSTRSTENENN[11..0]N[11..0]CNT[11..0]CNT[11..0]COUTCOUT项目1:电子琴的设计ARCHITECTUREbehavOFCNT_NISBEGINPROCESS(CLK,RST,EN)VARIABLECNTI:STD_LOGIC_VECTOR(11DOWNTO0);BEGINIFRST='1'THENCNTI:=(OTHERS='0');--计数器异步复位ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿IFEN='1'THEN--检测是否允许计数(同步使能)IFCNTIN-1THEN--检测是否小于N-1CNTI:=CNTI+1;--小于N-1,允许加1计数ELSECNTI:=(OTHERS='0');--大于等于N-1,计数值清零ENDIF;ENDIF;ENDIF;IFCNTI=N-1THENCOUT=‘1';--计数等于N-1,输出进位信号ELSECOUT=‘0';ENDIF;CNT=CNTI;--将计数值向端口输出ENDPROCESS;ENDbehav;设计关键:N进制计数器设计——可变分频器CNT_NinstCLKCLKRSTRSTENENN[11..0]N[11..0]CNT[11..0]CNT[11..0]COUTCOUT设计关键:N进制计数器设计——可变分频器结论:1.COUT实现了N分频,2.但是占空比是1/N,能量不足,无法驱动蜂鸣器工作。N分频,占空1/N项目1:电子琴的设计项目1:电子琴的设计LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT_NISPORT(CLK,RST,EN:INSTD_LOGIC;N:INSTD_LOGIC_VECTOR(11DOWNTO0);CNT:OUTSTD_LOGIC_VECTOR(11DOWNTO0);COUT:OUTSTD_LOGIC);ENDCNT_N;设计关键:改进的N进制计数器——可变分频器,COUT占空比50%CNT_NinstCLKCLKRSTRSTENENN[11..0]N[11..0]CNT[11..0]CNT[11..0]COUTCOUT项目1:电子琴的设计ARCHITECTUREbehavOFCNT_NISBEGINPROCESS(CLK,RST,EN)VARIABLECNTI:STD_LOGIC_VECTOR(11DOWNTO0);BEGINIFRST='1'THENCNTI:=(OTHERS='0');--计数器异步复位ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿IFEN='1'THEN--检测是否允许计数(同步使能)IFCNTIN-1THENCNTI:=CNTI+1;--小于N/2,允许加1计数ELSECNTI:=(OTHERS='0');--大于等于N/2,计数值清零ENDIF;ENDIF;ENDIF;IFCNTICONV_INTEGER(N)/2THENCOUT=‘0';ELSECOUT=‘1';ENDIF;CNT=CNTI;COUT=COUTI;--将计数值向端口输出ENDPROCESS;ENDbehav;设计关键:改进的N进制计数器——可变分频器,COUT占空比50%CNT_NinstCLKCLKRSTRSTENENN[11..0]N[11..0]CNT[11..0]CNT[11..0]COUTCOUTIFCNTI=N-1THENCOUT='1';--计数等于N-1,输出进位信号ELSECOUT='0';ENDIF;占空比非50%占空比接近50%结论:1.COUT实现了N分频,2.当N比较大时,占空比是接近50%,能量足以驱动蜂鸣器工作。设计关键:改进的N进制计数器——可变分频器,COUT占空比50%项目1:电子琴的设计项目1:电子琴的设计项目分析:设计关键2:向可变分频器(数控分配器)提供分频数字,需要一个“频率”到“分频数”的转换模块。converterinstkey[7..0]key[7..0]enendiv_num[11..0]div_num[11..0]CODE[3..0]CODE[3..0]HIGHHIGHCNT_NinstCLKCLKRSTRSTENENN[11..0]N[11..0]CNT[11..0]CNT[11..0]COUTCOUT项目1:电子琴的设计LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYconverterISPORT(key:INSTD_LOGIC_VECTOR(7DOWNTO0);en:OUTSTD_LOGIC;div_num:OUTintegerrange0to4095;CODE:OUTSTD_LOGIC_VECTOR(3DOWNTO0);HIGH:OUTSTD_LOGIC);ENDentityconverter;设计关键2:“频率”到“分频数”的转换模块。converterinstkey[7..0]key[7..0]enendiv_num[11..0]div_num[11..0]CODE[3..0]CODE[3..0]HIGHHIGH项目1:电子琴的设计ARCHITECTUREoneOFconverterISBEGINPROCESS(converter)BEGINCASEkeyIS--译码电路,查表方式,控制音调的预置数WHEN00000000=div_num=0;en='0';CODE=0000;HIGH='0‘;--不按键,0Hz,不响WHEN00000001=div_num=2867;en='1';CODE=0001;HIGH='0';--按键1,中音1,523.25Hz;WHEN00000010=div_num=2554;en='1';CODE=0010;HIGH='0';--按键2,中音2,587.33Hz;WHEN00000100=div_num=2275;en='1';CODE=0011;HIGH='0';--按键3,中音3,659.26Hz;WHEN00001000=div_num=2148;en='1';CODE=0100;HIGH='0';--按键4,中音4,698.46Hz;WHEN00010000=div_num=1913;en='1';CODE=0101;HIGH='0';--按键5,中音5,783.99Hz;WHEN00100000=div_num=1705;en='1';CODE=0110;HIGH='0';--按键6,中音6,880Hz;WHEN01000000=div_num=1519;en='1';CODE=0111;HIGH='0';--按键7,中音7,987.77Hz;WHEN10000000=div_num=1433;en='1';CODE=0001;HIGH='1';--按键8,高音1,1046.5Hz;WHENothers=div_num=0;en='0';CODE=0000;HIGH='0';--同时按多个键,0Hz,不响ENDCASE;ENDPROCESS;ENDone;设计关键2:“频率”到“分频数”的转换模块。converterinstkey[7..0]key[7..0]enendiv_num[11..0]div_num[11..0]CODE[3..0]CODE[3..0]HIGHHIGH项目1:电子琴的设计设计关键2:“频率”到“分频数”的转换模块。音符对应频率(Hz)分频数1523.251130