蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“ZZG”、“LB”、“JD”等)表示。本文为大家介绍基于vhdl蜂鸣器程序设计。
实验步骤
1、设置端口
1)输入端口
CLK:40MHZ系统时钟输入端口。
2)输出端口
device:乐曲的声音输出端口,输出的是对应各音符频率的方波信号。 2、设置模块 1)自动演奏模块
自动演奏模块可以自动播放电子琴内置乐曲,按节拍读取内置乐谱。将键盘输入的音符信号输出。因此,本模块是向Tone模块提供音符信息。
首先,对40MHz系统时钟进行10M的分频,得到4Hz的信号,这样一秒中就可以按照四拍进行。然后依照此频率进行地址累计。
音频发生器模块
根据自动演奏模块的信号输出,不同的信号被翻译为不同的频率。
蜂鸣器驱动模块
根据音频发生器发出音频的不同,蜂鸣器得到的驱动也不同。首先,对系统时钟进行40分频,再对1mhz的脉冲再次分频,得到所需要的音符频率,然后再进行2分频。
实验代码
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;
评论
查看更多