Menu Close

FPGA 应用 – 蜂鸣器实验

在FPGA 实验中, 我们也会使用蜂鸣器作为人机交互的接口, 蜂鸣器在硬件设计中经常会被使用。 最熟悉的就是我们平时使用的台式计算机。几乎每个计算机都保留了蜂鸣器的功能。 蜂鸣器的硬件设计通常比较简单, 硬件连接也比较容易, 在硬件电路设计中, 往往被用来作为调试和警告来使用。 比如计算机的蜂鸣器有很多不同的发声方式, 代表着不同的硬件状态。举例:

1长3短:键盘控制器错误。

1长9短:主板Flash RAM或EPROM错误,BIOS损坏。

不断地响(长声):内存条未插紧或损坏。

不停地响:电源、显示器未和显卡连接好。

重复短响:电源有问题。

无声音无显示:电源有问题。

所以我们有必要学习一蜂鸣器的使用, 同时在fpga设计中,如果能够灵魂应用蜂鸣器,可以帮助我们快速检测 bug 的一个手段。

在PRX100T-D的开发板中, 我们使用的是表贴的(SMT) 7.5mm * 7.5mm * 2.5mm 的器件。
硬件原理图如下:

只要在buzzer 端提供不同频率信号, 蜂鸣器就可以连续发声根据官方的手册中提供的频响曲线:

我们可以看到, 在100hz 到10k hz 下,蜂鸣器可以正常出声音

 

根据蜂鸣器的特性, 我们设计了一个实验: 利用PRX100T-D 开发板中的7个按键, 实现  1,2,3,4,5,6,7 (do, re, mi, fa, so, la, si):

1: 523.25Hz,   1911132 ns
2: 587.33Hz,  1702620 ns
3: 659.26Hz,  1516852 ns
4: 698.46Hz,  1431721 ns
5: 783.99Hz,  1275526 ns
6: 880.00Hz, 1136363 ns
7: 987.77Hz,   1012381 ns

FPGA 代码如下:


 

端口设计:


其中 PB 为prx100t上的7个按键,buzzer 为 蜂鸣器的输出, led 为 fpga的心跳灯 buzzer 模块例化为:


由于prx100t-d硬件设计中,按键平时为高, 按下键后 PB为低。 所以:

reg [7:1] pb_flag = 0; // PRX100T-D low level = button press always @ (posedge sys_clk) pb_flag <= ~PB;

fpga phy 代码:

localparam CLK_NS = MAIN_CLK == 50 ? 20 : 10;

localparam DO_FREQ_X2 = 1911132/2; // 523.25Hz, 1911132 ns
//=============================================================
reg [23:0] do_ns = 0;
always @ (posedge sys_clk)
if(do_ns >= DO_FREQ_X2) do_ns <= 0;
else do_ns <= do_ns + CLK_NS;

wire do_r = (do_ns >= DO_FREQ_X2) ? 1’b1 : 1’b0; // 523.25Hz, 1911132 ns
always @ (posedge sys_clk)
if(do_r) do_freq <= ~do_freq;

这时 do_freq 输出的频率为 1 (do)以此类推。

按键选择代码:


 

根据不同的按键, 选择do, re, mi, fa, so, la, si 等不同的频率。

工程代码如下:

[content_control]

audio_demo.zip

[/content_control]

对应视频:

Posted in FPGA, FPGA 教材教案, FPGA开发板, 开发板, 教材与教案, 文章, 集成电路