1、EDA技术及其应用,第4章 应用VHDL设计数字系统,项目1:电子琴的设计,设计目标:设计一个电子琴,具有8个按键,当按下某一个按键的时候,能够演奏8个音符之一: 1、2、3、4、5、6、7、H1 视频演示 知识点:熟练掌握计数器的设计方法;熟练掌握可变分频器的设计方法;熟练掌握IF语句的使用;熟练掌握CASE语句的使用;,项目1:电子琴的设计,项目分析: 设计问题1:如何发出不同音调的声音?,设计关键1: 可变分频器/ 数控分配器。,项目1:电子琴的设计,项目分析: 设计问题2:按下不同按键时,如何得到不同的分频数? 设计关键2:向可变分频器(数控分配器)提供分频数字,需要一个“按键”到“分
2、频数”的转换模块。,?,项目1:电子琴的设计,项目分析: 设计关键1:可变分频器(数控分配器)!,项目1:电子琴的设计,LIBRARY IEEE; USE IEEE.STD_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 beh
3、av OF CNT10 IS BEGINPROCESS(CLK, RST, EN)VARIABLE CNTI : STD_LOGIC_VECTOR(3 DOWNTO 0); 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 CO
4、UT = 0;END IF;CNT = CNTI; -将计数值向端口输出END PROCESS; END behav;,知识回顾:10进制计数器设计,仿真结果:10进制计数器设计,结论: 计数器就可以完成分频器的任务!,项目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 : O
5、UT STD_LOGIC_VECTOR(11 DOWNTO 0); COUT : OUT STD_LOGIC ); END CNT_N;,设计关键:N进制计数器设计可变分频器,项目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 =
6、1 THEN -检测是否允许计数(同步使能)IF CNTI 0); -大于等于N-1,计数值清零 END IF;END IF;END IF; IF CNTI = N-1 THEN 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:电子琴的设计,LIBRAR
7、Y 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进制计数器可变分频器 COUT占空比50%,项目1:电子琴的设计,ARCHITECTURE behav OF CNT_
8、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/2,计数值清零 END IF;END IF;END IF;IF CNTI CONV_INTEGER(N)/2 THEN COUT = 0;ELSE COUT = 1;E
9、ND IF;CNT = CNTI; COUT = COUTI; -将计数值向端口输出END PROCESS; END behav;,设计关键: 改进的N进制计数器可变分频器 COUT占空比50%,占空比非50%,占空比接近50%,结论: COUT实现了N分频, 当N比较大时,占空比是接近50%,能量足以驱动蜂鸣器工作。,设计关键: 改进的N进制计数器可变分频器 COUT占空比50%,项目1:电子琴的设计,项目1:电子琴的设计,项目分析: 设计关键2:向可变分频器(数控分配器)提供分频数字,需要一个“按键”到“分频数”的转换模块。,项目1:电子琴的设计,LIBRARY IEEE; USE IEE
10、E.STD_LOGIC_1164.ALL; 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:电子琴
11、的设计,ARCHITECTURE one 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:“按键”到“分频数”的转换
12、模块。,项目1:电子琴的设计,设计关键2:“按键”到“分频数”的转换模块。,设计关键3:在顶层原理图中组装各个功能模块。,项目1:电子琴的设计,思考: 原理图作为顶层设计文件有什么优点和缺点? 如何使用“元件例化”语句完成模块调用和信号线连接,顶层程序设计怎样设计?VHDL程序作为顶层设计有什么优缺点?,4.3 1位全加器的VHDL描述,4.3.1 半加器描述,LIBRARY IEEE; -1位二进制全加器顶层设计描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY f_adder ISPORT (ain,bin,cin : IN STD_LOGIC;cout,sum
13、: OUT STD_LOGIC ); END ENTITY f_adder; ARCHITECTURE fd1 OF f_adder ISCOMPONENT h_adder -调用半加器声明语句PORT ( a,b : IN STD_LOGIC;co,so : OUT STD_LOGIC);END COMPONENT ;COMPONENT or2aPORT (a,b : IN STD_LOGIC; c : OUT STD_LOGIC);END COMPONENT;SIGNAL d,e,f : STD_LOGIC; -定义3个信号作为内部的连接线。 BEGINu1 : h_adder PORT
14、MAP(a=ain,b=bin,co=d,so=e); -元件例化语句u2 : h_adder PORT MAP(a=e, b=cin, co=f,so=sum);u3 : or2a PORT MAP(a=d, b=f, c=cout); END ARCHITECTURE fd1;,项目1:电子琴的设计总结,知识点回顾:IF语句的使用;CASE语句的使用;计数器的设计;可变分频器的设计;,项目1:电子琴的设计总结,知识点回顾:IF语句的使用; IF语句既可以描述组合电路,也可以描述时序电路; 完整条件IF语句用来描述组合电路;,IF s = 0 THENy = a ; ELSE y = b ;
15、 END IF;,IF CLKEVENT AND CLK = 1 THEN CNT = CNT + 1 ; END IF;,不完整条件IF语句用来描述时序电路;,项目1:电子琴的设计总结,知识点回顾: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=
16、“0000“; HIGH =0; - 同时按多个键,0Hz,不响END CASE;,项目1:电子琴的设计总结,知识点回顾:计数器的设计;可变分频器的设计;,项目2:音乐播放器的设计,设计目标: 设计一个音乐播放器,可以播放一首歌曲;拓展设计: 设计一个音乐播放器,可以播放多首歌曲; 具有“播放/停止”、“暂停播放”和2个按键; 当第一次按下“播放/停止”按键的时候,能够重头开始演奏一首动听的乐曲,第二次按下键,就停止播放; 当按下“暂停播放”按键的时候能够在暂停演奏和继续演奏之间切换;,项目2:音乐播放器的设计,存储和 读音符模块,频率转换模块,数控分频模块,项目2:音乐播放器的设计,4-5
17、乐曲硬件演奏电路设计,ROM中的数据文件music.mif WIDTH = 4 ; -“梁祝”乐曲演奏数据 DEPTH = 256 ; ADDRESS_RADIX = DEC ; DATA_RADIX = DEC ; CONTENT BEGIN -注意实用文件中要展开以下数据,每一组占一行 00: 3 ; 01: 3 ; 02: 3 ; 03: 3; 04: 5; 05: 5; 06: 5;07: 6; 08: 8; 09: 8; 10: 8 ; 11: 9 ; 12: 6 ; 13: 8; 14: 5; 15: 5; 16: 12;17: 12;18: 12; 19:15; 20:13 ;
18、21:12 ; 22:10 ; 23:12; 24: 9; 25: 9; 26: 9; 27: 9; 28: 9; 29: 9; 30: 9 ; 31: 0 ; 32: 9 ; 33: 9; 34: 9; 35:10; 36: 7; 37: 7; 38: 6; 39: 6; 40: 5 ; 41: 5 ; 42: 5 ; 43: 6; 44: 8; 45: 8; 46: 9; 47: 9; 48: 3; 49: 3; 50: 8 ; 51: 8 ; 52: 6 ; 53: 5; 54: 6; 55: 8; 56: 5; 57: 5; 58: 5; 59: 5; 60: 5 ; 61: 5 ;
19、62: 5 ; 63: 5; 64:10; 65:10; 66:10; 67:12; 68: 7; 69: 7; 70: 9 ; 71: 9 ; 72: 6 ; 73: 8; 74: 5; 75: 5; 76: 5; 77: 5; 78: 5; 79: 5; 80: 3 ; 81: 5 ; 82: 3 ; 83: 3; 84: 5; 85: 6; 86: 7; 87: 9; 88: 6; 89: 6; 90: 6 ; 91: 6 ; 92: 6 ; 93: 6; 94: 5; 95: 6; 96: 8; 97: 8; 98: 8; 99: 9; 100:12 ;101:12 ;102:12 ;
20、103:10;104: 9;105: 9;106:10;107: 9;108: 8;109: 8; 110: 6 ;111: 5 ;112: 3 ;113: 3;114: 3;115: 3;116: 8;117: 8;118: 8;119: 8; 120: 6 ;121: 8 ;122: 6 ;123: 5;124: 3;125: 5;126: 6;127: 8;128: 5;129: 5; 130: 5 ;131: 5 ;132: 5 ;133: 5;134: 5;135: 5;136: 0;137: 0;138: 0; END ;,设计关键1:存储和读音符模块,项目2:音乐播放器的设计,L
21、IBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY NoteTabs ISPORT ( clk : IN STD_LOGIC;ToneIndex : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ); END; ARCHITECTURE one OF NoteTabs ISCOMPONENT MUSIC -音符数据ROMPORT(address : IN STD_LOGIC_VECTOR (7 DOWNTO 0);clock : IN STD_LOGIC ;q
22、: OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END COMPONENT; SIGNAL Counter : STD_LOGIC_VECTOR (7 DOWNTO 0); BEGINPROCESS(clk, Counter)BEGINIF (clkEVENT AND clk = 1) THEN IF Counter=138 THEN Counter Counter ,clock = clk,q = ToneIndex ); END;,设计关键1:存储和读音符模块,项目2:音乐播放器的设计,设计关键2:频率转换模块,LIBRARY IEEE; USE IEEE.ST
23、D_LOGIC_1164.ALL; ENTITY ToneTaba ISPORT (Index : IN STD_LOGIC_VECTOR (3 DOWNTO 0) ;CODE : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ;HIGH : OUT STD_LOGIC; en : OUT STD_LOGIC;div_num : OUT integer range 0 to 4095 ); END;CASE Index IS - 译码电路,查表方式,控制音调的预置数WHEN “0001“ = div_num div_num div_num div_num div_num
24、div_num 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; - 不响 END PROCESS; END;,项目2:音乐播放器的设计,设计关键3:数控分频模块,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY Speakera ISPORT ( CLK_1500kHz : IN STD_LOGIC;
25、EN : IN STD_LOGIC; div_num : IN integer range 0 to 4095; Speaker : OUT STD_LOGIC ); END; ARCHITECTURE one OF Speakera IS BEGINPROCESS(CLK_1500kHz, EN)VARIABLE CQI : integer range 0 to 4095; VARIABLE Speaker_reg : STD_LOGIC; BEGINIF CLK_1500kHzEVENT AND CLK_1500kHz=1 THEN -检测时钟上升沿IF EN = 1 THEN -检测是否
26、允许计数(同步使能)IF CQI = 0 THENCQI := div_num/2 - 1;Speaker_reg := not Speaker_reg;ELSECQI := CQI - 1; END IF;END IF;END IF; Speaker = Speaker_reg; END PROCESS; END;,项目2:音乐播放器的设计,存储和 读音符模块,频率转换模块,数控分频模块,请写出对应的元件例化语句,设计关键4:组合子模块,生成songer模块,项目2:音乐播放器的设计,存储和 读音符模块,频率转换模块,数控分频模块,设计关键4:组合子模块,生成songer模块,项目2:音乐播
27、放器的设计,设计关键5:分频模块,产生4Hz和1.5MHz时钟信号,项目2:音乐播放器的设计,LIBRARY IEEE; -分频模块,从20MHz到4HZ和1.5MHz USE IEEE.STD_LOGIC_1164.ALL;ENTITY freq_div IS PORT( CLK_30MHz : IN STD_LOGIC; CLK_4Hz : out STD_LOGIC;CLK_1500kHz : out STD_LOGIC ); END; ARCHITECTURE one OF freq_div ISsignal divider, divider 1 : integer range 0 t
28、o 187500;signal CLK_1500kHz_tmp : STD_LOGIC;signal CLK_4HZ_tmp : STD_LOGIC; beginCLK_1500kHz = CLK_1500kHz_tmp;process(CLK_30MHz)beginif( CLK_30MHzevent and CLK_30MHz=1 ) thenif divider=9 thendivider = 0;CLK_1500kHz_tmp = not CLK_1500kHz_tmp;elsedivider = divider+1;end if;end if;end process;,设计关键5:分频模块,产生4Hz和1.5MHz时钟信号,项目2:音乐播放器的设计,CLK_4HZ = CLK_4HZ_tmp;process(CLK_1500kHz)beginif( CLK_1500kHzevent and CLK_1500kHz=1 ) thenif divider1=187499 thendivider1 = 0;CLK_4HZ_tmp = not CLK_4HZ_tmp;elsedivider1 = divider1+1;end if;end if;end process; end;,设计关键5:分频模块,产生4Hz和1.5MHz时钟信号,