EDA技术及其应用第4章 应用VHDL设计数字系统-电子琴和音乐播放器的设计

发布时间: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 ;

    精彩图片

    热门精选

    大家正在看