应用实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
inst
CODE[3
H
div_num : OUT integer range 0 to 4095;
); END entity converter ;
设计关键2: “频率”到“分频数”的转换模块。
conv erter
ARCHITECTURE one OF converter IS BEGIN PROCESS(converter ) BEGIN CASE key IS -- 译码电路,查表方式,控制音调的预置数 ; en <= '0'; CODE<="0000"; HIGH <='0‘; -- 不按键,0Hz,不响 WHEN "00000000" => div_num<=0
conv erter key [7..0]
div _num[11.
key
en CODE HIGH
: IN STD_LOGIC_VECTOR (7 DOWNTO 0) ;
: OUT STD_LOGIC; : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ; : OUT STD_LOGIC
CNT10 CLK RST EN inst
CNT
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;
CNT_N CLK RST EN N[11..0]
CNT[
inst
设计关键:N进制计数器设计——可变分频器
N分频,占空1/N
结论: 1. COUT实现了N分频,
2. 但是占空比是1/N,能量不足,无法驱动蜂鸣器工作。
设计关键: 改进的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;
应用设计
电子琴的设计
设计目标: 设计一个电子琴,具有8个按键,当按下某一个按键的 时候,能够演奏8个音符之一: 1、2、3、4、5、6、7、H1
电子琴的设计
项目分析: 设计问题:如何发出不同音调的声音?
音符 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
--计数等于
CNT_N CLK RST EN N[11..0]
CNT[
inst
设计关键: 改进的N进制计数器——可变分频器, COUT占空比50%
占空比非50% 结论:
1. COUT实现了N分频,
占空比接近50%
2. 当N比较大时,占空比是接近50%,能量足以驱动蜂鸣器工作。
项目分析: 设计关键2: 向可变分频器(数控分配器)提供分频数字, 需要一个“频率”到“分频数”的转换模块。
CNT_N
ENTITY CNT_N IS PORT ( CLK,RST,EN N CNT COUT ); END CNT_N;
CLK RST
CNT[11..0] COUT
: : : :
EN IN STD_LOGIC; IN STD_LOGIC_VECTOR(11 DOWNTO 0); N[11..0] OUT STD_LOGIC_VECTOR(11 DOWNTO 0); OUT STD_LOGIC inst
分频数 2867 2554 2275 2148 1913 1705 1519 1433
需要:可变分频器(数控分配器)
项目分析: 设计关键1: 可变分频器(数控分配器)!
CNT_N CLK RST EN N[3..0] CNT[3..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;
中音
高音
中音
高音
音符 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
key [7..0]
div _num[11.
CODE[3
H
WHEN "00000001" => div_num<=2867 ; en <= '1'; CODE<="0001"; HIGH <='0'; -- 按键1,中音1,523.25 Hz;
WHEN "00000010" => div_num<=2554 ; en <= '1'; CODE<="0010"; HIGH <='0'; -- 按键2,中音2,587.33 Hz; WHEN "00000100" => div_num<=2275 ; en <= '1'; CODE<="0011"; HIGH <='0'; -- 按键3,中音3,659.26 Hz; WHEN "00001000" => div_num<=2148 ; en <= '1'; CODE<="0100"; HIGH <='0'; -- 按键4,中音4,698.46 Hz; WHEN "00010000" => div_num<=1913 ; en <= '1'; CODE<="0101"; HIGH <='0'; -- 按键5,中音5,783.99 Hz; WHEN "00100000" => div_num<=1705 ; en <= '1'; CODE<="0110"; HIGH <='0'; -- 按键6,中音6,880 Hz; WHEN "01000000" => div_num<=1519 ; en <= '1'; CODE<="0111"; HIGH <='0'; -- 按键7,中音7,987.77 Hz; WHEN "10000000" => div_num<=1433 ; en <= '1'; CODE<="0001"; HIGH <='1'; -- 按键8,高音1,1046.5 Hz; WHEN others END CASE; END PROCESS; END one; => div_num<=0 ; en <= '0'; CODE<="0000"; HIGH <='0'; -- 同时按多个键,0Hz,不响
设计关键: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]
: : : :
IN STD_LOGIC; IN STD_LOGIC_VECTOR(11 DOWNTO 0); OUT STD_LOGIC_VECTOR(11 DOWNTO 0); OUT STD_LOGIC
CNT[
inst
设计关键: 改进的N进制计数器——可变分频器, IF CNTI = N-1 THEN COUT <= '1'; COUT占空比50% N-1,输出进位信号
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
设计关键2: “频率”到“分频数”的转换模块。
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY converter IS PORT (
ARCHITECTURE behav OF CNT_N IS ELSE COUT <= '0'; BEGIN END IF; 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;
CNT10 CLK RST EN inst
CNT
Fra Baidu bibliotek
仿真结果:10进制计数器设计
结论: 计数器就可以完成分频器的任务!
设计关键:N进制计数器设计——可变分频器
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
CODE[3
H
div_num : OUT integer range 0 to 4095;
); END entity converter ;
设计关键2: “频率”到“分频数”的转换模块。
conv erter
ARCHITECTURE one OF converter IS BEGIN PROCESS(converter ) BEGIN CASE key IS -- 译码电路,查表方式,控制音调的预置数 ; en <= '0'; CODE<="0000"; HIGH <='0‘; -- 不按键,0Hz,不响 WHEN "00000000" => div_num<=0
conv erter key [7..0]
div _num[11.
key
en CODE HIGH
: IN STD_LOGIC_VECTOR (7 DOWNTO 0) ;
: OUT STD_LOGIC; : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) ; : OUT STD_LOGIC
CNT10 CLK RST EN inst
CNT
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;
CNT_N CLK RST EN N[11..0]
CNT[
inst
设计关键:N进制计数器设计——可变分频器
N分频,占空1/N
结论: 1. COUT实现了N分频,
2. 但是占空比是1/N,能量不足,无法驱动蜂鸣器工作。
设计关键: 改进的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;
应用设计
电子琴的设计
设计目标: 设计一个电子琴,具有8个按键,当按下某一个按键的 时候,能够演奏8个音符之一: 1、2、3、4、5、6、7、H1
电子琴的设计
项目分析: 设计问题:如何发出不同音调的声音?
音符 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
--计数等于
CNT_N CLK RST EN N[11..0]
CNT[
inst
设计关键: 改进的N进制计数器——可变分频器, COUT占空比50%
占空比非50% 结论:
1. COUT实现了N分频,
占空比接近50%
2. 当N比较大时,占空比是接近50%,能量足以驱动蜂鸣器工作。
项目分析: 设计关键2: 向可变分频器(数控分配器)提供分频数字, 需要一个“频率”到“分频数”的转换模块。
CNT_N
ENTITY CNT_N IS PORT ( CLK,RST,EN N CNT COUT ); END CNT_N;
CLK RST
CNT[11..0] COUT
: : : :
EN IN STD_LOGIC; IN STD_LOGIC_VECTOR(11 DOWNTO 0); N[11..0] OUT STD_LOGIC_VECTOR(11 DOWNTO 0); OUT STD_LOGIC inst
分频数 2867 2554 2275 2148 1913 1705 1519 1433
需要:可变分频器(数控分配器)
项目分析: 设计关键1: 可变分频器(数控分配器)!
CNT_N CLK RST EN N[3..0] CNT[3..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;
中音
高音
中音
高音
音符 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
key [7..0]
div _num[11.
CODE[3
H
WHEN "00000001" => div_num<=2867 ; en <= '1'; CODE<="0001"; HIGH <='0'; -- 按键1,中音1,523.25 Hz;
WHEN "00000010" => div_num<=2554 ; en <= '1'; CODE<="0010"; HIGH <='0'; -- 按键2,中音2,587.33 Hz; WHEN "00000100" => div_num<=2275 ; en <= '1'; CODE<="0011"; HIGH <='0'; -- 按键3,中音3,659.26 Hz; WHEN "00001000" => div_num<=2148 ; en <= '1'; CODE<="0100"; HIGH <='0'; -- 按键4,中音4,698.46 Hz; WHEN "00010000" => div_num<=1913 ; en <= '1'; CODE<="0101"; HIGH <='0'; -- 按键5,中音5,783.99 Hz; WHEN "00100000" => div_num<=1705 ; en <= '1'; CODE<="0110"; HIGH <='0'; -- 按键6,中音6,880 Hz; WHEN "01000000" => div_num<=1519 ; en <= '1'; CODE<="0111"; HIGH <='0'; -- 按键7,中音7,987.77 Hz; WHEN "10000000" => div_num<=1433 ; en <= '1'; CODE<="0001"; HIGH <='1'; -- 按键8,高音1,1046.5 Hz; WHEN others END CASE; END PROCESS; END one; => div_num<=0 ; en <= '0'; CODE<="0000"; HIGH <='0'; -- 同时按多个键,0Hz,不响
设计关键: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]
: : : :
IN STD_LOGIC; IN STD_LOGIC_VECTOR(11 DOWNTO 0); OUT STD_LOGIC_VECTOR(11 DOWNTO 0); OUT STD_LOGIC
CNT[
inst
设计关键: 改进的N进制计数器——可变分频器, IF CNTI = N-1 THEN COUT <= '1'; COUT占空比50% N-1,输出进位信号
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
设计关键2: “频率”到“分频数”的转换模块。
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY converter IS PORT (
ARCHITECTURE behav OF CNT_N IS ELSE COUT <= '0'; BEGIN END IF; 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;
CNT10 CLK RST EN inst
CNT
Fra Baidu bibliotek
仿真结果:10进制计数器设计
结论: 计数器就可以完成分频器的任务!
设计关键:N进制计数器设计——可变分频器
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;