目录

简单介绍:

设计思路

Verilog HDL硬件语言描述:

语言检测

引脚分配

综合

实现

器件配置



时间不饶人,我快速记录一下这个过程吧。


简单介绍:

蜂鸣器是一种最简单的发声元器件,它的应用也非常广泛,大都是作为报警或发声提醒装置。

PWM即脉冲宽度调制,PWM的输出只有高电平1和低电平0。PWM不停的重复输出周期为T,其中高电平1时间为t的脉冲,t/T是它的占空比,1/T是它的频率。

如下图是PWM信号:

下面是蜂鸣器电路原理及结构:

如下图:

BEEP网络连接到FPGA的IO上,当BEEP = 1时,三极管Q1的BE导通,则CE也导通,那么U4的2端直接接地,因此在它两端有5V的电压,那么蜂鸣器就发声了。同理,BEEP = 0时,Q1截止,U4的2端相当于开路,则蜂鸣器不会发出声音。

如下图:

基于蜂鸣器在FPGA的IO输出1就发声、0则不发声的原理,我们给IO口一个占空比为50%的PWM的信号,让蜂鸣器间歇性的发声鸣叫。

如果它的频率高则发声就显得相对尖锐急促一些,如果它的发声频率低则发声就显得低沉平缓一些。


设计思路

我们期望产生一个输出频率为25Hz(40ms)、占空比为50%的PWM信号去驱动蜂鸣器的发声。

因此,我们使用系统时钟25MHz(40ns)进行计数,每计数1,000,000次,这个计数器就清零重新计算。此外,为了得到输出的PWM占空比为50%,那么我们只要判断计数值小于最大计数值的一半即500000时,输出高电平1,反之输出低电平0。

打开ISE,新建一个工程,然后添加一个源文件,用来设计该电路。

Xilinx虽然早已不更新ISE软件了,目前的主流是VIvado,但是这也不能否认ISE,也就是集成软件环境的强大与人性化,你把代码设计好,然后把各种约束设计好,整个过程,就只需要动动手指,就可以如行云流水般进行了。

Verilog HDL硬件语言描述:

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date:    22:21:57 08/14/2018
// Design Name:
// Module Name:    beep
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments: get a 25Hz(40ms) signal to drive beep and system clock is 25MHz(40ns)
//
//
module beep(input  ext_clk_25m,input  ext_rst_n,output  beep);reg beep;reg [19:0] cnt; //20 bit get the maximum number of 1048575;//计数模块,计数达到1000 000次,计数器清零always @ (posedge ext_clk_25m or negedge ext_rst_n)beginif(!ext_rst_n)cnt <= 20'b0;else if(cnt < 20'd999_999)cnt <= cnt + 1'b1;elsecnt <= 20'b0;endalways @ (posedge ext_clk_25m or negedge ext_rst_n)beginif(!ext_rst_n)beep <= 1'b0;else if(cnt < 500_000)beep <= 1'b1;else beep <= 1'b0;endendmodule

如果觉得这个代码的注释比较少,那我把特权同学的代码也贴出来:

module sp6(input ext_clk_25m,    //外部输入25MHz时钟信号input ext_rst_n, //外部输入复位信号,低电平有效output reg beep  //蜂鸣器控制信号,1--响,0--不响);//-------------------------------------
reg[19:0] cnt;      //20位计数器//cnt计数器进行0-999999的循环计数,即ext_clk_25m时钟的1000000分频,对应cnt一个周期为25Hz
always @ (posedge ext_clk_25m or negedge ext_rst_n)    if(!ext_rst_n) cnt <= 20'd0;else if(cnt < 20'd999_999) cnt <= cnt+1'b1;else cnt <= 20'd0;//-------------------------------------//产生频率为25Hz,占空比为50%的蜂鸣器发声信号
always @ (posedge ext_clk_25m or negedge ext_rst_n) if(!ext_rst_n) beep <= 1'b0;else if(cnt < 20'd500_000) beep <= 1'b1; //蜂鸣器响else beep <= 1'b0;       //蜂鸣器不响endmodule

语言检测

代码输入进去之后,我们先测试一下代码是否正确,是否可以综合,需要先进行一下语法检测:

这里就省略了功能(行为)测试,因为我知道没问题。

由于这个小例子比较简单,用的FPGA资源也比较少,所以也没必须进行时序约束啦,时序约束省略。

引脚分配

之后在下图中的位置打开PlanAhead进行综合前的引脚分配:

引脚分配,就是要把硬件描述语言设计的电路的输入输出对应到你的FPGA开发板上,因此你需要知道自己的FPGA开发板的电路图,找到响应的引脚,对应下去:

我的练手的FPGA是Spartan-6,本实验要求的输入无非就是一个输入时钟,一个复位,输出就是一个beep,也就是蜂鸣器输出端。

找到对应的I/O端口:

将PlanAhead打开进行引脚分配,也叫引脚约束,然后保存约束,退出。

上图的中的引脚标准电压,为什么是LVCMOS33,我也不知道,我看特权的教程上就是这么用的。好像我用了别的也没有问题。知道了再说。

综合

之后我就可以进入综合的环节了:

同上,综合之后没什么问题,就可以直接进入实现阶段了,关于这些阶段是什么意思,可见我的另一篇博文:Xilinx FPGA开发流程

这是一篇纯理论分析的博文,本博文算是实践性的博文了。

实现

实现包括,转换、映射、布局布线,这三个过程没问题,我就可以进行下一步,产生一个可配置文件了,也就是一个bit流文件。

器件配置

之后就可以下载把FPGA开发板上进行调试了:

给FPGA上电,然后把仿真器都连接好,就可以进行如下步骤:

双击IMPACT,出现一下界面并点击Boundary Scan(边界扫描):

右击空白区域,添加Xilinx设备,选择beep.bit:

右击下图中的Xilinx 设备,然后Program:

Program成功之后,你的FPGA上的蜂鸣器就响了。

全过程实现一个最简单的FPGA项目之PWM蜂鸣器控制相关推荐

  1. Thinkphp入门-创建一个最简单的ThinkPhp项目工程

    从今天起,开始认真写博客,记录总结一些经验,也分享一下自己的学习过程. 说一说ThinkPhp入门创建工程吧,开始ThinkPhp应用编程的第一步. 软件环境: 1.phpstom,下载链接:点击打开 ...

  2. 基于Idea从零搭建一个最简单的vue项目

    一.需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.N ...

  3. 一个上手简单的小项目:抖音评论截流卖资料

    这个项目,就是在抖音上关注各种知识类博主,然后评论截流,引流到微信卖资料. Q:需要准备什么? A:一部手机,一个手机k,一个抖音浩. Q:数据上网还是连WIFI? A:3个以下的话,数据还是WIFI ...

  4. 简单的spring项目搭建流程

    一.搭建步骤 创建空maven项目 pom文件导入相应依赖jar包 创建包结构(domain.test即可) 创建JavaBean配置文件 编写简单示例 二.开始 1.创建一个空的maven项目  2 ...

  5. 手把手教你用JSP+Servlet+Tomcat实现一个最简单的Web应用

    JSP+Servlet+Tomcat实现一个简单的Web应用 需要使用到的技术 ①JSP ② Servlet ③Tomcat Web开发中的常见概念 Demo *本文针对编程务实实验内容,简单演示一下 ...

  6. 远程开机:一个简单的嵌入式项目开发

    本文通过一个简单的需求介绍了在一个 ARM 设备上开发一个程序实现远程打开服务器的过程,通过这个实例大致介绍了一个简单的嵌入式 Linux 开发的过程.本文并不会详细介绍网络唤醒的原理以及 Magic ...

  7. 【Java学习】从一个简单的HelloWorld项目中入门maven

    创建一个maven项目 这里推荐官方文档:maven官方文档 [注]此篇文章也是笔者学习笔记,如有错误,请见谅. [注]我把Goal翻译成命令.比如Plugin Goal: ps:我他喵的写了一大半的 ...

  8. maven学习笔记之IDEA+Maven+Jetty运行一个简单的web项目

    maven学习笔记 一.什么是maven Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Life ...

  9. 搭建Vue.js环境,建立一个简单的Vue项目

    基于vue-cli快速构建 Vue是近年来比较火的一个前端框架,所以搭建Vue.js环境,要装webpack,vue-cli,Vue 安装webpack命令如下 $ cnpm install webp ...

最新文章

  1. JAVA面试题(2)
  2. DFS(深度优先搜索)
  3. laravel 发送带附件的邮件
  4. 模糊数学笔记:二、模糊截集与分解定理
  5. 我不曾忘记的初心-冒险努力正是你缺少的!
  6. 类加载器的概述和分类
  7. java 反取字符串
  8. 使用media player控件播放歌曲 winform
  9. python中dir用法_Python dir()函数
  10. typora插入代码设置_五分钟快速上手神器Typora
  11. python安装无法直接安装的包
  12. 统计学习方法读书笔记16-SVM支持向量机
  13. 算数or算卦,和业务人谈“预测”到底在谈啥?
  14. 【用户端】家庭医生高保真Axure原型模板
  15. html中加减页码怎么设置,word中如何设置页码
  16. 最近的收获以及清明节的安排
  17. WebBrowser打开Word文档的一些注意事项
  18. 1927年12月31日午夜一秒谜案
  19. App首屏接口性能优化
  20. python画图小猪佩奇动画片全集_用Python画小猪佩奇

热门文章

  1. Win2003 Server手动设置全攻略
  2. iis php根目录可以访问子目录不行,wordpress在IIS下伪静态后子目录无法访问的解决方法...
  3. python安装后怎么配置环境变量_Python安装与环境变量的配置
  4. python通信测试_Python接口测试实战1(上)- 接口测试理论
  5. c语言万年历设计目的,万年历设计报告
  6. c语言50行以内有趣的代码,分享一段有趣的小代码
  7. mysql5.7 高可用_基于MySQL 5.7多源复制及Keepalived搭建三节点高可用架构
  8. php无法加载dll插件,php无法加载动态库怎么办
  9. Magnetism and Earnshaw‘s Theorem
  10. MDNICE使得你只需要关注内容