定时器计数器

定时器:设置定时值,开始定时器之后,计数器开始计数,计数达到定时值后产生计数满标志信号,提示设定的时间到达。
计数器:计数时钟脉冲的上升沿或者下降沿的次数,或等待指定次数的脉冲波形信号出现后,产生响应信号。

蜂鸣器

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入门——蜂鸣器相关推荐

  1. 【FPGA】初探FPGA —— 入门过程的分享

    #悬崖上的花,越芬芳越无常~ 终于又抽出时间搞这个FPGA入门系列了.这个也是我之前在B站做的视频,关于FPGA入门的过程经验的一个总结,去帮助大家帮助了解FPGA的入门. 南信大电子工程师协会慕课计 ...

  2. 【FPGA入门九】状态机实验

    文章目录 一.实验任务 二.实验过程 1.测试过程状态机 ①新建工程 ②设计计时器模块Verilog HDL文件 ③设计状态机切换模块Verilog HDL文件 ④设计顶层模块Verilog HDL文 ...

  3. (05)FPGA入门条件

    (05)FPGA入门条件 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA入门条件 5)技术交流 6)参考资料 2 FPGA入门与提升课程介绍 1)FPGA入 ...

  4. FPGA入门基础介绍

    1.1 FPGA入门基础介绍 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA入门基础介绍: 5)结束语. 1.1.2 本节引言 "不积跬步,无以至千里 ...

  5. FPGA入门-腾讯云布道师团队-专题视频课程

    FPGA入门-203人已学习 课程介绍         本课程向大家介绍FPGA的基本概念和功能,并结合实际操作讲解实现原理和操作步骤,讲师也会带着大家演示一个实验. 课程收益     FPGA入门 ...

  6. FPGA入门学习记录(1)----自动售货机(VM_FSM)

    综述 在写一个自动售货机状态机并仿真,上板的过程中遇到了各种问题.在解决这些零碎的问题后,在防止自己忘记这些经验以及用电子介质取代纸质记录的目的下,写下此文. 这些零碎的经验主要分VeilogHDl语 ...

  7. FPGA入门到实战-学习笔记

    ref:腾讯教育 FPGA入门到实战-录播课-上海V3学院 https://ke.qq.com/course/66019 老师:尤恺元 第1课 掌握Verilog HDL的高级编码知识 授课日期: 老 ...

  8. FPGA入门实验-基于状态机实现串口回环收发

    任务目标 基于状态机实现串口回环收发.最近生产实习的FPGA培训课程内容,还是挺简单的.具体原理其他文章应该都烂大街了,重点是状态机的写法,还是很少博主写,没怎么看到,基本上都是时序机写的模块功能. ...

  9. 弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩

    弟中弟级,基于Vivado的IP核封装以及仿真调用,FPGA入门小玩 IP核:知识产权核,指某一方提供的.形式为逻辑单元的可重用模块.IP核通常已经通过了设计验证,设计人员以IP核为基础进行设计,可以 ...

最新文章

  1. 【铜】第174-9篇 一对一视频录制(九)一对多学生端删除白板及nginx下配CI
  2. 百度宣布AI语音调用登顶中国第一,自研芯片+最新端到端模型颠覆传统语音识别算法...
  3. C#自定义控件一下拉颜色框
  4. selectprovider 分页_MyBatis使用@SelectProvider拼接sql语句
  5. 程序包android.support.annotation不存在_efcore技巧贴也许有你不知道的使用技巧
  6. 凸集、凸函数、凸优化问题 概念关联
  7. C++ 著名程序库 概览
  8. java map排序_探索Java常用集合
  9. java enable_Java Compiler enable()方法与示例
  10. eclipse安装教程 以及汉化包安装
  11. 毕向东Java笔记(全部)
  12. DIY WINDOWS XP
  13. C语言实现推箱子游戏完整代码
  14. 记一次烧毁AO3400的过程
  15. python+openCV滑动条的使用
  16. spoj 1811 LCS 后缀自动机
  17. 单片机课程设计——基于51单片机温湿度检测系统的设计与实现
  18. 什么是计算机图形学?(转自中国科学技术大学-刘利刚)
  19. Dynamodb 备份策略
  20. USGS上下载的Landsat数据ENVI无法正常打开解决方法

热门文章

  1. vscode快捷设置左侧导航栏和文本字体大小
  2. 小米10获取root权限_360超级Root无法获取Root权限怎么处理?
  3. cadence原理图快捷键
  4. C语言-函数原型,指针与函数
  5. jdk8銝要onematch_JDK8新特性详解 - 纯粹而又极致的光--木九天 - OSCHINA - 中文开源技术交流社区...
  6. 阿里大鱼短信平台错误解决
  7. android实现自动取消订单,android – 使用RemoteView自动取消自定义通知
  8. 字段(C# 编程指南)
  9. 基于串口通信技术——让数码管显示的数据发送给电脑,电脑控制单片机外设——15单片机
  10. PowerDesigner概念设计模型(CDM)和E-R图