FPGA入门系列实验教程——蜂鸣器发出警车鸣笛声
1.实验任务
实现开发板上的蜂鸣器发出警车鸣笛声。通过这个实验,掌握采用Verilog HDL语言编程实现蜂鸣器发声的方法。
2.实验环境
硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。
软件实验环境为Quartus II8.1开发软件。
3.实验原理
艾米电子工作室开发板板载50MHZ的晶振,通过Verilog HDL语言编程将此频率分频后驱动一个I/O口。这个I/O口连接到一个交流蜂鸣器。通过改变这个I/O口的输出频率,就可以使蜂鸣器发出各种声音和音乐。本次实验实现蜂鸣器发出警车鸣笛声,问题现在变得比上个实验复杂起来。我们需要产生一个音调的变化,使之听起来像是警车的笛声。仍然从“tone”计数器开始。我们仅使用23位,这样便可以得到两倍与前面的频率(最高有效位大约以3Hz的频率翻转)。
下面是如何产生变化的音调的技巧。使用一个寄存器“ramp”来表征当前的音调,则要求ramp的值在某一区间来回变化,例如...---。考虑“tone”计数器的15到21位(tone[21:15]),这是一个在0到127之间循环递增的值,-127-0-。
再考虑这几位的反转,即~tone[21:15],这是一个在127-0之间循环递减的值。
如果能控制ramp在这两个值之间来回切换,即可得到一个形如...--的计数器。而这个变化规律正好符合警车笛声的音调变化规律。为了让ramp在这两个值之间来回切换,我们使用tone[22]来控制。可以这样考虑,tone[22:15]从0计数,对于前128个值(0-127),tone[22]等于0,后128个值(128-255),tone[22]等于1。于是我们就可以使用tone[22]来控制ramp的取值,当tone[22]等于0时,让ramp等于tone[21:15],当tone[22]等于1时,让ramp等于~tone[21:15]。这样一来ramp 就会在7b'0000000与7b'1111111之间来回变化.为了得到一个对于产生声音有用的值,我们在其前面补上两位数据"01",并且在其尾部也补上6个0,即"000000"。
通过这样的处理,"clkdivider"就拥有了一个在15'b010000000000000与15'b011111111000000之间来回变化的值(或者以16进制表示在15'h2000与15'h3FC0,以十进制表示在8192到16320之间变化)。当输入频率为50MHz 时,将产生频率在765Hz到1525Hz之间变化的音调,从而产生类似于警车笛声的声音。
4.实验程序
module beep(clk,beep);
input clk;
output beep;
reg beep;
reg[22:0]tone;
乃父
reg[14:0]counter;
always@(podge clk)
begin
tone<=tone+1;
end
wire[6:0]ramp=(tone[22]?tone[21:15]:~tone[21:15]);
wire[14:0]clkdivider={2'b01,ramp,6'b000000};
always@(podge clk)if(counter==0)counter<=clkdivider;
el counter<=counter-1;
always@(podge clk)
begin大学英语四级试题
if(counter==0)
beep<=~beep;
end
endmodule
5.实验步骤
(1)建立新工程项目:
打开Quartus II软件,进入集成开发环境,点击File→New project wizard建立一个工程项目beep。
(2)建立文本编辑文件:
点击File→New..在该项目下新建Verilog HDL源程序文件beep.v,输入
试验程序中的源程序代码保存后选择工具栏中的
rossion按钮,配置beep以及clk的引脚。
(5)编译工程项目:
在Quartus II主页面下,选择Processing→Start Compilation或点击工具
栏上的
6.实验现象
开发板上的蜂鸣器发出警车鸣笛声。现在让我们在本实验的基础上如何让FPGA发出“高速追击”的声音。这个时候警笛声时快时慢。因此使用"tone[21:15]"来得到一个快速的变调,而使用"tone[24:18]"来得到一个慢速的变调。
7.带高速追击的警车鸣笛声程序
module beep(clk,beep);
input clk;
output beep;
reg beep;
reg[27:0]tone;
reg[14:0]counter;
always@(podge clk)
大学英语四六级查询
束缚是什么意思begin
tone<=tone+1;
end
wire[6:0]fastsweep=(tone[22]?tone[21:15]:~tone[21:15]);
wire[6:0]slowsweep=(tone[25]?tone[24:18]:~tone[24:18]);
服务员英文怎么写wire[14:0]clkdivider={2'b01,(tone[27]?slowsweep:fastsweep),6'b000000}; always@(podge clk)
begin
if(counter==0)counter<=clkdivider;
el counter<=counter-1;
账本装订end
always@(podge clk)
begin
汽车熄火if(counter==0)
beep<=~beep;
end
endmodule
新鲁滨逊漂流记实验教程配套开发板一览:
swine
了解详情登陆淘宝店铺:
艾米电子淘宝店:/