ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:159.93KB ,
资源ID:10260127      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10260127.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于FPGA的超声波测距电路.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基于FPGA的超声波测距电路.docx

1、基于FPGA的超声波测距电路可编程逻辑器件及EDA技术课程设计 基于FPGA的超声波测距电路和其扩展应用摘要本课设使用FPGA和其他模块为硬件基础,以VHDL为硬件描述语言进行超声波测距电路的搭建,完成数码管精度为2厘米的实时显示,并且在基本电路的基础上使用蜂鸣器扩展出“倒车雷达”功能,在距离不同的区间内蜂鸣器会响出不同的频率的声音,总体是距离越小,频率越高。过程中,进行了需求分析,可行性分析,模块建构和调试下载等过程,从中学到很多工程实践过程中的知识。关键字:FPGA ;Quartus II;超声波测距;倒车雷达;VHDL一、需求分析:本次课程设计要求用PFGA和所学VHDL知识进行设计具有

2、某种具体功能的电路系统。我本次课设选题为:基于FPGA的超声波测距电路和其扩展应用。用以实践在课堂上所学知识内容,加深理解。 超声波测距是一般的电路系统,在生活中有很多应用,比如倒车雷达和扫地机器人自动避障等。此功能在单片机上实现更为方便,成本也更低。但此次课设使用FPGA用硬件描述语言来构建此电路是对FPGA本身功能和各模块使用的学习和提升。二、功能描述:使在数码管上实时显示障碍物与测试模块的距离,要求显示米、分米和厘米位,数码管精度为2厘米,实时显示,并且在基本电路的基础上使用蜂鸣器扩展出“倒车雷达”功能,在距离不同的区间内蜂鸣器会响出不同的频率的声音,总体是距离越小,频率越高。此功能在单

3、片机上实现更为方便,成本也更低。但此次课设使用FPGA用硬件描述语言来构建电路是对FPGA本身功能和各模块使用学习的提升。三、可行性分析 要实现以上所描述的功能,我们可以从三方面进行可行性分析: 1.器件可行性分析FPGAFPGA型号为EP4CE6E22C8N,其Total logic elements 为6272,满足大多数开发要求。 PERIPHERAL ”特权同学“开发板(SF-CY4),晶振(25MHZ),拨码开关4个,共阴极数码管(LG3641AH),蜂鸣器,按键等。 超声波测距模块 网上所购得超声波测距标准模块HC-SR04。 感应角度不大于15度; 探测距离2cm-450cm,高

4、精度可达0.2cm;2.功能可行性实现 用FPGA产生一满足超声波模块的触发信号,使之开始工作,等待接受回声信号。回声引脚接受到回声信号后,开始记录整个高电平所持续时间,再根据脉冲周期计算的超声波往返的总时间,用公式S=340*T/2来计算相对距离(340为默认声速,可调)。再开关选择打开时,蜂鸣器开始工作,根据超声波返回高电平信号记录周期数,设定判断距离标准。到达某特定标准区间就产生一个特定频率信号给蜂鸣器,使之发出特定频率。3.数据操作可行性VHDL语言可以调用的IEEE库,其中常用的IEEE.STD_LOGIC_1164IEEE.STD_LOGIC_ARITHIEEE.STD_LOGIC

5、_UNSIGNED包含大多数数学运算需求和数据的类型转换,在此提出类型转换资料,方便今后的使用四、模块化建构 根据功能要求可以分析需要建立的模块如下图:接下来进行逐步分析构建:1.分频模块freq板子提供的晶振为25MHZ,而其他有关时钟的模块,考虑人眼视觉暂留,触发时间和所需精度要求,可以选取时钟频率分别为100KHZ和1KHZ。采用“计数取反”的方法进行分频。“计数分频”是指计数N个取反一次逻辑信号会产生周期为2N的频率信号,达到分频目的。25MHZ为100KHZ的250倍,因而从0到124计数。25MHZ为1KHZ的25000倍,因而从0到12499计数。 2.触发模块launch以分频

6、模块提供的100KHZ为时钟,周期为10微秒,其中高电平为5微秒。已知超声波模块完成触发需要大于10微秒的高电平,所以需要至少两个周期(上升沿触发)。另外,发射触发后需要等待接收到信号并进行处理再发射下一次触发,才能保证系统实时性。不然会出现返回信号混叠引起计算错误。再者,每次发射接收数据所需时间要保证两个方面:第一,发射周期要保证大于返回高电平持续的两倍;第二,数据刷新速度要适应人眼视觉感官。第一个方面得不到保证会影响实时性。第二个方面得不到保证会使人感觉数据变化突兀。因而,占空比不为50%,且可大致画时序图如下:器件最大距离为4.5m,计量时钟为100KHZ,则触发周期可以计算为:其中,

7、为触发计数上升沿数; 为测距往返最大值的上升沿计数。(为满足发射和返回信号的实时性,应满足两倍的)。其中为满足触发条件,所以取值为5。根据器件测量极限为4.5米,所以 综合起来,N最小为5299。再考虑人眼适应性,经过调试取N为12000。3.接收模块receive以分频模块提供的100KHZ为时钟,周期为10微秒。本模块可以完成对ECHO的高电平持续时间计数。 模块要求高电平时开始计数,为低时把计数结果导出并持续到下一个下降沿的数据更新时,并把计数信号置零,等待重新计数。 注意,此时数据导出最好用UNSIGNED模式,方便后级进行从二进制到整数的转化。数据宽度根据最大测距距离可确定为12位。

8、 时序图如下: 由上计算,在频率为100KHZ的时钟下,最大距离往返可以计数2647次,化成二进制为:1010_0101_0111,也即最大计数为12位宽的二进制表示。4.扫描模块scan本模块以1KHZ位时钟信号,产生“1110”,“1101”,“1011”,“0111”,四个数码管选择信号,完成数码管扫描的功能(数码管为低选通,当使用高选通时把上面对1和0进行取反)。也相当于4分频,对每个数码管来说,其频率为1KHZ的四分之一。接下来传给显示模块。5.显示模块display显示模块有两个总线输入,一个是显示选通信号(四位),另一个是数据输入信号(三个四位信号,对应高位,中位,低位)。显示模

9、块里有两个功能块,第一个是进行从BCD码到数码管的软译功能(区分数码管是共阴极还是共阳极),要注意高位为米位,其小数点位需要点亮。第二个是完成高中低位和数码管显示的匹配。高位在2号位,中位在1号位,低位在0号位。6.计算模块measure计算模块是完成周期计数数据到米、分米和厘米的BCD码转换功能。首先,对12位宽度的二进制进行转换,是指变成能进行运算的整数类型。再者,我们知道超声波测距原理,S=340*T/2,所以可以用周期进行运算,并通过算法分离出三位十进制数分别代表米、分米和厘米位,在对他们进行转换成二进制便于电路传输。7.功能开关switch此扩展功能模块,有很大的设计自由度。 设计输

10、入为12位宽度的原始计数,在此先进行整型转换。再根据所属不同范围产生不同的分频功能,分频结果输出到蜂鸣器。也可以加入模块的功能控制端口和间隔音效。五、编程下载编程: 编程采用模块化设计的方法。根据功能和所需参数分别设计顶层和底层文件,通过原件例化联系到一起。具体模块代码见附录,最终结构化效果如右; 下载:使用USB Blaster 将生成的.sof文件下载到芯片中,并进行端口配置,注意下载时保证FPGA的正常供电。六、课设感悟本次课程设计的最后结果能准确实现最初设计的诸多功能,在实时性和稳定性上也良好表现。最终实验板能显示米、分米和厘米位,数码管精度为2厘米,实时显示,并且蜂鸣器扩展出的“倒车

11、雷达”功能,能使蜂鸣器在不同距离区间响出不同的频率的声音,总体是距离越小,频率越高。当然,实验最有价值的东西不止是成功的喜悦,更有在实验过程中调试中不断发现问题解决问题和处理问题的经历,以及总结学习的工程实践的经验,在此作以总结: 1.做FPGA的设计时,一定要先在脑海或设计本上规划好顶层各个模块的功能实现和参数设置,也要设计好底层某一模块具体功能的实现。不能想到哪里就做到哪里,这样会在结合的时候非常浪费时间! 2.底层模块功能设计完一定要仿真,确保能正常使用和兼容其他模块。不能不验证就连接到整体系统中,一旦出现问题就会不知道从哪里检查问题,也很浪费时间! 3.参数设置时要充分考虑VHDL所能

12、调用的库的函数,这样能节省很多设计时间,直接调用即可。 4.当硬件描述语言没有问题时,板级调试出现错误或者与预想的结果不同时,可以从引脚到器件进行一步步的分析,很可能是引脚映射错误或者板子自身的问题。 5.要充分熟悉板子提供的外设的使用方法,比如高触发还是低触发等。最后,非常感谢学院能给我们这样的机会,具体的把课本知识进行实践,在实践中深刻理解知识和具体操作问题。附录HC-SR04工作原理: (1)主要技术参数: 1、使用电压:DC5V; 2、静态电流:小于2mA; 3、电平输出:高5V; 4、电平输出:底0V; 5、感应角度:不大于15度; 6、探测距离:2cm-450cm 7:高精度可达0

13、.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_att

14、ributes.all;entity system is port ( 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_te

15、mp: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 is port(clk_in_25MHz:in std_logic; clk_out_100KHz:out std_logic; clk_out_1KHz:out std_logic);end component;component MEASURE is PORT(T_12:IN UNSIGNED(11 DOWNTO 0); P

16、LAY_H,PLAY_M,PLAY_L:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );END component;component scanner is port(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

17、_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,SWI

18、TCH: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

19、,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 is port(clk_in:in std_logic; led_sel:out std_logic_vect

20、or(3 downto 0);end scanner;architecture Behavioral of scanner isbeginprocess(clk_in)variable i:integer;beginif(clk_inevent and clk_in=1)thencase(i) is when 0=led_selled_selled_selled_sel=0000;i:=0;end case;end if;end process;end Behavioral; LUANCH.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE

21、.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 IS SUBTYPE SUB_IN IS INTEGER RANGE 0 TO 12000;SIGNAL COUNT:SUB_IN;BEGIN COM:PROCESS(CLK_10U) BEGIN IF CLK_10UEVENT AND CLK_10U=1 THEN IF COUNT=12

22、000 THEN COUNT=0; ELSE COUNT=COUNT+1; END IF; END IF; END PROCESS; LUA:PROCESS(COUNT) BEGIN IF COUNT=0 THEN TRIG=1; ELSIF COUNT=2 THEN TRIG=0; END IF; END PROCESS; END ARCHITECTURE;freq_div.VHDlibrary IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_arith.all;use IEEE.std_logic_unsigned.all;entit

23、y freq_div is port(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 is signal temp_counter_1KHz:std_logic;signal temp_counter_100KHz:std_logic;beginprocess(clk_in_25MHz) variable cnt:integer range 0 to 12499;beginif

24、(clk_in_25MHzevent and clk_in_25MHz=1)then if(cnt12499)then cnt:=cnt+1; else cnt:=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_25MHzevent and clk_in_25MHz=1)then if(cnt1

25、124)then cnt1:=cnt1+1; else cnt1:=0; temp_counter_100KHz=not temp_counter_100KHz; end if; end if; clk_out_100KHzled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_digled_dig=01111111; end case; END IF;end process;led_sel_ou

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1