FPGA零基础学习之Vivado-超声波驱动设计

原创 FPGA技术江湖 2023-10-18 08:02

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。“煮酒言欢”进入IC技术圈,这里有近100个IC技术公众号。


大侠好,欢迎来到FPGA技术江湖。本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。

系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,超声波驱动设计。话不多说,上货。


超声波驱动设计


作者:李西锐  校对:陆辉


一、简介

声音是我们日常生活中不可缺少的一种信号,在传递信息的同时,也在生活中的各个领域有较多的应用。根据声音的频率,我们将声音大致划分为三个阶段,人耳的听力范围,一般在20Hz~20000Hz之间。低于这个范围,我们称之为次声波;高于这个范围,称之为超声波。超声波的应用比较广泛,比如:超声波检查、超声波碎石、超声波清洗、超声波测速、超声波测距等等。此次我们就来研究一下它的其中一项应用:超声波测距。

我们用到的试验模块为HC-SR04超声波模块,它的测量距离在2cm~400cm之间。测量精度在3mm左右。模块包含了超声波的发射器、接收器和控制电路。超声波发射器在启动后会发出固定频率的方波,用声波去测量距离,不需要我们接触被测物体,在空间上使得我们测距变得方便很多。


二、工作原理

1、采用IO口TRIG触发测距,给至少10us的高电平信号,测量周期建议在60ms以上,以防止发射的信号对回响信号造成影响。

2、模块会自动发送8个40Khz的方波信号,接收器自动检测是否有回响信号返回。

3、有信号返回时,通过IO口ECHO输出一个高电平信号,高电平持续的时间就是方波从发射到返回的时间。测量距离=(高电平时间*声速(340m/s))/2;

在此需要我们注意的事,发射器是自动发送方波信号的,而且会自动检测是否有信号返回,这让我们省去了一大部分工作,使得测量变得简单。其次,在计算测量距离时,我们要将计算出来的结果除以2,因为我们测得的时间是往返的时间,也就是双倍的路程。


三、实物图


电气参数


五、超声波时序图


在时序图中,我们可以看出,我们需要生成一个周期至少为60ms,且高电平维持时间至少为10us的一个触发信号。


六、实验要求

此次设计,要求能够正常驱动模块,计算出的距离,计算其平均值以保证准确性。数码管上显示出距离,单位为m,精确到mm。并且,蜂鸣器能够根据距离响出不同频率的报警声音,距离越近,响声频率越频繁。


七、设计框架

八、设计实现

在计算回响信号的时间时,我们可以检测回响信号的上升沿和下降沿来作为计时器的开始和结束。在我们计算出距离之后,可以每三个数据计算一次平均值。然后将数据输出给其他模块。


首先,我们新建工程。

选择新建文件,然后先新建顶层文件

按照我们所画框架写入顶层端口。

重复上述新建文件的过程,新建ultrasonic_driver文件,代码如下: 

1    module ultrasonic_driver(2  3      input   wire               clk,4      input   wire               rst_n,5      input   wire               echo,6      output   reg               trig,7      output   reg     [11:0]      distance,8      output   reg               data_valid9    );10 11     parameter   t = 3_000_000;12 13     reg       [21:0]      cnt;14     reg                 state;15     reg                 echo_r, echo_rr;16     reg       [20:0]      echo_cnt;17     reg       [20:0]      cnt_temp;18     wire       [11:0]      d_r;19     reg       [35:0]      temp;20     reg                 data_valid_r;21     22     always @ (posedge clk)  echo_r <= echo;23     always @ (posedge clk)  echo_rr <= echo_r;24     25     always @ (posedge clk, negedge rst_n)26     begin27       if(rst_n == 1'b0)28         cnt <= 22'd0;29       else if(cnt == t - 1)30         cnt <= 22'd0;31       else32         cnt <= cnt + 1'b1;33     end34 35     always @ (posedge clk, negedge rst_n)36     begin37       if(rst_n == 1'b0)38         trig <= 1'b0;39       else if(cnt < 1000)40         trig <= 1'b1;41       else42         trig <= 1'b0;43     end44 45     always @ (posedge clk, negedge rst_n)46     begin47       if(rst_n == 1'b0)48         begin49           echo_cnt <= 21'd0;50           state <= 1'd0;51           data_valid_r <= 1'b0;52           echo_cnt <= 21'd0;53         end54       else55         case(state)56           1'd0  :  begin57                   if(echo_r & (~echo_rr))58                     state <= 1'd1;59                   else60                     begin61                       state <= 1'd0;62                       data_valid_r <= 1'b0;63                     end64                 end65           1'd1  :  begin66                   if((~echo_r) & echo_rr)67                     begin68                       state <= 1'd0;69                       echo_cnt <= 21'd0;70                       cnt_temp <= echo_cnt;71                       data_valid_r <= 1'b1;72                     end73                   else74                     begin75                       state <= 1'd1;76                       echo_cnt <= echo_cnt + 1'b1;77                       cnt_temp <= cnt_temp;78                     end79                 end80         endcase81     end82     83     assign d_r = cnt_temp * 34 / 10_000;84     85     always @ (posedge clk, negedge rst_n)86     begin87       if(rst_n == 1'b0)88         temp <= 36'd0;89       else if(data_valid_r)90         temp <= {temp[23:0],d_r};91       else92         temp <= temp;93     end94     95     always @ (posedge clk) data_valid <= data_valid_r;96     97     always @ (posedge clk, negedge rst_n)98     begin99       if(rst_n == 1'b0)100        distance <= 12'd0;101      else if(data_valid)102        distance <= (temp[35:24] + temp[23:12] + temp[11:0]) / 3;103      else104        distance <= distance;105    end106107  endmodule


在完成测距时,输出一个valid信号,这个信号要作为后续我们保存数据以及计算平均值的标志信号。


数码管代码如下:

1   module seven_tube_driver(2 3     input   wire          clk,4     input   wire          rst_n,5     input   wire  [11:0]  data,   6     7     output  reg     [5:0] sel,8     output  wire    [7:0] seg9   );10    11    parameter t = 50000;12    13    reg   [15:0]  cnt;14    reg   [3:0]   show_data;15    reg   [7:0]   seg_r;16    17    always @ (posedge clk, negedge rst_n)18    begin19    if(rst_n == 1'b0)20      cnt <= 16'd0;21    else if(cnt == t - 1)22      cnt <= 16'd0;23    else24      cnt <= cnt + 1'b1;25    end26    27    always @ (posedge clk, negedge rst_n)28    begin29    if(rst_n == 1'b0)30      sel <= 6'b111_110;31    else if(cnt == t - 1)32      sel <= {sel[4:0],sel[5]};33    else34      sel <= sel;35    end36    37    always @ (*)38    begin39    case(sel)40      6'b111_110  : show_data = 4'hf;41      6'b111_101  : show_data = 4'hf;42      6'b111_011  : show_data = data/1000;43      6'b110_111  : show_data = data/100%10;44      6'b101_111  : show_data = data/10%10;45      6'b011_111  : show_data = data%10;46      default : show_data = 4'd0;47    endcase48    end49    50    always @ (*)51    begin52    case(show_data)53      4'd0  : seg_r = 8'b1100_0000;54      4'd1  : seg_r = 8'b1111_1001;55      4'd2  : seg_r = 8'b1010_0100;56      4'd3  : seg_r = 8'b1011_0000;57      4'd4  : seg_r = 8'b1001_1001;58      4'd5  : seg_r = 8'b1001_0010;59      4'd6  : seg_r = 8'b1000_0010;60      4'd7  : seg_r = 8'b1111_1000;61      4'd8  : seg_r = 8'b1000_0000;62      4'd9  : seg_r = 8'b1001_0000;63      default:  seg_r = 8'd0;64    endcase65    end66    67    assign seg = (sel == 6'b111_011) ? (seg_r & 8'b0111_1111) : seg_r;68    69  endmodule


第67行的作用是为了在显示时,显示一个小数点,这样数码管显示的数值单位就为米,精确度为毫米。

在蜂鸣器模块中,蜂鸣器的响声为嘀嘀响声我们可以根据距离的大小,让蜂鸣器响声的快慢作出改变。


我们根据距离改变计数器的最大计数次数,以达到两次“嘀嘀”响声的时间间隔发生变化。


写好代码之后,我们做一下仿真,代码如下:

1   `timescale 1ns / 1ps2 3   module ultrasonic_tb;4 5     reg                clk;6     reg                rst_n;7     reg                echo;8     wire               trig;9     wire       [5:0]      sel;10    wire       [7:0]      seg;11    wire               beep;12    13    defparam ultrasonic_inst.ultrasonic_driver_inst.t = 3000;14    15    initial begin16      clk = 1'b0;17      rst_n = 1'b0;18      echo = 1'b0;19      #105;20      rst_n = 1'b1;21      #1000;22      23      repeat(10) begin24      @ (negedge trig);25      #1002;26      echo = 1'b1;27      #20000;28      echo = 1'b0;29      end30      #10000;31      $stop;32    end33    34    always #10 clk = ~clk;35    36    ultrasonic ultrasonic_inst(37    .clk      (clk  ),38    .rst_n      (rst_n  ),39    .echo      (echo  ),40    .trig      (trig  ),41    .sel      (sel  ),42    .seg      (seg  ),43    .beep      (beep  )44  );45    46  endmodule


仿真图如下:


从图中我们可以看出,距离在多次采样之后达到了稳定值。由于我们仿真时间给的较短,所以距离的数值不大,但是已经足够看出结果。



- End -


福利】:QQ交流群173560979,进群备注名字+学校/企业。
淘宝店铺:https://shop588964188.taobao.com
论坛网址:www.sxznfpga.com
叁芯智能FPGA课程

FPGA技术江湖广发江湖帖

无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。


FPGA技术江湖微信交流群

加群主微信,备注姓名+公司/学校+岗位/专业进群


FPGA技术江湖QQ交流群

备注姓名+公司/学校+岗位/专业进群

FPGA技术江湖 任何技术的学习就好比一个江湖,对于每一位侠客都需要不断的历练,从初入江湖的小白到归隐山林的隐世高人,需要不断的自我感悟自己修炼,让我们一起仗剑闯FPGA乃至更大的江湖。
评论 (0)
  • 在 AI 浪潮席卷下,厨电行业正经历着深刻变革。AWE 2025期间,万得厨对外首次发布了wan AiOS 1.0组织体超智能系统——通过AI技术能够帮助全球家庭实现从健康检测、膳食推荐,到食材即时配送,再到一步烹饪、营养总结的个性化健康膳食管理。这一创新之举并非偶然的个案,而是整个厨电行业大步迈向智能化、数字化转型浪潮的一个关键注脚,折射出全行业对 AI 赋能的热切渴求。前有标兵后有追兵,万得厨面临着高昂的研发成本与技术迭代压力,稍有懈怠便可能被后来者赶
    用户1742991715177 2025-05-11 22:44 124浏览
  • 在印度与巴基斯坦的军事对峙情境下,歼10C的出色表现如同一颗投入平静湖面的巨石,激起层层涟漪,深刻印证了“质量大于数量”这一铁律。军事领域,技术优势就是决定胜负的关键钥匙。歼10C凭借先进的航电系统、强大的武器挂载能力以及卓越的机动性能,在战场上大放异彩。它能够精准捕捉目标,迅速发动攻击,以一敌多却毫不逊色。与之形成鲜明对比的是,单纯依靠数量堆砌的军事力量,在面对先进技术装备时,往往显得力不从心。这一现象绝非局限于军事范畴,在当今社会的各个领域,“质量大于数量”都已成为不可逆转的趋势。在科技行业
    curton 2025-05-11 19:09 197浏览
  •         信创产业含义的“信息技术应用创新”一词,最早公开信息见于2019年3月26日,在江苏南京召开的信息技术应用创新研讨会。本次大会主办单位为江苏省工业和信息化厅和中国电子工业标准化技术协会安全可靠工作委员会。        2019年5月16日,美国将华为列入实体清单,在未获得美国商务部许可的情况下,美国企业将无法向华为供应产品。       2019年6
    天涯书生 2025-05-11 10:41 164浏览
  •   定制软件开发公司推荐清单   在企业数字化转型加速的2025年,定制软件开发需求愈发多元复杂。不同行业、技术偏好与服务模式的企业,对开发公司的要求大相径庭。以下从技术赛道、服务模式及行业场景出发,为您提供适配的定制软件开发公司推荐及选择建议。   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转
    华盛恒辉l58ll334744 2025-05-12 15:55 222浏览
  •   电磁数据展示系统平台解析   北京华盛恒辉电磁数据展示系统平台是实现电磁数据高效展示、分析与管理的综合性软件体系,以下从核心功能、技术特性、应用场景及发展趋势展开解读:   应用案例   目前,已有多个电磁数据展示系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据展示系统。这些成功案例为电磁数据展示系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与预处理   智能分析处理   集成频谱分析、时频变换等信号处理算法,自动提取时域频域特征;
    华盛恒辉l58ll334744 2025-05-13 10:20 50浏览
  •   电磁数据管理系统深度解析   北京华盛恒辉电磁数据管理系统作为专业的数据处理平台,旨在提升电磁数据的处理效率、安全性与可靠性。以下从功能架构、核心特性、应用场景及技术实现展开分析:   应用案例   目前,已有多个电磁数据管理系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据管理系统。这些成功案例为电磁数据管理系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与接入:实时接收天线、频谱仪等设备数据,兼容多协议接口,确保数据采集的全面性与实时性
    华盛恒辉l58ll334744 2025-05-13 10:59 51浏览
  •   基于 2025 年行业权威性与时效性,以下梳理国内知名软件定制开发企业,涵盖综合型、垂直领域及特色技术服务商:   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次开发,CRM等领域有很多成功案例。   五木恒润科技有限公司:是一家专业的部队信
    华盛恒辉l58ll334744 2025-05-12 16:13 178浏览
  • ‌磁光克尔效应(Magneto-Optic Kerr Effect, MOKE)‌ 是指当线偏振光入射到磁性材料表面并反射后,其偏振状态(偏振面旋转角度和椭偏率)因材料的磁化强度或方向发生改变的现象。具体表现为:1、‌偏振面旋转‌:反射光的偏振方向相对于入射光发生偏转(克尔旋转角 θK)。2、‌椭偏率变化‌:反射光由线偏振变为椭圆偏振(克尔椭偏率 εK)。这一效应直接关联材料的磁化状态,是表征磁性材料(如铁磁体、反铁磁体)磁学性质的重要非接触式光学探测手段,广泛用于
    锦正茂科技 2025-05-12 11:02 198浏览
  • 在全球供应链紧张和国产替代需求推动下,国产存储芯片产业快速发展,形成设计到封测一体化的完整生态。北京君正、兆易创新、紫光国芯、东芯股份、普冉股份和佰维存储等六大上市公司在NOR/NAND Flash、DRAM、嵌入式存储等领域布局各具特色,推动国产替代提速。贞光科技代理的品牌紫光国芯,专注DRAM技术,覆盖嵌入式存储与模组解决方案,为多领域客户提供高可靠性产品。随着AI、5G等新兴应用兴起,国产存储厂商有望迎来新一轮增长。存储芯片分类与应用易失性与非易失性存储芯片易失性存储芯片(Volatile
    贞光科技 2025-05-12 16:05 86浏览
  • 【拆解】+CamFi卡菲单反无线传输器拆解 对于单反爱好者,想要通过远程控制自拍怎么办呢。一个远程连接,远程控制相机拍摄的工具再合适不过了。今天给大伙介绍的是CamFi卡菲单反无线传输器。 CamFi 是专为数码单反相机打造的无线传输控制器,自带的 WiFi 功能(无需手机流量),不但可通过手机、平板、电脑等设备远程连接操作单反相机进行拍摄,而且还可实时传输相机拍摄的照片到 iPad 和电视等大屏设备进行查看和分享。 CamFi 支持大部分佳能和尼康单反相机,内置可充电锂离子电池,无需相机供电。
    zhusx123 2025-05-11 14:14 203浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦