基于vhdl蜂鸣器程序设计详解

来源:电子发烧友整理 作者:2018年01月29日 15:08
关键词:蜂鸣器vhdl

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“ZZG”、“LB”、“JD”等)表示。本文为大家介绍基于vhdl蜂鸣器程序设计。

实验步骤

基于vhdl蜂鸣器程序设计详解

1、设置端口

1)输入端口

CLK:40MHZ系统时钟输入端口。

2)输出端口

device:乐曲的声音输出端口,输出的是对应各音符频率的方波信号。 2、设置模块 1)自动演奏模块

自动演奏模块可以自动播放电子琴内置乐曲,按节拍读取内置乐谱。将键盘输入的音符信号输出。因此,本模块是向Tone模块提供音符信息。

首先,对40MHz系统时钟进行10M的分频,得到4Hz的信号,这样一秒中就可以按照四拍进行。然后依照此频率进行地址累计。

基于vhdl蜂鸣器程序设计详解

音频发生器模块

根据自动演奏模块的信号输出,不同的信号被翻译为不同的频率。

基于vhdl蜂鸣器程序设计详解

蜂鸣器驱动模块

根据音频发生器发出音频的不同,蜂鸣器得到的驱动也不同。首先,对系统时钟进行40分频,再对1mhz的脉冲再次分频,得到所需要的音符频率,然后再进行2分频。

基于vhdl蜂鸣器程序设计详解

实验代码

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

enTIty tone is port( index: in std_logic_vector(15 downto 0); --音符输入信号

tone0: out integer range 0 to 2047 --音符的分频系数 );

end tone;

architecture behavioral of tone is

begin

search :process(index) --此进程完成音符到音符的分频系数译码,音符的显示,高低音阶

begin

case index is

when “0000000000000001” => tone0<=1433;

when “0000000000000010” => tone0<=1277;

when “0000000000000100” => tone0<=1138;

when “0000000000001000” => tone0<=1074;

when “0000000000010000” => tone0<=960;

when “0000000000100000” => tone0<=853;

when “0000000001000000” => tone0<=759;

when “0000000010000000” => tone0<=716;

when “0000000100000000” => tone0<=358;

when “0000001000000000” => tone0<=319;

when “0000010000000000” => tone0<=284;

when “0000100000000000” => tone0<=268;

when “0001000000000000” => tone0<=239;

when “0010000000000000” => tone0<=213;

when “0100000000000000” => tone0<=190;

when “1000000000000000” => tone0<=638;

when others => tone0<=0;

end case;

end process;

end behavioral;

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

enTIty speaker is port( clk1: in std_logic; --系统时钟12mhz

tone1: in integer range 0 to 2047; --音符分频系数

spks: out std_logic --驱动扬声器的音频信号 );

end speaker;

architecture behavioral of speaker is

signal preclk, fullspks:std_logic;

begin

p1:process(clk1)--此进程对系统时钟进行16分频

variable count: integer range 0 to 16;

begin

if clk1‘event and clk1=’1‘ then count:=count+1;

if count=8 then

preclk<=‘1’;

elsif count=16 then preclk<=‘0’;

count:=0;

end if;

end if;

end process p1;

p2:process(preclk,tone1)--对0.75mhz的脉冲再次分频,得到所需要的音符频率

variable count11:integer range 0 to 2047;

begin

if preclk‘event and preclk=’1‘ then

if count11

count11:=count11+1;

fullspks<=’1‘;

else

count11:=0;

fullspks<=’0‘;

end if;

end if;

end process p2;

p3:process(fullspks)--此进程对fullspks进行2分频

variable count2: std_logic:=’0‘;

begin

if fullspks’event and fullspks=‘1’ then

count2:=not count2;

if count2=‘1’ then

spks<=‘1’;

else spks<=‘0’;

end if;

end if;

end process p3;

end behavioral;

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

enTIty laohu is port( clk: in std_logic;--系统时钟;键盘输入/自动演奏

tone_key_0: buffer std_logic_vector(15 downto 0)--音符信号输出

);

end laohu;

1