EDA技术及其应用第4章 应用VHDL设计数字系统-电子琴和音乐播放器的设计
发布时间:2024-11-02
发布时间:2024-11-02
EDA技术及其应用第4章 应用VHDL设计数字系统
项目1:电子琴的设计设计目标: 设计一个电子琴,具有8个按键,当按下某一个按键的时 候,能够演奏8个音符之一: 1、2、3、4、5、6、7、H1 视频演示 知识点: 熟练掌握计数器的设计方法; 熟练掌握可变分频器的设计方法; 熟练掌握IF语句的使用; 熟练掌握CASE语句的使用;
项目1:电子琴的设计项目分析: 设计问题1:如何发出不同音调的声音?音符 1 1.5 2 2.5 3 4 4.5 5 5.5 6 6.5 7 H1 对应频率(Hz) 523.2511306 554.365262 587.3295358 622.2539674 659.2551138 698.4564629 739.9888454 783.990872 830.6093952 880 932.327523 987.7666025 1046.502261 时钟频率1.5MHz 分频数 2867 2554 2275 2148 1913 1705 1519 1433CNT_N CLK RST EN N[11..0]
设计关键1:
可变分频器/ 数控分配器。
中音
CNT[11
高音
C
项目1:电子琴的设计项目分析: 设计问题2:按下不同按键时,如何得到不同的分频数? 设计关键2: 向可变分频器(数控分配器)提供分频数字,需要一个 “按键”到“分频数”的转换模块。
1
. . .
?conv erter key [7..0] en div _num[11..0] CODE[3..0] HIGHCNT_N CLK RST EN N[11..0]
CNT[11
8
C
项目1:电子琴的设计项目分析: 设计关键1: 可变分频器(数控分配器)!
CNT_N CLK RST EN N[11..0] CNT[11..0] COUT
inst
项目1:电子琴的设计 知识回顾:10进制计数器设计
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT10 IS PORT ( CLK,RST,EN : IN STD_LOGIC; CNT : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT : OUT STD_LOGIC ); END CNT10;
CNT10 CLK RST EN inst
CNT
项目1:电子琴的设计 知识回顾:10进制计数器设计ARCHITECTURE behav OF CNT10 IS BEGIN PROCESS(CLK, RST, EN) VARIABLE CNTI : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN IF RST = '1' THEN CNTI := (OTHERS =>'0') ; --计数器异步复位 ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF EN = '1' THEN --检测是否允许计数(同步使能) IF CNTI < 9 THEN --检测是否小于9 CNTI := CNTI + 1; --小于9,允许加1计数 ELSE CNTI := (OTHERS =>‘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;
CNT10 CLK RST EN inst
CNT
项目1:电子琴的设计 仿真结果:10进制计数器设计
结论: 计数器就可以完成分频器的任务!
项目1:电子琴的设计 设计关键:N进制计数器设计——可变分频器
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT_N IS PORT ( CLK,RST,EN N CNT COUT ); END CNT_N;
CNT_N CLK RST EN N[11..0]
: : : :
IN STD_LOGIC; IN STD_LOGIC_VECTOR(11 DOWNTO 0); OUT STD_LOGIC_VECTOR(11 DOWNTO 0); OUT S
TD_LOGIC
CNT[
inst
项目1:电子琴的设计 设计关键:N进制计数器设计——可变分频器ARCHITECTURE behav OF CNT_N IS BEGIN PROCESS(CLK, RST, EN) VARIABLE CNTI : STD_LOGIC_VECTOR(11 DOWNTO 0); BEGIN IF RST = '1' THEN CNTI := (OTHERS =>'0') ; --计数器异步复位 ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF EN = '1' THEN --检测是否允许计数(同步使能) IF CNTI < N-1 THEN --检测是否小于N-1 CNTI := CNTI + 1; --小于N-1,允许加1计数 ELSE CNTI := (OTHERS =>'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;
CNT_N CLK RST EN N[11..0]
CNT[
inst
项目1:电子琴的设计 设计关键:N进制计数器设计——可变分频器
N分频,占空1/N
结论: 1. COUT实现了N分频,
2. 但是占空比是1/N,能量不足,无法驱动蜂鸣器工作。
项目1:电子琴的设计设计关键: 改进的N进制计数器——可变分频器 COUT占空比50%LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT_N IS PORT ( CLK,RST,EN N CNT COUT ); END CNT_N;
CNT_N CLK RST EN N[11..0]
: : : :
IN STD_LOGIC; IN STD_LOGIC_VECTOR(11 DOWNTO 0); OUT STD_LOGIC_VECTOR(11 DOWNTO 0); OUT STD_LOGIC
CNT[
inst
项目1:电子琴的设计设计关键: 改进的N进制计数器——可变分频器 COUT占空比50%ARCHITECTURE behav OF CNT_N IS BEGIN PROCESS(CLK, RST, EN) VARIABLE CNTI : STD_LOGIC_VECTOR(11 DOWNTO 0); BEGIN IF RST = '1' THEN CNTI := (OTHERS =>'0') ; --计数器异步复位 ELSIF CLK'EVENT AND CLK='1' THEN --检测时钟上升沿 IF EN = '1' THEN --检测是否允许计数(同步使能) IF CNTI < N-1 THEN CNTI := CNTI + 1; --小于N/2,允许加1计数 ELSE CNTI := (OTHERS =>'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;
CNT_N CLK RST EN N[11..0]
CNT[
inst
项目1:电子琴的设计设计关键: 改进的N进制计数器——可变分频器 COUT占空比50%
占空比非50% 结论:1. COUT实现了N分频,
占空比接近50%
2. 当N比较大时,占空比是接近50%,能量足以驱动蜂鸣器工作。
项目1:电子琴的设计项目分析: 设计关键2: 向可变分频器(数控分配器)提供分频数字, 需要一个“按键”到“分频数”的转换模块。
conv erter key [7..0] div _num[11..0] CODE[3..0] HIGH en
CNT_N CLK RST EN N[11..0] CNT[11..0] COUT
项目1:电子琴的设计设计关键2: “按键”到“分频数”的转换模块。conv erter key [7..0]
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY converter ISPORT ( key en CODE : IN STD_LO
GIC_VECTOR (7 DOWNTO 0) ; : OUT STD_LOGIC; : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ;
div _num[11.
CODE[3
H
inst
div_num : OUT integer range 0 to 4095;
HIGH
: OUT STD_LOGIC
); END entity converter ;