FPGA入门——蜂鸣器
定时器计数器
定时器:设置定时值,开始定时器之后,计数器开始计数,计数达到定时值后产生计数满标志信号,提示设定的时间到达。
计数器:计数时钟脉冲的上升沿或者下降沿的次数,或等待指定次数的脉冲波形信号出现后,产生响应信号。
蜂鸣器
1.分压式蜂鸣器:结构简单耐用但音调单一音色差,适用于报警器等设备。
2.电磁式:音色好。
按驱动电路分
1.有源蜂鸣器:内部带振荡源,通电就鸣叫。
2.无源蜂鸣器:内部不带振荡源,需要200~5K的方波驱动。(声音频率)
module beep_test(Clk, //时序逻辑电路必须有时钟逻辑,Rst_n, //必有复位逻辑 为0计数值清零Timer_count, //预设值 该定时器的定时时间参数可以通过该模块的一个端口输入,通过调节端口上输入数据的值,就能修改其定时时间。Counter_Mode, //计数模式控制信号,当该信号为1时,设置为循环定时模式,当该信号为0时,设置为单次定时模式。Counter_Go, //设置一个计数启动信号,在循环定时模式下,该信号为高电平使能计时,为低电平则停止计时。在单次计数模式下,该信号的一个单基准时钟周期的脉冲使能一次定时Counter_Out, //输出计数器实时计数值 Timer_flag //若达到定时时间向外产生标志信号
);input Clk;input Rst_n;input [31:0] Timer_count; //通用定时器 32位input Counter_Mode;input Counter_Go;output [31:0]Counter_Out;output reg Timer_flag;reg [31:0] count; //寄存器reg 32位 用于计数 核心单元reg Count_one_Go; // 单次定时的使能信号wire Timer_flag_r;assign Counter_Out = count;assign Timer_flag_r = (count == Timer_count)? 1'b1:1'b0; always @(posedge Clk)Timer_flag <= Timer_flag_r; //信号延迟一两拍用一级或二级D触发器 将Timer_flag改为reg寄存器型always @(posedge Clk or negedge Rst_n)if(!Rst_n)count <= 0; //count <=1'b0;else if(Counter_Mode == 1'b1) begin if((Counter_Go == 1'b1)&&(count<Timer_count)) //阻塞赋值 = 连续赋值 顺序执行count <= count + 1'b1; // 非阻塞赋值 <= 过程赋值 并行执行else count <= 0;end else if(!Counter_Mode) beginif((Count_one_Go == 1'b1)&&(count<Timer_count))count <= count + 1'b1; else count <= 0; endalways @(posedge Clk or negedge Rst_n) if(!Rst_n)Count_one_Go <= 0;else if((Counter_Go == 1'b1)&&(count<Timer_count)&&(!Counter_Mode))Count_one_Go <= 1'b1; else if(Timer_flag)Count_one_Go <= 1'b0; else Count_one_Go <= Count_one_Go;endmodule
Timer_flag 信号在计数满时刚好溢出,应屏蔽D触发器
编写蜂鸣器仿真文件
`timescale 1ns/1ns //前面时延单位 后面时间延迟精度
`define Clk_period 20 //晶振时钟周期
module beep_test_tb; //测试模块名称reg Clk;reg Rst_n;reg [31:0] Timer_count; //通用定时器 32位reg Counter_Mode;reg Counter_Go;wire [31:0]Counter_Out;wire Timer_flag;beep_test beep_test0(.Clk(Clk), //时序逻辑电路必须有时钟逻辑,.Rst_n(Rst_n), //必有复位逻辑 为0计数值清零.Timer_count(Timer_count), //预设值 该定时器的定时时间参数可以通过该模块的一个端口输入,通过调节端口上输入数据的值,就能修改其定时时间。.Counter_Mode(Counter_Mode),.Counter_Go(Counter_Go),.Counter_Out(Counter_Out), .Timer_flag(Timer_flag)
);initial Clk = 1; //产生时钟激励信号 一句话不用begin 所有逻辑都得加begin - endalways #(`Clk_period/2) Clk = ~ Clk ; //仿真时,initial和always同时开始执行,但是initial只执行一次,而always一直执行,直到仿真结束。initial begin Rst_n=0;Timer_count=0;Counter_Mode=0;Counter_Go=0;#(`Clk_period*20+1);Rst_n=1;#(`Clk_period*10);//循环模式预设值为1000Timer_count = 1000;Counter_Mode = 1;#(`Clk_period*20);Counter_Go=1;#(`Clk_period*1300);Counter_Go=0;#(`Clk_period*10);//循环模式预设值为900Timer_count = 900;Counter_Mode = 1;#(`Clk_period*20);Counter_Go=1;#(`Clk_period*1000);Counter_Go=0;#(`Clk_period*10);//单次计数模式预设值1000Timer_count = 1000;Counter_Mode = 0;#(`Clk_period*20);Counter_Go=1;#(`Clk_period);Counter_Go=0;#(`Clk_period*1500);//单次计数模式预设值900Timer_count = 900;Counter_Mode = 0;#(`Clk_period*20);Counter_Go=1;#(`Clk_period);Counter_Go=0;#(`Clk_period*1000);$stop;end
endmodule
编写蜂鸣器鸣叫的仿真文件
主要观察驱动信号beep的占空比。
`timescale 1ns/1ns //前面时延单位 后面时间延迟精度
`define Clk_period 20 //晶振时钟周期
module beep_top;reg Clk;reg Rst_n;reg Counter_Go;wire [31:0]Counter_Out;wire beep;assign Counter_Go_back = ~Counter_Go;beep_test beep_top1( //例化.Clk(Clk), //时序逻辑电路必须有时钟逻辑,.Rst_n(Rst_n), //必有复位逻辑 为0计数值清零.Timer_count(32'd49999), //预设值 蜂鸣器发声频率1K赫兹 周期50000ns 晶振周期20ns.Counter_Mode(1'b1),//模式固定,循环模式.Counter_Go(Counter_Go_back),// 板子上电后按键默认高电平,按下后低电平不发声.Counter_Out(Counter_Out), .Timer_flag() //全空信号不连接
);assign beep = (Counter_Out >= 2499)?1'b1:1'b0; initial Clk = 1; always #(`Clk_period/2) Clk = ~ Clk ; initial begin Rst_n=0;Counter_Go=1;#(`Clk_period*10+1);Rst_n=1;#(`Clk_period*5);Counter_Go=0;#(`Clk_period*60000);$stop;endendmodule
编写蜂鸣器鸣叫文件
按下按键鸣叫。
module beep_top( //以beep_test为子文件,设计顶层文件Clk, //时序逻辑电路必须有时钟逻辑,Rst_n, //必有复位逻辑 为0计数值清零Counter_Go, //输入外部信号端口 用按键控制beep //驱动蜂鸣器 蜂鸣器驱动管脚
); input Clk;input Rst_n; //定义端口功能 input Counter_Go;output beep;wire [31:0]Counter_Out; //内部 信号wire Counter_Go_back;beep_test beep_top1( //例化.Clk(Clk), //时序逻辑电路必须有时钟逻辑,.Rst_n(Rst_n), //必有复位逻辑 为0计数值清零.Timer_count(32'd49999), //预设值 蜂鸣器发声频率1K赫兹 周期50000ns 晶振周期20ns.Counter_Mode(1'b1),//模式固定,循环模式.Counter_Go(Counter_Go_back),// 板子上电后按键默认高电平,按下后低电平不发声.Counter_Out(Counter_Out), .Timer_flag() //全空信号不连接
);assign beep = (Counter_Out >= 2499)?1'b1:1'b0; assign Counter_Go_back = ~Counter_Go;endmodule
实验二:电子琴
编写产生预装载值用查找表输出ARR文件
通过控制不同周期来控制不同频率驱动蜂鸣器不同音调。
module ling_music(Clk,Rst_n,//复位端口ARR//预装载值
); input Rst_n;
input Clk;
output reg [31:0]ARR; //always 块中只能用reg类型的变量
reg [4:0]count; //累加计数 查找表中的地址编号 计数21足够 always @(posedge Clk or negedge Rst_n)if(!Rst_n)count <= 0;else if(count >= 5'd22) count <= count + 1;else count <= count + 1'b1 ;//查找表 输入不同的地址输出不同的数据
always@(*) begin //always描述组合逻辑:关注敏感信号用到的信号全都是敏感信号 组合逻辑用电平触发 时序逻辑用上升沿下降沿触发 always既能描述组合逻辑又能描述时序逻辑case(count) //在always中使用的信号必须是reg类型的0 :ARR = 191130;1 :ARR = 170241;2 :ARR = 151698;3 :ARR = 143183;4 :ARR = 127550;5 :ARR = 113635;6 :ARR = 101234;7 :ARR = 95546;8 :ARR = 85134;9 :ARR = 75837;10:ARR = 71581;11:ARR = 63775;12:ARR = 56817;13:ARR = 50617;14:ARR = 47823;15:ARR = 42563;16:ARR = 37921;17:ARR = 35793;18:ARR = 31887;19:ARR = 28408;20:ARR = 25309;default : ARR = 1991130;endcase
end
endmodule
编写查找表仿真文件
1.编写查找表仿真逻辑文件
定义reg型ARR_count将ARR的值计数显示出来
module ling_music(Clk,Rst_n,//复位端口ARR//预装载值
);
input Rst_n;
input Clk;
output reg [31:0]ARR; //always 块中只能用reg类型的变量
reg [4:0]count; //累加计数 查找表中的地址编号 计数21足够
reg [31:0]ARR_count; //将ARR的值计数显示出来always @(posedge Clk or negedge Rst_n)if(!Rst_n)ARR_count <= 0;else if(ARR_count >= ARR)ARR_count <= 0;else ARR_count <= ARR_count + 1'b1;always @(posedge Clk or negedge Rst_n) if(!Rst_n)count <= 0;else if(count >= 5'd21) count <= 0;else if(ARR_count >= ARR) count <= count + 1'b1 ;//查找表 输入不同的地址输出不同的数据
always@(*) begin //always描述组合逻辑:关注敏感信号用到的信号全都是敏感信号 组合逻辑用电平触发 时序逻辑用上升沿下降沿触发 always既能描述组合逻辑又能描述时序逻辑case(count) //在always中使用的信号必须是reg类型的0 :ARR = 191130;1 :ARR = 170241;2 :ARR = 151698;3 :ARR = 143183;4 :ARR = 127550;5 :ARR = 113635;6 :ARR = 101234;7 :ARR = 95546;8 :ARR = 85134;9 :ARR = 75837;10:ARR = 71581;11:ARR = 63775;12:ARR = 56817;13:ARR = 50617;14:ARR = 47823;15:ARR = 42563;16:ARR = 37921;17:ARR = 35793;18:ARR = 31887;19:ARR = 28408;20:ARR = 25309;default : ARR = 1991130;endcase
end endmodule
2.编写查找表仿真文件
`timescale 1ns/1ns //时延单位/时延精度
`define Clk_period 20
module ling_music_tb; reg Clk;reg Rst_n;//复位端口// reg ARR;//预装载值ling_music ling_music0( //模块名ling_music 实例名ling_music0.Clk(Clk),.Rst_n(Rst_n),.ARR()
);initial Clk = 1;
always #(`Clk_period/2) Clk = ~Clk; //产生时钟信号
initial beginRst_n = 0;#(`Clk_period*10);Rst_n = 1;#(`Clk_period*1847682);$stop;
end
endmodule
结果
层次化系统设计初步
beep_test模块复用,实列beep_test0 驱动蜂鸣器鸣叫 产生PWM波
实列beep_test1使用Timer_flag1作为标志250ms切换音调
module beep_top( //以beep_test为子文件,设计顶层文件Clk, //时序逻辑电路必须有时钟逻辑,Rst_n, //必有复位逻辑 为0计数值清零Counter_Go, //输入外部信号端口 用按键控制beep //驱动蜂鸣器 蜂鸣器驱动管脚); input Clk;input Rst_n; //定义端口功能 input Counter_Go;output beep;wire [31:0]Counter_Out; //输出计数值 信号wire Counter_Go_back;wire Timer_flag1;wire [31:0]Timer_count;beep_test beep_top0( // 驱动蜂鸣器鸣叫 产生PWM波 beep_top0实列用Counter_Out比较产生PWM波.Clk(Clk), //时序逻辑电路必须有时钟逻辑,.Rst_n(Rst_n), //必有复位逻辑 为0计数值清零.Timer_count(Timer_count), //预设值 蜂鸣器发声频率1K赫兹 周期50000ns 晶振周期20ns.Counter_Mode(1'b1),//模式固定,循环模式.Counter_Go(Counter_Go_back),// 板子上电后按键默认高电平,按下后低电平不发声.Counter_Out(Counter_Out), .Timer_flag() //全空信号不连接
);beep_test beep_top1( //模块复用 beep_top1实列使用Timer_flag1作为标志250ms切换音调.Clk(Clk), //时序逻辑电路必须有时钟逻辑,.Rst_n(Rst_n), //必有复位逻辑 为0计数值清零.Timer_count(12500000), //预设值 蜂鸣器发声频率1K赫兹 周期50000ns 晶振周期20ns.Counter_Mode(1'b1),//模式固定,循环模式.Counter_Go(1),.Counter_Out(), .Timer_flag(Timer_flag1)
);ling_music ling_music0(.Clk(Timer_flag1),.Rst_n(Rst_n),//复位端口.ARR(Timer_count)//预装载值
); assign beep = (Counter_Out >= 2499)?1'b1:1'b0; assign Counter_Go_back = ~Counter_Go;endmodule
更改ling_music模块
module ling_music(Clk,Rst_n,//复位端口ARR//预装载值
);input Rst_n;
input Clk;
output reg [31:0]ARR; //always 块中只能用reg类型的变量
reg [4:0]count; //累加计数 查找表中的地址编号 计数21足够
//reg [31:0]ARR_count; //将ARR的值计数显示出来//always @(posedge Clk or negedge Rst_n)
// if(!Rst_n)
// ARR_count <= 0;
// else if(ARR_count >= ARR)
// ARR_count <= 0;
// else ARR_count <= ARR_count + 1'b1;
// always @(posedge Clk or negedge Rst_n) if(!Rst_n)count <= 0;else if(count >= 5'd21) count <= 0;else count <= count + 1'b1 ;//查找表 输入不同的地址输出不同的数据
always@(*) begin //always描述组合逻辑:关注敏感信号用到的信号全都是敏感信号 组合逻辑用电平触发 时序逻辑用上升沿下降沿触发 always既能描述组合逻辑又能描述时序逻辑case(count) //在always中使用的信号必须是reg类型的0 :ARR = 191130;1 :ARR = 170241;2 :ARR = 151698;3 :ARR = 143183;4 :ARR = 127550;5 :ARR = 113635;6 :ARR = 101234;7 :ARR = 95546;8 :ARR = 85134;9 :ARR = 75837;10:ARR = 71581;11:ARR = 63775;12:ARR = 56817;13:ARR = 50617;14:ARR = 47823;15:ARR = 42563;16:ARR = 37921;17:ARR = 35793;18:ARR = 31887;19:ARR = 28408;20:ARR = 25309;default : ARR = 1991130;endcase
end endmodule
beep_top下载到开发板中
FPGA入门——蜂鸣器相关推荐
- 【FPGA】初探FPGA —— 入门过程的分享
#悬崖上的花,越芬芳越无常~ 终于又抽出时间搞这个FPGA入门系列了.这个也是我之前在B站做的视频,关于FPGA入门的过程经验的一个总结,去帮助大家帮助了解FPGA的入门. 南信大电子工程师协会慕课计 ...
- 【FPGA入门九】状态机实验
文章目录 一.实验任务 二.实验过程 1.测试过程状态机 ①新建工程 ②设计计时器模块Verilog HDL文件 ③设计状态机切换模块Verilog HDL文件 ④设计顶层模块Verilog HDL文 ...
- (05)FPGA入门条件
(05)FPGA入门条件 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA入门条件 5)技术交流 6)参考资料 2 FPGA入门与提升课程介绍 1)FPGA入 ...
- FPGA入门基础介绍
1.1 FPGA入门基础介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA入门基础介绍: 5)结束语. 1.1.2 本节引言 "不积跬步,无以至千里 ...
- FPGA入门-腾讯云布道师团队-专题视频课程
FPGA入门-203人已学习 课程介绍 本课程向大家介绍FPGA的基本概念和功能,并结合实际操作讲解实现原理和操作步骤,讲师也会带着大家演示一个实验. 课程收益 FPGA入门 ...
- FPGA入门学习记录(1)----自动售货机(VM_FSM)
综述 在写一个自动售货机状态机并仿真,上板的过程中遇到了各种问题.在解决这些零碎的问题后,在防止自己忘记这些经验以及用电子介质取代纸质记录的目的下,写下此文. 这些零碎的经验主要分VeilogHDl语 ...
- FPGA入门到实战-学习笔记
ref:腾讯教育 FPGA入门到实战-录播课-上海V3学院 https://ke.qq.com/course/66019 老师:尤恺元 第1课 掌握Verilog HDL的高级编码知识 授课日期: 老 ...
- FPGA入门实验-基于状态机实现串口回环收发
任务目标 基于状态机实现串口回环收发.最近生产实习的FPGA培训课程内容,还是挺简单的.具体原理其他文章应该都烂大街了,重点是状态机的写法,还是很少博主写,没怎么看到,基本上都是时序机写的模块功能. ...
- 弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩
弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩 IP核:知识产权核,指某一方提供的.形式为逻辑单元的可重用模块.IP核通常已经通过了设计验证,设计人员以IP核为基础进行设计,可以 ...
最新文章
- 【铜】第174-9篇 一对一视频录制(九)一对多学生端删除白板及nginx下配CI
- 百度宣布AI语音调用登顶中国第一,自研芯片+最新端到端模型颠覆传统语音识别算法...
- C#自定义控件一下拉颜色框
- selectprovider 分页_MyBatis使用@SelectProvider拼接sql语句
- 程序包android.support.annotation不存在_efcore技巧贴也许有你不知道的使用技巧
- 凸集、凸函数、凸优化问题 概念关联
- C++ 著名程序库 概览
- java map排序_探索Java常用集合
- java enable_Java Compiler enable()方法与示例
- eclipse安装教程 以及汉化包安装
- 毕向东Java笔记(全部)
- DIY WINDOWS XP
- C语言实现推箱子游戏完整代码
- 记一次烧毁AO3400的过程
- python+openCV滑动条的使用
- spoj 1811 LCS 后缀自动机
- 单片机课程设计——基于51单片机温湿度检测系统的设计与实现
- 什么是计算机图形学?(转自中国科学技术大学-刘利刚)
- Dynamodb 备份策略
- USGS上下载的Landsat数据ENVI无法正常打开解决方法
热门文章
- vscode快捷设置左侧导航栏和文本字体大小
- 小米10获取root权限_360超级Root无法获取Root权限怎么处理?
- cadence原理图快捷键
- C语言-函数原型,指针与函数
- jdk8銝要onematch_JDK8新特性详解 - 纯粹而又极致的光--木九天 - OSCHINA - 中文开源技术交流社区...
- 阿里大鱼短信平台错误解决
- android实现自动取消订单,android – 使用RemoteView自动取消自定义通知
- 字段(C# 编程指南)
- 基于串口通信技术——让数码管显示的数据发送给电脑,电脑控制单片机外设——15单片机
- PowerDesigner概念设计模型(CDM)和E-R图