找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10721|回复: 12
打印 上一主题 下一主题
收起左侧

基于FPGA的超声波测距设计 附quartus程序等

  [复制链接]
跳转到指定楼层
楼主
含有文档,PCB板,quartus程序。需要pcb程序请私聊。

目   录
1  绪论              1
1.1  课题研究的背景              1
1.2  国内外研究现状              1
1.3  超声波的特性              2

2  FPGA介绍              2
2.1  FPGA对于设计的必要性              3
2.2  可编程逻辑器件              4
2.3  FPGA的结构              4
3  基于FPGA测距系统硬件结构平台              5
3.1  FPGA核心板结构              5
3.2  超声波测距传感器              7
4  超声波测距系统程序设计及仿真              9
4.1  程序流程图              9
4.2  程序及仿真              10
4.3  顶层原理图              18

结论              19
致谢              20
参考文献              21
附录              22

1 绪论

1.1 课题研究的背景

科技飞速发展时至今日,超声波测距广泛应用于工业,农业,交通,环境,安全防护能源测量等科学领域,超声波测距的测量精度、测量距离,可靠性等性能指标对于提高相关应用系统的测控精度、可靠性,提高生产效率、促进科学技术的发展都具有极为重要的作用。随着经济的迅速发展,交通系统日益庞大,交通安全问题越来越被重视,安全防护现在变成为一个重要议题。近几年,船舶运输事故频发,复杂的水运环境,如大雨、大雾或夜间行驶常常导致航道的能见度降低,造成碰撞事故。由于超声波测距技术具有在黑暗、灰尘、烟雾等恶劣的环境下正常工作的特性,将超声波测距引入航运系统能切实可行的缓解这一问题。

超声波测距系统的设计结构多种多样,性能差异也各异。目前市面上主流的超声波测距系统大多是以8位或者16位单片机为主空芯片,产生驱动信号,并负责接收处理回波,控制现实通讯。这样处理成本固然降低了,但是测量精度,和测量距离,以及时序的控制能力有限。

超声波测距的核心在于超声波信号的收发部分,传统单片机内部指令运行时存在较大延时误差其精度无法满足精密测量的要求,本设计将FPGA(现场可编程门阵列)引入超声波测距系统的设计内,利用其较高的运行速度和丰富的片内资源,取代单片机,提高对超声波工作频率的控制精度以及对超声波收发渡越时间的测量精度。

1.2国内外研究现状            

超声波测距被大量应用于各种工业领域,诸如工业自动控制,建筑工程测量和机器人视觉识别等方面。和其他方法相比,比如激光测距、微波测距等,由于声波在空气中传播速度远远小于光线和无线电波的传播速度,对于时间侧量精度 的要求远小于激光测距、微波测距等系统,因而超声波测距系统电路易实现、结构简单和造价低,且超声波在传播过程中不受烟雾、空气能见度等因素的影响,在各种场合均得到广泛应用。

超声波测距作为一种典型的非接触测量方法,在很多场合得以应用。然而超声波测距在实际应用也有很多局限性。

超声波在空气中衰减极大,由于测量距离的不同,造成回波信号的起伏变化,不同幅度回波信号在通过固定门限比较器的整形过程中,回波到达时间的测t产生较大的误差,另外就是构成超声波传感器的压电陶瓷片在压电的双向转换过程中,存在惯性、滞后等现象,以及超声波脉冲在空气中传播本身及多重的反射路径,均导致回波信号被展宽,也使测量产生较大的误差,影响了测距的分辨率。其他还有一些因素,诸如环境温度,风速等也会对测量造成一定的影响。

目前国内外对超声波测距的研究主要集中在提高测距精度方面。由于超声波测距其测量范围与测量精度是相互矛盾的。要想得到较大的测量范围,需降低超声波的频率,而此时波长增大,测量精度则会降低;要想提高测量精度,需使用高频的超声波,其在空气中衰减很快,测量范围则会缩小。

超声波测距的精度主要取决于所测超声波传输时间的测量精度和超声波在介质中的传输速度这两方面。国外在提高超声波测距性能方面做了大量研究,国内相关学者也做了相关研究。提高传输时问的测量精度主要通过提高测距仪器的计时精度来实现。而对于超声波的传输速度的提高,主要通过采用高频的超声波换能器实现。高频的超声波换能器的工作中心频率,一般是几到十几MHz,由于换能器的工作频率很高,超声波衰减非常明显,这就对测距仪器的驱动信号的 驱动效率提出了更高要求,如何使驱动信号的中心频率精度提高成为了一个派生研究方向。

1.3超声波的特性

当物体振动时会发出声音。科学家们将每秒钟振动的次数称为声音的频率,它的单位是赫兹。我们人类耳朵能听到的声波频率为20~20000赫兹。当声波的振动频率大于20000赫兹或小于20赫兹时,我们便听不见了。因此,我们把频率高于20000赫兹的声波称为“超声波”。

超声和可闻声本质上是一致的,它们的共同点都是一种机械振动,通常以纵波的方式在弹性介质内会传播,是一种能量的传播形式,其不同点是超声频率高,波长短。

超声波是一种在弹性介质中的机械振荡,传播速度仅为光波的百万分之一,纵向分辨率较高。超声波对色彩、光照度、外界光线和电磁场不敏感,对于被测物处于黑暗、有灰尘或烟雾、强电磁干扰、有毒等恶劣的环境下超声波有很强的适应能力。

由于超声波的能量消耗缓慢,在介质中传播的距离较远,声波传播速度在相当大范围内与频率无关等独特优点,超声波被视为测距技术的一种良好选择在军事,工业,交通上有很多的应用。

2FPGA介绍

2.1  FPGA对于设计的必要性

在这里我们比较一下单片机与FPGA的性能特点:

单片机:可采用C语言编程,灵活多变,可以方便的实现复杂的指令控制。但是对时序控制实现能力较弱,组合逻辑能力较弱,程序执行采用顺序执行方式,外部自由使用I/O口数量有限,对于接口信号的频率控制能力较弱,运行速率约为几十兆赫兹,采用外部晶振的频率不能超过40MHz。

FPGA:采用硬件语言编程,没有指令控制系统,控制能力较弱。但具有很强的时序控制能力和逻辑组合能力,对于通信接口特别是高速接口可以将不同速率不同协议的耦合和桥接。运行速率约为几百兆赫兹,采用外部晶振的频率可超过100MHz。

整个系统的核心部分是超声波的收发控制端和信号处理部分,正是出于这种考虑现在主流的设计是采用单片机做为主控芯片负责产生超声波驱动信号并对回波进行数据处理,控制现实输出。

决定超声波驱动信号的效果,同时对于回波信号的处理,和整个超声波测距总计时,超声波周期的精确时间是一个重要的参数。对于驱动信号频率的严格控制,总计时的时间控制,是系统高性能保障重要条件。

现在主流的设计是采用单片机的中断加定时计数器来处理,为方便计算定时器初值,采用12MHz晶振来计算,无论是采用是采用哪种位定时器/计数器方式,驱动信号的频率精度都有限,与理论精度相差较大,随着进入中断之前执行任务的不同,定时器的计时值存在着多达3us以上的不确定误差;若采用定时器的对外部正脉冲自动计时的功能,将待测信号接入外部中断引脚,自动实现信号宽度的测量,该方案的计时精度也只能达到lus。而且计时的精度受制于单片机的运行速度,可提高空间很小;若采用TTL分立元件(如8253/8254)来实现计数器电路,这样计时的精度会有所提高,但计时频率可提高空间不大,如8254最高计时频率不超过10MHz。同时设计由于采用分立元件,体积也很大。

对回波到达时间的测量,对回波信号的辨识和综合处理也是系统设计的关键任务。实际上超声波换能器由于余震自身存在1到2us的不确定误差,若计时器自身的计时误差也是us级的,那么综合起来之后,误差又将增大。本设计中采用FPGA技术,利用其强大的时序处理能力,极高的运行速度(100MHz以上),同时,其丰富的内部资源又可以将前述的各种逻辑功能集中在一块芯片内部实现,体积也很小,FPGA(Field Programmable Gate Array)是可编程逻辑器件的一种。可编程逻辑器件是大规模集成电路技术发展的产物,是一种半定制的集成电路,结合计算机软件技术可以快速、方便地构建数字系统。以下简要介绍可编程逻辑器件及FPGA的发展、结构和功能特点。

2.2  可编程逻辑器件

随着微电子设计技术与工艺的发展,数字集成电路从电子管、晶体管、中小规模集成电路、超大规模集成电路(VLSIC)逐步发展到今天的专用集成电路(ASIC)。ASIC的出现降低了产品的成本,提高了系统的可靠性,缩小了设计科的物理尺寸,推动了社会的数字化进程。但是ASIC因其设计周期长,改版投资大,灵活性差等缺陷制约着它的应用范围。硬件工程师希望有一种更灵活的设计方法,根据需要,在实验室就能设计、更改大规模数字逻辑,研制自己的ASIC并马上投入使用,这是提出可编程逻辑器件的基本思想。

可编程逻辑器件随着微电子制造工艺的发展取得了长足的进步。从早期的只能存储少量数据,完成简单逻辑功能的可编程只读存储器(PROM)、紫外线可擦除只读存储器(EPROM)和电可擦除只读存储器,发展到成为可以完成超大规模的复杂组合逻辑与时序逻辑的可编程逻辑器件(CPLD)和现场可编程逻辑门阵列(FPGA)。随着工艺技术的发展与市场的需要,超大规模、高速、低功耗的新型FPGA/CPLD不断推陈出新。新一代的FPGA甚至集成了中央处理器(CPU) 或数字处理器(DSP)内核,在一片FPGA上进行软硬件协同设计,为实现片上可编程系统(SOPC,System On Programmable Chip)提供了强大的硬件支持。

2.3  FPGA的结构

FPGA生产厂家有Altera、Xilinx、Actel、Lattice等四家公司,其中Altera 和Xilinx主要生产一般用途FPGA,其主要产品采用RAM工艺。Actel主要提供非易失性FPGA,产品主要基于反熔丝工艺和FLASH工艺。其中Altera公司一直都处于可编程芯片系统(SOPC)领域的前沿和领袖地位,为业界提供最先进的可编程器件和相关软件工具、IP软件模块以及优秀的设计方案。其主流FPGA系列包括FLEX6000、FLEXl0K、ACEX、Cyclone、CyclonelI、APEX20K、APEXII、Stratix、Mercury、Exclibur等。

简化的FPGA基本由6部分组成,分别为可编程输入/输出单元,基本可编程逻辑单元,嵌入式RAM,丰富的布线资源,底层嵌入功能单元和内嵌专用硬核等,如图:

图2.1 FPGA的内部逻辑结构

3  基于FPGA测距系统硬件结构平台

3.1  FPGA核心板结构

该设计采用FPGA开发板,该开发板集成了多种功能,比如说像VGA接口、PS2 键盘接口、138译码的数码管、32pin外接口I/O、间距为2.54mm的外接插件、jtag调试接口、AS下载接口、DA数模转换芯片TLC5620、USB转串口接口、蜂鸣器、四个轻触按键。开发板的具体结构如下图所示:

图3.1 FPGA 开发板结构

从设计方面考虑要用到的部分是外接口I/O、138译码的数码管、jtag调试接口、AS下载端口、蜂鸣器等。在最初的设计思路中运用到了LED灯,轻触按键这些功能。运用这些功能的目的是对FPGA开发板进行一个初步的学习,从而实现一些简单的功能,进而向较难的功能迈出一小步。

该FPGA开发板所用的核心芯片为ALTERA公司的cyclone IV E系列芯片,具体型号为EP4CE6E22C8N。cyclone IV E系列的芯片通过了最低的成本实现了较高的功能,并且cyclone IV E系列的器件上边集成很多低成本的收发器。在不影响其整体功能的前提下,节省了很多成本。Cyclone IV E 系列在很多领域诸如像无线、通讯等都有着一些很有价值的应用。

cyclone IV E 器件系列具有以下特性:

(1)6k到150k的逻辑单元。

(2)高达6.3Mb的嵌入式存储器。

(3)高达360个18*18乘法器,实现DSP处理密集型的应用。

(4)协议桥接的应用,可以实现小于1.5W的总功率。

(5)低成本、低功耗的FPGA构架。


图3.1 cyclone IV E EP4CE6E22C8N 型号芯片

在选用该开发板之前,对实现一个具体系统应该有一个全方位的了解,针对系统的功能和需要的资源来具体选择FPGA开发板。下面针对cyclone IV E系列的EP4CE6E22C8N 型号芯片的具体需用单元做出介绍:

(1)具有可编程的输入输出端口

在该FPGA开发板中,I/O位于最左边的部分,总共有32个。它们是FPGA芯片与外界电路的重要接口部分,同时它们也完成不同的电器特性对I/O信号的驱动和匹配需求,在编写程序的时候,有时为了节省资源或为了程序的简洁性,目前大多数FPGA 端口都设计成具有可编程性的I/O接口。FPGA针对外部设备的接口具有可以编写程序并输入芯片的功能,所以这样就大大增加了FPGA的自由特性。

(2)较为丰富的布线资源

和cyclone系列的其他芯片一样,FPGA本身就具有非常丰富的布线资源,它的这个特点可以给开发工程师们非常多的自我选择,选择最简洁的布线方式和最简便的算法。这些布线的结构和连线的长度对信号的传输速度起到了非常重要的影响,所以算法的优先级和算法的优化就显的尤为重要了,它可能直接可以确定运算速度了。

(3)较低的功耗

Cyclone IV E系列芯片采用了经过优化后的60nm的工艺。它的内核电压相对于前几代的都有所降低。这在大规模集成电路的工程设计中既节省了资源,又降低了系统整体的功耗。这对于资源优化与资源的合理分布有这非同寻常的价值所在。

(4)全面的设计资源

该系列FPGA核心芯片运行流畅,其IP库也非常成熟,使用的是Quarters II开发软件。不管是程序调试方面还是下载、电路图仿真等方面都非常的便利。其嵌入式处理器采用的是NiosII处理,这是目前世界上最通用的嵌入式处理器。它可以使得综合电路运行的更为流畅,时钟频率更加稳定。

(5)全方位的时钟网络

该芯片时钟网络资源丰富,可以利用PLL进行分频、倍频;可以调用IP核对需要的时钟频率进行具体设定。并且在芯片处理系统中可以对不同的时钟信号进行同时处理。

3.2  超声波测距传感器

首先介绍超声波测量距离的原理,其次介绍超声波测距模块。超声波测距的基本原理可以这样认为,我们知道声音在空气里的传播速度大约是0.34千米/秒。超声波在空气中的传播速度大概也是0.34千米/秒,而这个速度受外界环境变化特别的小;况且超声波的波长相对于空气中的悬浮颗粒直径较大,因而可以有效的绕射过空气中的悬浮颗粒等直径比较小的障碍物,所以可以认为它在空气中的传播速度基本可以维持在0.34千米/秒。基于这个基本不变的速度,只需测出其发出去以及反射回来的时间差,然后在通过一定的计算,就可以得到发射端到目标物体的距离了。

由以上的超声波测量距离的原理图就可以知道距离S可以被很简洁的表达出来了。可以把声速表示成V,超声波从发射到接收的时间差为T,这样距离就可以被表达成S=V*T/2。图3.2中的方法可称为间接测距法。还有一种直接测距的方法,直接测距就是将测距系统的发射端口和接收端口对准。发射的超声波直接进入接收端,这样就可以直接计算出其测量的距离了。这种测距系统并不仅仅局限于超声波测距系统,在一些激光测距、红外测距等系统方面也有着一定价值的应用。

图3.2 超声波测量距离的原理图

在本设计中利用超声波在空气中的传播原理,按照S=V*T/2的关系计算出1毫米的时钟高电平个数。利用距离单位的逐项叠加,逐个进位的方式计算出其距离。

图3.3 超声波模块

基于FPGA的超声波测距系统利用的超声波模块型号为HC_SR04,它实际上采用的是给模块上的trig端口一个触发电平,让其触发超声波的发出。

首先,在使用该模块之前,对该超声波模块进行了简单的端口测试。利用电压源给该模块接上5V的电压。利用信号发生器产生一个10us的高电平脉冲信号,将此信号加到trig接口上,这样就完成了对该超声波模块的触发。然后将示波器探头接在超声波模块的echo端口上,观察示波器会显示以下信号:

图3.4 示波器观测图

图3.5 信号源信号图

由图3.5中的信号源可以看出,设置占空比为20%,脉冲电压为5V,周期为50us。这样信号源就可以产生一个10us的连续脉冲,将此脉冲信号送给trig端口,然后在超声波模块上的echo端口上加上示波器来测量echo上的信号变化。图3.4所示,可以清楚的看到echo信号也呈现周期性变化,其原因就是给trig输入的信号成周期性变化,每次经过10us的连续高电平,超声波就会发出一个调制的脉冲信号,该调制信号返回后,echo端的信号就会由高电平瞬间变回低电平了,所以echo信号的周期性变化是由trig信号的周期性变化引起的。还有一个值得注意的问题,观察示波器的峰峰值可以看出echo反馈的高电平和给超声波模块的VCC端口所输入的电压信号的高电平值是一样大的,因此就要考虑FPGA开发板的I/O接口所承受的最大耐压值;比如像Xilinx的Basys系列的开发板I/O接口电压承受值为3.3V,这种情况就要给echo接口加一个分压电阻。以免返回电压过大而对芯片造成一定程度的损伤。而ALTERA系列开发板的I/O接口一般情况可以承受5V的电压值,因此可以直接将I/O接口与echo端口和trig端口接在一起。

4超声波测距系统程序设计及仿真

4.1 程序流程图

下图给出了系统软件设计的整体框架,实际上由于FPGA内的各个子进程都是并行执行的,且每个子进程都是是独立的模块,因此程序设计并不是按照顺序的方法设计的,而是分离成各个小的子模块进行设计综合的,需要严格控制时序。

超声波收发部分负责产生超声波驱动信号,要求频率为50MHz,占空比为50的方波信号以驱动超声波换能器,同时高速计数器开始计数,检测回波后,计数器停止计数,计算后控制显示输出。

            

图4.1 系统软件设计框图

4.2程序及仿真

主控制模块代码:

  1. <font style="font-size: 12pt">module temper(
  2. input        CLOCK_50,               // 板载时钟50MHz
  3. input        Q_KEY,                  // 板载按键RST
  4. input        clk_1_sec,            
  5. input        echo,                     //回响信号输出
  6. output       reg   trig,                //超声波模块触发信号输入     
  7.     output   [15:0]codeshow     
  8. );  
  9. //-------------------------------------
  10. //reg   trig;
  11.               reg   [11:0]cnt;            //计数器,计250个50ns,12.5us,为echo提供时序
  12.               reg   [13:0] cnt1;           //计数器,计8000个12.5us,100ms
  13.               reg   [20:0]cnt3;             //计数124个时钟周期是1mm
  14.               reg   [19:0] dis  ;     
  15.               reg
  16.               echo_buf,                  //echo的上一个时钟的状态
  17.               echo_rising,               //捕捉echo的上升沿
  18.               echo_falling,              //捕捉echo的下降沿
  19.               flag1;                     //echo为高电平时flag1会是1,低电平时会是0
  20.     reg[3:0]beed1;   
  21.     reg[3:0]beed2;   
  22.     reg[3:0]beed3;
  23.     reg[3:0]beed4;
  24. assign codeshow={beed4,beed3,beed2,beed1};
  25. //产生echo控制信号250*8000*50ns,echo高电平持续12.5us,即250个时钟周期
  26. always@(posedge CLOCK_50)                  
  27.               begin
  28.               if(cnt == 2)//599
  29.               cnt <= 1'b0;
  30.               else
  31.               cnt <= cnt +1;
  32.               end
  33. always@(posedge CLOCK_50)
  34. begin
  35.               if(cnt == 2)//599
  36.               if(cnt1 == 20)//9999
  37.                             begin
  38.                                           trig <= 1'b1;
  39.                                           cnt1 <= 1'b0;
  40.                             end
  41.               else
  42.                             begin
  43.                                           trig <= 1'b0;
  44.                                           cnt1 <= cnt1 + 1'b1;
  45.                             end
  46. end
  47. //捕捉trig上升沿与下降沿,并产生标志位
  48. always@(posedge CLOCK_50, negedge Q_KEY)
  49. begin
  50. if (!Q_KEY) echo_buf <= 1'b0;
  51. else
  52.               begin
  53.               echo_buf <= echo;
  54.               echo_rising <= echo & (~echo_buf);
  55.               echo_falling <= (~echo) & echo_buf;
  56.   end
  57. end
  58. always@(posedge CLOCK_50)
  59.               begin
  60.               if(echo_rising == 1'b1)
  61.               begin
  62.     flag1 = 1'b1;                       //echo已经变为高电平
  63.     end
  64.     else if(echo_falling == 1'b1)
  65.               begin
  66.               flag1 = 1'b0;                       //echo已经变为低电平
  67.               end
  68.               end
  69. //在flag1 = 1 期间计时,即对时钟进行计数。(4m的距离会是25ms,1mm是125个时钟周期)
  70. always@(posedge CLOCK_50, negedge Q_KEY)
  71.               begin
  72.                   if (!Q_KEY) dis<= 19'b0;
  73.                   else
  74.                   begin
  75.                             if(flag1 == 1'b1)
  76.                             begin
  77.                             if(cnt3 == 25)      // 700000              //1mm
  78.                                           cnt3 <= 1'b0;
  79.                             else
  80.                                           cnt3 <= cnt3 + 1'b1;
  81.                             end
  82.                             else if(echo_rising == 1'b1)
  83.                             begin
  84.                                 dis <=cnt3/1;   //dis <=cnt3/290;
  85.                                           cnt3 <= 1'b0;
  86.                   end
  87.                   end
  88.               end
  89. always @ (posedge clk_1_sec, negedge Q_KEY)
  90.   begin
  91.   if (!Q_KEY)
  92.   Begin
  93. beed    <= 1'b0
  94.       beed1   <= 4'b0;
  95.       beed2   <= 4'b0;
  96.       beed3   <= 4'b0;
  97.       beed4   <= 4'b0;
  98. end
  99. else begin
  100.               beed1 <=dis/1000;
  101.               beed2 <=dis%1000/100;
  102.               beed3 <=dis%100/10;
  103.               beed4 <=dis%10;
  104. if(dis>16)begin beed<= 1'b0; end
  105.      else begin beed<=1'b1; end
  106.   end
  107. end
  108. endmodule</font>
复制代码


通过主控制程序,可以实现超声波测距以及当测量距离小于一定长度时,蜂鸣器报警,报警距离可以通过改代码,实现想要的报警的距离。下面是通过波形仿真的结果。如图所示:

图4.2 测距并报警

分频模块代码:

  1. <font style="font-size: 12pt">module div_50M(
  2.   input      clk,//50
  3.   input      rst_n,//
  4.   output     o_clk,//1HZ
  5.   output     o_clk1hz//1KHZ
  6. );
  7. // 分频模块开始
  8. reg [25:0] cnt;                         // 计数子
  9. reg [25:0] cntt;                         // 计数子
  10. reg regclk1hz;
  11. reg rego_clk;
  12. assign o_clk1hz=regclk1hz;
  13. assign o_clk=rego_clk;
  14. always @ (posedge clk, negedge rst_n)
  15.   if (!rst_n)
  16.     cntt <= 0;
  17.   else
  18.     if (cntt == 2)//cnt == 24_999_)//50M/1000=X,X/2-1=24999
  19.       begin
  20.       cntt <= 0;
  21.       regclk1hz=(~regclk1hz);//1KHZ
  22.       end
  23.     else
  24.     cntt <= cntt + 1'b1;
  25. always @ (posedge clk, negedge rst_n)
  26.   if (!rst_n)
  27.     cnt <= 0;
  28.   else
  29.     if (cnt == 1)//cnt == 24_999_999)
  30.     begin
  31.       cnt <= 0;
  32.       rego_clk=(~rego_clk);//1KHZ
  33.       end
  34.     else
  35.     cnt <= cnt + 1'b1;                  
  36. // 分频模块结束</font>
复制代码



Endmodule

上述代码中输出的1KHZ时钟,在之后进行译码器扫描。分频模块仿真如下图示:

图4.3 分频模块仿真

译码器模块代码:

  1. <font style="font-size: 12pt">module yimaqi(clkshow ,codeshow,duan,wei);
  2. input clkshow;//1K的扫描时钟输入
  3. input [15:0]codeshow;//4个数码管的显示数据输入,共16位,每4位一个密码
  4. output [7:0]duan;//数据段选输出
  5. output [3:0]wei;//动态扫描的位选输出
  6. reg  [3:0]dig1;
  7. reg [3:0]SEGAA;
  8. reg [3:0]countt;
  9. reg [7:0]LED;
  10. always @(posedge clkshow )
  11. begin
  12.      countt=countt+1'b1;
  13.      if(countt>3)begin countt=0;end
  14.               case (countt)
  15.               0: SEGAA<=codeshow[3 : 0];
  16.      1: SEGAA<=codeshow[7 :4];
  17.      2: SEGAA<=codeshow[11 : 8];
  18.      3: SEGAA<=codeshow[15 : 12];                                            
  19.      default: countt=0;
  20.               endcase
  21.                 case (countt)//动态扫描的位选输出
  22.                             0:dig1=4'b0001 ;
  23.                             1:dig1=4'b0010 ;
  24.                             2:dig1=4'b0100 ;
  25.                             3:dig1=4'b1000 ;                                            
  26.      default: countt=0;
  27.               endcase
  28. end
  29. assign wei=dig1;
  30. always @(SEGAA )//数据段选输出
  31. begin
  32.     case (SEGAA)            //hgfedcba
  33.                             4'h0:LED=8'b11000000;//--0
  34.                             4'h1:LED=8'b11111001;//--1
  35.                             4'h2:LED=8'b10100100;//--2
  36.                             4'h3:LED=8'b10110000;//--3
  37.                             4'h4:LED=8'b10011001;//--4
  38.                             4'h5:LED=8'b10010010;//--5
  39.                             4'h6:LED=8'b10000010;//--6
  40.                             4'h7:LED=8'b11111000;//--7
  41.                             4'h8:LED=8'b10000000;//--8
  42.                             4'h9:LED=8'b10010000;//--9
  43.                             4'ha:LED=8'b10001000;//--a
  44.                             4'hb:LED=8'b10000011;//--b
  45.                             4'hc:LED=8'b11000110;//--c
  46.                             4'hd:LED=8'b10100001;//--d
  47.                             4'he:LED=8'b10000110;//--e
  48.                             4'hf:LED=8'b11111111;//--off
  49. endcase
  50. end
  51. assign duan=(dig1==4'b0001)?(LED&8'b01111111):LED;
  52. Endmodule</font>
复制代码


译码器模块,通过扫描检测到的1KHZ时钟输入,把测量到的距离显示到数码管上,译码器模块仿真如下图所示:

图4.4 数码管显示仿真

4.3顶层原理

顶层原理图主要分为三个模块,分别为分频模块,主控制模块,译码器模块。还有超声波模块接口,以及数码管模块接口。如下图所示:

图4.5 原理图


结  论

此次的期末大作业,虽然经历了一次次的困难,但积累了很多宝贵的经验。在整个设计的过程中遇到的问题主要有以下三点,第一:基础知识掌握的不牢固,对书本上的内容理解不够透彻,没有掌握好编程相关知识。第二:超声波测距这个模块程序的编写没有思路、对VerilogHDL语言的不熟悉导致直接在程序中使用乘除法和取余等符号,虽然编译器没有报错,但是运行完后根本没有结果,也不能综合出一个完整的电路。第三:相关知识掌握的不够全面,缺少系统设计的经验。

这次大作业进一步端了我的学习态度,学会了实事求是,严谨的作风,对自己要严格要求,不能够一知半解,要力求明明白白。急于求成是不好的,我有所感受。如果省略了那些必要的步骤,急于求成,不仅会浪费时间,还会适得其反。我觉得动手之前,头脑里必须清楚该怎么做,这一点是很重要的。就目前来说,我的动手能力虽然差一点,但我想,通过我的不懈努力,在这方面,我总会得到提高。这一点,我坚信。因为别人能做到的,我也一定能做到。




全部资料51hei下载地址:

FPGA程序仿真.rar (1.24 MB, 下载次数: 157)

基于FPGA的超声波测距.docx (1.11 MB, 下载次数: 114)




评分

参与人数 2黑币 +80 收起 理由
外星人11111 + 30
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:545299 发表于 2019-5-23 09:15 | 只看该作者
thanks,学习学习
回复

使用道具 举报

板凳
ID:545299 发表于 2019-5-23 18:33 | 只看该作者
写的很好,很有帮助
回复

使用道具 举报

地板
ID:627296 发表于 2019-12-21 16:32 来自手机 | 只看该作者
写的好,有帮助
回复

使用道具 举报

5#
ID:627296 发表于 2019-12-21 16:34 来自手机 | 只看该作者
超声波有用
回复

使用道具 举报

6#
ID:627296 发表于 2019-12-23 10:54 来自手机 | 只看该作者
大佬,那个599咋算的

Screenshot_20191223_105349.jpg (113.53 KB, 下载次数: 138)

Screenshot_20191223_105349.jpg
回复

使用道具 举报

7#
ID:681147 发表于 2020-1-4 17:21 | 只看该作者
有引脚锁定么
回复

使用道具 举报

8#
ID:707049 发表于 2020-3-12 15:19 | 只看该作者
很棒
回复

使用道具 举报

9#
ID:700921 发表于 2020-3-24 23:20 来自手机 | 只看该作者
楼主是研究生吗,感觉我们本科fpga课程设计比这个简单太多了
回复

使用道具 举报

10#
ID:736297 发表于 2020-4-23 17:42 | 只看该作者
很有用,非常感谢
回复

使用道具 举报

11#
ID:1036439 发表于 2022-6-22 17:23 | 只看该作者
很牛这个 模块很详细
回复

使用道具 举报

12#
ID:1064792 发表于 2023-3-1 16:06 | 只看该作者
写的非常详细,感谢楼主
回复

使用道具 举报

13#
ID:1071288 发表于 2023-4-12 15:52 | 只看该作者
好,非常棒,有用
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表