基于FPGA的超声波测距电路
- 格式:docx
- 大小:253.35 KB
- 文档页数:16
超声波测距电路图超声波测距电路原理和制作由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。
利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量精度方面能达到工业实用的要求,因此在移动机器人的研制上也得到了广泛的应用。
为了使移动机器人能自动避障行走,就必须装备测距系统,以使其及时获取距障碍物的距离信息(距离和方向)。
本文所介绍的三方向(前、左、右)超声波测距系统,就是为机器人了解其前方、左侧和右侧的环境而提供一个运动距离信息。
二、超声波测距原理1、超声波发生器为了研究和利用超声波,人们已经设计和制成了许多超声波发生器。
总体上讲,超声波发生器可以分为两大类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。
电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。
它们所产生的超声波的频率、功率和声波特性各不相同,因而用途也各不相同。
目前较为常用的是压电式超声波发生器。
2、压电式超声波发生器原理压电式超声波发生器实际上是利用压电晶体的谐振来工作的。
超声波发生器内部结构如图1所示,它有两个压电晶片和一个共振板。
当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。
反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。
3、超声波测距原理超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2图1 超声波传感器结构这就是所谓的时间差测距法。
超声波流量计的FPGA测试与仿真作者:巢明夏书峰杨国涛于泽来源:《数字技术与应用》2010年第08期摘要:在SOPC(System On Programmable Chip)技术的基础上,针对交叉声路时差法流量计,设计了一款基于FPGA技术的电路系统。
描述了所设计的电路系统的组成,给出了IP模块ModelSim仿真测试波形。
关键词:可编程片上系统可编程逻辑阵列知识产权核中图分类号:TH702 文献标识码:A 文章编号:1007-9416(2010)08-0182-021 引言超声波流量计利用流体对超声波信号的调制作用,通过检测信号的变化来获得体积流量[1]。
随着大规模集成电路技术的飞速发展,及流体的层流状态与絮流状态流速分布规律的理论分析,超声波流量计的测量精度得以进一步的提高[2]。
本文尝试利用SOPC技术实现流量计电路系统,这种设计有利于提高测量精度,便于系统升级。
2 系统结构(图1)整体电路结构如图2所示,FPGA是整个系统的控制核心,通过使用32位软核MicroBlaze及大量的IP,设计成能够完成数据处理能力及时序控制能力,记录超声波传播时间及阈值电压比较等一系列任务的SOPC系统。
(1)滤波放大电路:考虑到增益、带宽和噪声等的综合影响,采用多级放大[3],原理图如图2:(2)数据采集电路:使用高速ADC对超声波信号进行高速采集,然后对采集数据进行处理来实现高精度的时间分辨率。
数据采集电路的时序由FPGA控制,电路如图3所示:(3)数据存储电路自行设计了对SRAM进行合理的读写控制的IP核,完成系统采集数据的存储。
SRAM的存储电路如图4所示。
采用具有I2C总线接口的芯片AT24C64,对MicroBlaze处理完的数据进行保存。
采用Xilinx公司生产的Flash PROM作为FPGA的配置存储器[4]。
本文设计的硬件系统如图5所示,图中包含上文所描述的SOPC系统及周边电路系统。
3 SOPC中的IP模块采用VHDL语言设计系统所需的各个模块,主要实现的功能包括超声波脉冲发射接收电路的控制、噪声门限脉宽检测、超声波传播时间计数、超声波接收信号的最大值分析以及过零点和最大值的传输与存储控制等。
超声波测距电子电路设计详解在自主行走机器人系统中,机器人要实现在未知和不确定环境下行走,必须实时采集环境信息,以实现避障和导航,这必须依靠能实现感知环境信息的传感器系统来实现。
视觉、红外、激光、超声波等传感器都在行走机器人中得到广泛应用。
由于超声波测距方法设备简单、价格便宜、体积小、设计简单、易于做到实时控制,并且在测量距离、测量精度等方面能达到工业实用的要求,因此得到了广泛的应用。
本文所介绍的机器人采用三方超声波测距系统,该系统可为机器人识别其运动的前方、左方和右方环境而提供关于运动距离的信息。
超声波测距原理超声波发生器内部由两个压电片和一个共振板组成。
当它的两极外加脉冲信号,且其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。
反之,如果两极间未加外电压,当共振板接收到超声波时,就成为超声波接收器。
超声波测距一般有两种方法:①取输出脉冲的平均电压值,该电压与距离成正比,测量电压即可测量距离;②测量输出脉冲的宽度,即发射超声波与接收超声波的时间间隔t,根据被测距离s=vt?2来得到测量距离,由于超声波速度v与温度有关,所以如果温度变化比较大,应通过温度补偿的方法加以校正。
本测量系统采用第二种方法,由于测量精度要求不是特别高,所以可以认为温度基本不变。
本系统以PIC16F877单片机为核心,通过软件编程实现其对外围电路的实时控制,并提供给外围电路所需的信号,包括频率振动信号、数据处理信号等,从而简化了外围电路,且移植性好。
系统硬件电路方框图见图1。
图1 系统硬件电路方框图由于本系统只需要清楚机器人前方、左方、右方是否有障碍物,并不需要知道障碍物与机器人的具体距离,因此不需要显示电路,只需要设定一距离阀值,使障碍物与机器人的距离达到某一值时,单片机控制机器人电机停转,这可通过软件编程实现。
超声波发射电路超声波发射电路以PIC16F877为核心,当单片机上电时,单片机从RA0口产生40kHz的超声波信号,但是此时该信号无法通过与非门进入放大电路使超声波发射头发射超声波,只有闭合开关S1时,从RA1口发射出一门控信号,该信号的频率为4kHz,同时启动单片机内部的定时器TMR1,开始计数。
超声波测距电路设计及使⽤⼼得[电⼦电路]超声波测距电路设计由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因⽽超声波经常⽤于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。
利⽤超声波检测往往⽐较迅速、⽅便、计算简单、易于做到实时控制,并且在测量精度⽅⾯能达到⼯业实⽤的要求,因此在移动机器⼈的研制上也得到了⼴泛的应⽤。
为了使移动机器⼈能⾃动避障⾏⾛,就必须装备测距系统,以使其及时获取距障碍物的距离信息(距离和⽅向)。
本⽂所介绍的三⽅向(前、左、右)超声波测距系统,就是为机器⼈了解其前⽅、左侧和右侧的环境⽽提供⼀个运动距离信息。
⼆、超声波测距原理1、超声波发⽣器为了研究和利⽤超声波,⼈们已经设计和制成了许多超声波发⽣器。
总体上讲,超声波发⽣器可以分为两⼤类:⼀类是⽤电⽓⽅式产⽣超声波,⼀类是⽤机械⽅式产⽣超声波。
电⽓⽅式包括压电型、磁致伸缩型和电动型等;机械⽅式有加尔统笛、液哨和⽓流旋笛等。
它们所产⽣的超声波的频率、功率和声波特性各不相同,因⽽⽤途也各不相同。
⽬前较为常⽤的是压电式超声波发⽣器。
2、压电式超声波发⽣器原理压电式超声波发⽣器实际上是利⽤压电晶体的谐振来⼯作的。
超声波发⽣器内部结构有两个压电晶⽚和⼀个共振板。
当它的两极外加脉冲信号,其频率等于压电晶⽚的固有振荡频率时,压电晶⽚将会发⽣共振,并带动共振板振动,便产⽣超声波。
反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶⽚作振动,将机械能转换为电信号,这时它就成为超声波接收器了。
3、超声波测距原理超声波发射器向某⼀⽅向发射超声波,在发射时刻的同时开始计时,超声波在空⽓中传播,途中碰到障碍物就⽴即返回来,超声波接收器收到反射波就⽴即停⽌计时。
超声波在空⽓中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340t/2 。
这就是所谓的时间差测距法。
三、超声波测距系统的电路设计图2为声波测距电路原理图,图2为由软件产⽣40KHZ脉冲驱动发射头,若为简化软件算法,可采⽤图3硬件产⽣40KHZ脉冲,由NE555和反相器CD4069组成驱动电路。
基于fpga的多声路超声波流量计设计与实现随着科技的不断进步,超声波流量计已经成为了工业生产中不可或缺的一种仪器设备。
超声波流量计具有精度高、可靠性强、使用寿命长、维护简单等优点,已经成为了现代工业流量测量的主要手段之一。
本文将以《基于FPGA的多声路超声波流量计设计与实现》为主题,从超声波流量计的原理入手,介绍了FPGA技术在超声波流量计中的应用,并详细阐述了多声路超声波流量计的设计与实现过程。
一、超声波流量计的原理超声波流量计是一种以超声波传播速度变化来测量流体流速的仪器。
其工作原理是利用超声波传播速度与介质密度、粘度、温度等因素的关系,通过测量超声波在流体中传播的时间,从而计算出流体的流速。
超声波流量计通常由发射器、接收器、信号处理器、显示器等部分组成。
其中,发射器发出超声波信号,经过流体后被接收器接收,并通过信号处理器处理后输出流体的流速数据。
二、FPGA技术在超声波流量计中的应用FPGA(Field Programmable Gate Array)是一种可编程逻辑器件,它可以实现任意数字电路的设计与实现。
由于FPGA具有高速度、低功耗、可重构等特点,因此在超声波流量计的设计中,FPGA被广泛应用。
FPGA技术在超声波流量计中的应用主要包括以下几个方面:1、时序控制:超声波流量计需要精确地控制超声波的发射和接收时间,因此需要使用FPGA来实现时序控制功能。
2、数字信号处理:超声波信号经过接收器后需要进行数字信号处理,这需要使用FPGA来实现。
3、数据存储:超声波流量计需要将测量的数据进行存储,这需要使用FPGA来实现数据存储功能。
三、多声路超声波流量计的设计与实现多声路超声波流量计是一种可以同时测量多个流体管道流量的仪器。
它可以通过一组发射器和接收器,同时测量多个流体管道的流量,并将测量结果输出给用户。
多声路超声波流量计的设计与实现需要使用FPGA技术,具体流程如下:1、硬件设计:多声路超声波流量计的硬件设计需要包括多个发射器、接收器、信号处理器、数据存储器等部分。
《超声波测距仪电路设计》超声波测距仪电路设计超声波测距仪是一种常见的测距装置,它利用超声波的传播特性来测量目标物体与测距仪之间的距离。
其基本原理是利用超声波的发射和接收来计算目标物体与设备之间的距离。
超声波测距仪的电路设计包括发射电路和接收电路两部分。
1.发射电路设计超声波测距仪的发射电路主要包括发射器、脉冲发生电路和驱动电路。
发射器是将电能转换为声能的装置,一般采用压电陶瓷材料。
脉冲发生电路是用来产生发送的超声波脉冲信号的电路,常用的是555定时器芯片,通过设置合适的频率和占空比,可以实现超声波脉冲的产生。
驱动电路主要是将脉冲信号放大,并提供足够的电流和电压来驱动发射器。
2.接收电路设计超声波测距仪的接收电路主要包括接收器、放大电路和信号处理电路。
接收器是将接收到的声波信号转换为电信号的装置,常用的是压电陶瓷材料。
放大电路主要是将接收到的微弱信号放大到合适的电平,以便后续的信号处理。
信号处理电路包括滤波器和放大器,滤波器用于滤除杂散信号,放大器用于放大清晰的接收信号。
3.其他设计考虑除了发射电路和接收电路,还需要考虑一些其他设计因素。
第一,为了减小测量误差,需要加入合适的校准电路来对测量系统进行校准。
第二,为了方便使用,可以加入显示电路,将测量结果以数字或者模拟形式显示出来。
第三,为了提高抗干扰能力,可以加入滤波器和抗干扰电路来滤除干扰信号。
总之,超声波测距仪电路设计需要考虑发射电路、接收电路以及其他设计因素,合理配置各个部分的电路参数,并利用合适的元器件和电路拓扑结构,以提高测距仪的精度和稳定性。
在实际设计中,还需要考虑功耗、成本和尺寸等因素,以满足具体应用的要求。
超声波测距电路制作超声波测距电路制作超声波测距仪制作本超声波测距仪通过测量超声波发射到反射回来的时间差来测量与被测物体的距离。
可以测量0.35-10m的距离。
一、电路原理1 超声波发射电路由两块555集成电路组成。
IC1(555)组成超声波脉冲信号发生器,工作周期计算公式如下,实际电路中由于元器件等误差,会有一些差别。
条件: RA =9.1MΩ、RB=150KΩ、C=0.01μFTL = 0.69 x RB x C= 0.69 x 150 x 103 x 0.01 x 10-6 = 1 msecTH = 0.69 x (RA RB) x C= 0.69 x 9250 x 103 x 0.01 x 10-6 = 64 msecIC2组成超声波载波信号发生器。
由IC1输出的脉冲信号控制,输出1ms频率40kHz,占空比50%的脉冲,停止64ms。
计算公式如下:条件: RA =1.5KΩ、RB=15KΩ、C=1000pFTL = 0.69 x RB x C= 0.69 x 15 x 103 x 1000 x 10-12 = 10μsecTH = 0.69 x (RA RB) x C= 0.69 x 16.5 x 103 x 1000 x 10-12 = 11μsecf = 1/(TL TH)= 1/((10.35 11.39) x 10-6) = 46.0 KHzIC3(CD4069)组成超声波发射头驱动电路。
2 超声波接收电路超声波接收头和IC4组成超声波信号的检测和放大。
反射回来的超声波信号经IC4的2级放大1000倍(60dB),第1级放大100倍(40dB),第2级放大10倍(20dB)。
由于一般的运算放大器需要正、负对称电源,而该装置电源用的是单电源(9V)供电,为保证其可靠工作,这里用R10和R11进行分压,这时在IC4的同相端有4.5V的中点电压,这样可以保证放大的交流信号的质量,不至于产生信号失真。
基于FPGA的超声波数据采集系统的开题报告摘要:超声波在医学、工业、环保等领域得到了广泛应用。
超声波数据采集系统是超声波成像设备的重要组成部分。
本课题将基于FPGA设计超声波数据采集系统,实现数据采集、存储和显示功能。
本文将介绍超声波成像原理、FPGA基础知识、超声波数据采集系统的设计和实现,并对系统的性能进行测试和分析。
关键词:超声波数据采集系统;FPGA;数据存储;数据显示;性能测试一、课题背景超声波作为一种高频声波,其在医学、工业、环保等领域得到了广泛应用。
其中,医学领域应用最为广泛,主要用于人体内部器官的成像诊断。
超声波成像设备是医学超声诊断的主要手段之一,其核心部件是超声波探头。
超声波探头通过向人体内部发出超声波信号,然后接收信号回波并进行处理,最终形成图像。
超声波探头是通过FPGA集成电路对数据进行采集、处理和显示。
因此,基于FPGA的超声波数据采集系统设计研究已成为当今热门课题之一。
本课题旨在从超声波成像原理和FPGA基础知识出发,设计、实现一款超声波数据采集系统,能够实现数据采集、存储和显示功能,并对系统进行性能测试和分析。
二、研究内容和研究目标1. 研究超声波成像原理,了解其在医学、工业、环保等领域的应用;2. 研究FPGA基础知识,包括FPGA的硬件结构、IP核的使用和Verilog HDL语言的编写;3. 设计一款基于FPGA的超声波数据采集系统,包括硬件设计和软件设计;4. 实现超声波数据采集、存储和显示功能,并进行性能测试和分析。
三、研究方法和技术路线1. 超声波成像原理和FPGA基础知识的研究。
首先,通过文献调研和实验验证的方式,深入研究超声波成像原理,理解其在不同领域的应用。
然后,学习FPGA基础知识,包括FPGA的硬件结构、IP核的使用和Verilog HDL语言的编写。
2. 超声波数据采集系统的设计和实现。
基于之前的学习,根据超声波成像的特点,设计出一款基于FPGA的超声波数据采集系统,完成硬件和软件设计。
可编程逻辑器件及EDA技术课程设计基于FPGA的超声波测距电路和其扩展应用东北大学计算机科学与工程学院可编程逻辑器件及EDA技术课程设计——基于FPGA的超声波测距电路和其扩展应用摘要本课设使用FPGA和其他模块为硬件基础,以VHDL为硬件描述语言进行超声波测距电路的搭建,完成数码管精度为2厘米的实时显示,并且在基本电路的基础上使用蜂鸣器扩展出“倒车雷达”功能,在距离不同的区间内蜂鸣器会响出不同的频率的声音,总体是距离越小,频率越高。
过程中,进行了需求分析,可行性分析,模块建构和调试下载等过程,从中学到很多工程实践过程中的知识。
关键字:FPGA ;Quartus II;超声波测距;倒车雷达;VHDL目录一、需求分析 (3)二、功能描述 (3)三、可行性分析 (3)1.器件可行性分析 (3)2.功能可行性实现 (3)3.数据操作可行性 (4)四、模块化建构 (4)1.分频模块freq (4)2.触发模块launch (5)3.接收模块receive (5)4.扫描模块scan (5)5.显示模块display (6)6.计算模块measure (6)7.功能开关switch (6)五、编程下载 (6)编程 (6)下载 (6)六、课设感悟 (7)附录 (8)一、需求分析:本次课程设计要求用PFGA和所学VHDL知识进行设计具有某种具体功能的电路系统。
我本次课设选题为:基于FPGA的超声波测距电路和其扩展应用。
用以实践在课堂上所学知识内容,加深理解。
超声波测距是一般的电路系统,在生活中有很多应用,比如倒车雷达和扫地机器人自动避障等。
此功能在单片机上实现更为方便,成本也更低。
但此次课设使用FPGA用硬件描述语言来构建此电路是对FPGA本身功能和各模块使用的学习和提升。
二、功能描述:使在数码管上实时显示障碍物与测试模块的距离,要求显示米、分米和厘米位,数码管精度为2厘米,实时显示,并且在基本电路的基础上使用蜂鸣器扩展出“倒车雷达”功能,在距离不同的区间内蜂鸣器会响出不同的频率的声音,总体是距离越小,频率越高。
此功能在单片机上实现更为方便,成本也更低。
但此次课设使用FPGA用硬件描述语言来构建电路是对FPGA本身功能和各模块使用学习的提升。
三、可行性分析要实现以上所描述的功能,我们可以从三方面进行可行性分析:1.器件可行性分析>FPGAFPGA型号为EP4CE6E22C8N,其Total logic elements 为6272,满足大多数开发要求。
>PERIPHERAL”特权同学“开发板(SF-CY4),晶振(25MHZ),拨码开关4个,共阴极数码管(LG3641AH),蜂鸣器,按键等。
>超声波测距模块网上所购得超声波测距标准模块HC-SR04。
感应角度不大于15度;探测距离2cm-450cm ,高精度可达0.2cm;2.功能可行性实现用FPGA产生一满足超声波模块的触发信号,使之开始工作,等待接受回声信号。
回声引脚接受到回声信号后,开始记录整个高电平所持续时间,再根据脉冲周期计算的超声波往返的总时间,用公式S=340*T/2来计算相对距离(340为默认声速,可调)。
再开关选择打开时,蜂鸣器开始工作,根据超声波返回高电平信号记录周期数,设定判断距离标准。
到达某特定标准区间就产生一个特定频率信号给蜂鸣器,使之发出特定频率。
3.数据操作可行性VHDL 语言可以调用的IEEE 库,其中常用的IEEE.STD_LOGIC_1164IEEE.STD_LOGIC_ARITHIEEE.STD_LOGIC_UNSIGNED包含大多数数学运算需求和数据的类型转换,在此提出类型转换资料,方便今后的使用四、模块化建构根据功能要求可以分析需要建立的模块如下图:接下来进行逐步分析构建:1.分频模块freq板子提供的晶振为25MHZ ,而其他有关时钟的模块,考虑人眼视觉暂留,触发时间和所需精度要求,可以选取时钟频率分别为100KHZ 和1KHZ 。
采用“计数取反”的方法进行分频。
“计数分频”是指计数N 个取反一次逻辑信号会产生周期为2N 的频率信号,达到分频目的。
25MHZ 为100KHZ 的250倍,因而从0到124计数。
25MHZ 为1KHZ 的25000倍,因而从0到12499计数。
freq scanLaunch measuredisplay switch receive 412_U 100KHZ1KHZ 25MHZ TRIG ECHO SWDIG SEL 4_H/M/L SYSTEMBUZZER2.触发模块launch以分频模块提供的100KHZ 为时钟,周期为10微秒,其中高电平为5微秒。
已知超声波模块完成触发需要大于10微秒的高电平,所以需要至少两个周期(上升沿触发)。
另外,发射触发后需要等待接收到信号并进行处理再发射下一次触发,才能保证系统实时性。
不然会出现返回信号混叠引起计算错误。
再者,每次发射接收数据所需时间要保证两个方面:第一,发射周期要保证大于返回高电平持续的两倍;第二,数据刷新速度要适应人眼视觉感官。
第一个方面得不到保证会影响实时性。
第二个方面得不到保证会使人感觉数据变化突兀。
因而,占空比不为50%,且可大致画时序图如下:器件最大距离为4.5m ,计量时钟为100KHZ ,则触发周期可以计算为:122*N N N =+其中,1N 为触发计数上升沿数;2N 为测距往返最大值的上升沿计数。
(为满足发射和返回信号的实时性,应满足两倍的2N )。
其中为满足触发条件,1N 所以取值为5。
根据器件测量极限为4.5米,所以2 4.5/0.00001=2647340/m N s m s ⎛⎫= ⎪⎝⎭ 综合起来,N 最小为5299。
再考虑人眼适应性,经过调试取N 为12000。
3.接收模块receive以分频模块提供的100KHZ 为时钟,周期为10微秒。
本模块可以完成对ECHO的高电平持续时间计数。
模块要求高电平时开始计数,为低时把计数结果导出并持续到下一个下降沿的数据更新时,并把计数信号置零,等待重新计数。
注意,此时数据导出最好用UNSIGNED 模式,方便后级进行从二进制到整数的转化。
数据宽度根据最大测距距离可确定为12位。
时序图如下:由上计算,在频率为100KHZ 的时钟下,最大距离往返可以计数2647次,化成二进制为:1010_0101_0111,也即最大计数为12位宽的二进制表示。
4.扫描模块scan本模块以1KHZ 位时钟信号,产生“1110”,“1101”,“1011”,“0111”,四个数码管选择信号,完成数码管扫描的功能(数码管为低选通,当使用高选通时把上面对1和0进行取反)。
也相当于4分频,对每个数码管来说,其频率为1KHZ 的四分之一。
接下来传给显示模块。
5.显示模块display显示模块有两个总线输入,一个是显示选通信号(四位),另一个是数据输入信号(三个四位信号,对应高位,中位,低位)。
显示模块里有两个功能块,第一个是进行从BCD码到数码管的软译功能(区分数码管是共阴极还是共阳极),要注意高位为米位,其小数点位需要点亮。
第二个是完成高中低位和数码管显示的匹配。
高位在2号位,中位在1号位,低位在0号位。
6.计算模块measure计算模块是完成周期计数数据到米、分米和厘米的BCD码转换功能。
首先,对12位宽度的二进制进行转换,是指变成能进行运算的整数类型。
再者,我们知道超声波测距原理,S=340*T/2,所以可以用周期进行运算,并通过算法分离出三位十进制数分别代表米、分米和厘米位,在对他们进行转换成二进制便于电路传输。
7.功能开关switch此扩展功能模块,有很大的设计自由度。
设计输入为12位宽度的原始计数,在此先进行整型转换。
再根据所属不同范围产生不同的分频功能,分频结果输出到蜂鸣器。
也可以加入模块的功能控制端口和间隔音效。
五、编程下载编程:编程采用模块化设计的方法。
根据功能和所需参数分别设计顶层和底层文件,通过原件例化联系到一起。
具体模块代码见附录,最终结构化效果如右;下载:使用USB Blaster 将生成的.sof文件下载到芯片中,并进行端口配置,注意下载时保证FPGA的正常供电。
六、课设感悟本次课程设计的最后结果能准确实现最初设计的诸多功能,在实时性和稳定性上也良好表现。
最终实验板能显示米、分米和厘米位,数码管精度为2厘米,实时显示,并且蜂鸣器扩展出的“倒车雷达”功能,能使蜂鸣器在不同距离区间响出不同的频率的声音,总体是距离越小,频率越高。
当然,实验最有价值的东西不止是成功的喜悦,更有在实验过程中调试中不断发现问题解决问题和处理问题的经历,以及总结学习的工程实践的经验,在此作以总结:1.做FPGA的设计时,一定要先在脑海或设计本上规划好顶层各个模块的功能实现和参数设置,也要设计好底层某一模块具体功能的实现。
不能想到哪里就做到哪里,这样会在结合的时候非常浪费时间!2.底层模块功能设计完一定要仿真,确保能正常使用和兼容其他模块。
不能不验证就连接到整体系统中,一旦出现问题就会不知道从哪里检查问题,也很浪费时间!3.参数设置时要充分考虑VHDL所能调用的库的函数,这样能节省很多设计时间,直接调用即可。
4.当硬件描述语言没有问题时,板级调试出现错误或者与预想的结果不同时,可以从引脚到器件进行一步步的分析,很可能是引脚映射错误或者板子自身的问题。
5.要充分熟悉板子提供的外设的使用方法,比如高触发还是低触发等。
最后,非常感谢学院能给我们这样的机会,具体的把课本知识进行实践,在实践中深刻理解知识和具体操作问题。
附录HC-SR04工作原理:(1)主要技术参数:1、使用电压:DC5V;2、静态电流:小于2mA;3、电平输出:高5V;4、电平输出:底0V;5、感应角度:不大于15度;6、探测距离:2cm-450cm 7:高精度可达0.2cm;7、接线方式,VCC、trig(控制端)、echo(接收端)、GND。
(2)工作原理:1、采用IO触发测距,给至少10us的高电平信号;2、模块自动发送8个40khz的方波,自动检测是否有信号返回;3、有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时system.VHDlibrary IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;library altera;use altera.altera_syn_attributes.all;entity system isport(clk_in ,ECHO_N,SWITCH_N: in std_logic;TRIG_N,BUZZ_N: out std_logic;led_dig : out std_logic_vector(7 downto 0);led_sel : out std_logic_vector(3 downto 0));end system;architecture Behavioral of system issignal clk_100kHz,clk_1KHz,BUZZ:std_logic;signal led_sel_temp:std_logic_vector(3 downto 0);signal s1,s2,m1,m2,m3:std_logic_vector(3 downto 0);signal T,M:UNSIGNED(11 downto 0);component freq_div isport(clk_in_25MHz:in std_logic;clk_out_100KHz:out std_logic;clk_out_1KHz:out std_logic);end component;component MEASURE isPORT(T_12:IN UNSIGNED(11 DOWNTO 0);PLAY_H,PLAY_M,PLAY_L:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END component;component scanner isport(clk_in:in std_logic;led_sel:out std_logic_vector(3 downto 0));end component;component LAUNCH isPORT(CLK_10U:IN STD_LOGIC;TRIG:OUT STD_LOGIC);end component;component display isport(led_sel_in:in std_logic_vector(3 downto 0);H_4,M_4,L_4:in std_logic_vector(3 downto 0);led_dig:out std_logic_vector(7 downto 0);led_sel_out:out std_logic_vector(3 downto 0)); end component;component receive ISPORT(CLK_10U,ECHO:IN STD_LOGIC;TIM:OUT UNSIGNED(11 DOWNTO 0)); END component;COMPONENT switch1 ISPORT(CLK_100K,SWITCH:IN STD_LOGIC;TIM:IN UNSIGNED(11 DOWNTO 0);BUZZ: OUT STD_LOGIC );END COMPONENT;beginu1:freq_div port map(clk_in,clk_100KHz,clk_1KHz);u2:scanner port map(clk_1KHz,led_sel_temp);u3:LAUNCH port map(CLK_100KHz,TRIG_N);u4:display port map(led_sel_temp,m1,m2,m3,led_dig,led_sel); U5:MEASURE port map(T,m1,m2,m3);U6:receive PORT MAP(CLK_100KHz,ECHO_N,T);U7:switch1 PORT MAP(CLK_100KHz,SWITCH_N,T,BUZZ_N); end Behavioral;scanner.VHDlibrary IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity scanner isport(clk_in:in std_logic;led_sel:out std_logic_vector(3 downto 0));end scanner;architecture Behavioral of scanner isbeginprocess(clk_in)variable i:integer;beginif(clk_in'event and clk_in='1')thencase(i) iswhen 0=>led_sel<="1110";i:=1;when 1=>led_sel<="1101";i:=2;when 2=>led_sel<="1011";i:=0when others=>led_sel<="0000";i:=0;end case;end if;end process;end Behavioral;LUANCH.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY LAUNCH ISPORT(CLK_10U:IN STD_LOGIC;TRIG:OUT STD_LOGIC);END LAUNCH;ARCHITECTURE ONE OF LAUNCH ISSUBTYPE SUB_IN IS INTEGER RANGE 0 TO 12000; SIGNAL COUNT:SUB_IN;BEGINCOM:PROCESS(CLK_10U)BEGINIF CLK_10U'EVENT AND CLK_10U='1' THENIF COUNT=12000 THENCOUNT<=0;ELSECOUNT<=COUNT+1;END IF;END IF;END PROCESS;LUA:PROCESS(COUNT)BEGINIF COUNT=0 THENTRIG<='1';ELSIF COUNT=2 THENTRIG<='0';END IF;END PROCESS;END ARCHITECTURE;library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entity freq_div isport(clk_in_25MHz:in std_logic;clk_out_100KHz:out std_logic;clk_out_1KHz:out std_logic);end freq_div;architecture Behavioral of freq_div issignal temp_counter_1KHz:std_logic;signal temp_counter_100KHz:std_logic;beginprocess(clk_in_25MHz)variable cnt:integer range 0 to 12499;beginif(clk_in_25MHz'event and clk_in_25MHz='1')thenif(cnt<12499)thencnt:=cnt+1;elsecnt:=0; temp_counter_1KHz<=not temp_counter_1KHz;end if;end if;clk_out_1KHz<=temp_counter_1KHz;end process;process(clk_in_25MHz)variable cnt1:integer range 0 to 124;beginif(clk_in_25MHz'event and clk_in_25MHz='1')thenif(cnt1<124)thencnt1:=cnt1+1;elsecnt1:=0; temp_counter_100KHz<=not temp_counter_100KHz; end if;end if;clk_out_100KHz<=temp_counter_100KHz;end process;end Behavioral;library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;ENTITY display ISport(led_sel_in:in std_logic_vector(3 downto 0);H_4,M_4,L_4:in std_logic_vector(3 downto 0);led_dig:out std_logic_vector(7 downto 0);led_sel_out:out std_logic_vector(3 downto 0)); end display;architecture Behavioral of display issignal dig_temp:std_logic_vector(3 downto 0);beginprocess(led_sel_in,H_4,L_4)BEGINIF led_sel_in="1011" THENcase(H_4) iswhen"0000"=>led_dig<="10111111"; when"0001"=>led_dig<="10000110"; when"0010"=>led_dig<="11011011"; when"0011"=>led_dig<="11001111"; when"0100"=>led_dig<="11100110"; when"0101"=>led_dig<="11101101"; when"0110"=>led_dig<="11111101"; when"0111"=>led_dig<="10000111"; when"1000"=>led_dig<="11111111"; when"1001"=>led_dig<="11101111";when others=>led_dig<="11111111";end case;ELSIF led_sel_in="1101" THENcase(M_4) iswhen"0000"=>led_dig<="00111111"; when"0001"=>led_dig<="00000110"; when"0010"=>led_dig<="01011011"; when"0011"=>led_dig<="01001111"; when"0100"=>led_dig<="01100110"; when"0101"=>led_dig<="01101101"; when"0110"=>led_dig<="01111101"; when"0111"=>led_dig<="00000111"; when"1000"=>led_dig<="01111111"; when"1001"=>led_dig<="01101111";when others=>led_dig<="01111111";end case;ELSIF(led_sel_in="1110" ) THENcase(L_4) iswhen"0000"=>led_dig<="00111111"; when"0001"=>led_dig<="00000110"; when"0010"=>led_dig<="01011011";when"0011"=>led_dig<="01001111";when"0100"=>led_dig<="01100110";when"0101"=>led_dig<="01101101";when"0110"=>led_dig<="01111101";when"0111"=>led_dig<="00000111";when"1000"=>led_dig<="01111111";when"1001"=>led_dig<="01101111";when others=>led_dig<="01111111";end case;END IF;end process;led_sel_out<=led_sel_in;end Behavioral;MEASURE.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY MEASURE ISPORT(T_12:IN UNSIGNED(11 DOWNTO 0);PLAY_H,PLAY_M,PLAY_L:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );END ENTITY;ARCHITECTURE ONE OF MEASURE ISSIGNAL X,N,H,M,L:INTEGER;BEGINX<=conv_INTEGER(T_12);N<=X*17/100;H<=N/100;M<=(N-H*100)/10; --分米位L<=N MOD 10;PLAY_H<=CONV_STD_LOGIC_VECTOR(H,4);PLAY_M<=CONV_STD_LOGIC_VECTOR(M,4);PLAY_L<=CONV_STD_LOGIC_VECTOR(L,4);END ARCHITECTURE;receive.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY receive ISPORT(CLK_10U,ECHO:IN STD_LOGIC;TIM:OUT UNSIGNED(11 DOWNTO 0)); END receive;ARCHITECTURE ONE OF receive ISSUBTYPE SUB_IN IS INTEGER RANGE 0 TO 6000;SIGNAL TIM_COU:SUB_IN:=0;BEGINTIMC:PROCESS(ECHO,CLK_10U)BEGINIF CLK_10U'EVENT AND CLK_10U='1' THENif ECHO='1' THENTIM_COU<=TIM_COU+1;ELSETIM_COU<=0;END IF ;END IF ;IF ECHO'EVENT AND ECHO='0' THENTIM<=CONV_UNSIGNED(TIM_COU,12);END IF ;END PROCESS;END ARCHITECTURE;SWITCH1.VHDlibrary IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;ENTITY SWITCH1 ISPORT(CLK_100K,SWITCH:IN STD_LOGIC;TIM:IN UNSIGNED(11 DOWNTO 0);BUZZ:OUT STD_LOGIC );END ENTITY;ARCHITECTURE ONE OF SWITCH1 ISSIGNAL B,temp_counter, clk_out:STD_LOGIC;SIGNAL COUNT:integer range 0 to 49;SIGNAL T,COUNT_SUM:INTEGER;BEGINCMP:PROCESS(TIM)BEGINT<=CONV_INTEGER(TIM);IF T>=294 AND T<=589 THEN COUNT_SUM<=50; --1-0.5 1k ELSIF T>=176 and T<294 THEN COUNT_SUM<=25; --0.3-0.5 2k ELSIF T>=88 AND T<176 THEN COUNT_SUM<=10; --0.15-0.3 5k ELSIF T>=1 AND T<88 THEN COUNT_SUM<=4; --0.15-- 10k ELSE COUNT_SUM<=500;END IF;END PROCESS;process(clk_100K)variable cnt:integer range 1 to 25000;beginif(clk_100K'event and clk_100K='1')thenif(cnt<25000)thencnt:=cnt+1;elsecnt:=1; temp_counter<=not temp_counter;end if;end if;clk_out<=temp_counter;end process;EX:PROCESS(SWITCH,CLK_100K)BEGINIF SWITCH='0' THENIF CLK_100K'EVENT AND CLK_100K='1' THENIF COUNT<COUNT_SUM THENCOUNT<=COUNT+1;ELSECOUNT<=0;B<= NOT B;END IF;END IF;END IF;BUZZ<=B AND (NOT SWITCH) and clk_out;END PROCESS;END ONE;。