【案例】超声波测距系统设计

1.1 总体设计

1.1.1 概述

学习了明德扬至简设计法和明德扬设计规范,本人用FPGA设计了一个测距系统。该系统采用超声波进行测量距离再在数码管上显示。在本案例的设计过程中包括了超声波的驱动、三线式数码管显示等技术。经过逐步改进、调试等一系列工作后,最终完成了此设计,并进行上板验证,下面将完整的设计记录与大家分享。

1.1.2 设计目标

此系统将实时显示前方障碍与装置之间的距离。

1.1.3 系统结构框图

系统结构框图如下所示:
在这里插入图片描述

1.1.4 模块功能

hc_sr04模块实现功能:
该模块通过控制触发信号trig(10us的TTL)使内部循环发出8个40KHZ脉冲即驱动超声波,接收回响信号echo,通过echo得到距离。

显示模块实现功能:
该模块完成了对所测距离通过数码管对其显示。

1.1.5顶层信号
在这里插入图片描述

1.1.6顶层代码

module top(
clk ,
rst_n ,
echo ,

trig   ,
sel,seg
);input               clk     ;
input               rst_n   ;
input               echo    ;output              trig    ;wire    [3:0]       s_g     ;wire    [3:0]       s_s     ;wire    [3:0]       s_b     ;wire    [3:0]       s_q     ;output  [7:0]       sel     ;output  [7:0]       seg     ;hc_sr04 hc_sr04_1(.clk      (clk)   ,.rst_n    (rst_n) ,.echo     (echo)  ,.trig     (trig)  ,.s_g      (s_g ),.s_s      (s_s ),.s_b      (s_b ),.s_q      (s_q ) 
);seg_disp u_seg_disp(.clk         (clk  ),.rst_n       (rst_n),.segment_data({s_q,s_b,s_s,s_g}),.segment     (seg  ),.seg_sel     (sel  ) 
);endmodule

1.2 hc_sr04模块设计

1.2.1 接口信号
在这里插入图片描述

1.2.2 设计思路

我们只需要提供一个短期的10uS脉冲触发信号trig,该模块内部将发出8个40kHz周期电平并检测回波,一旦检测到有回波信号则输出回响信号,回响信号echo是一个脉冲的宽度成正比的距离变量,可通过发射信号到收到的回响信号时间间隔可以计算得到距离。建议测量周期为60ms以上,以防止发射信号对回响信号的影响,这里我们采用的是1s测量一次。

时钟计数器cnt0:用于计算 1 秒的时钟个数,加一条件为1,表示一直计数;结束条件为数到 TIME_1S ,表示数到 1 秒就清零。

距离计数器 h_cnt:用于计算flag为高电平的宽度的时间,如果flag为1,h_cnt就加一;每完成1秒计数后h_cnt就变为0,此外h_cnt等于h_cnt。

模块时序图
在这里插入图片描述

1.2.3 参考代码

module hc_sr04(
clk ,
rst_n ,
echo ,

trig   ,
s_g    ,
s_s    ,
s_b    ,
s_q      
);parameter      DATA_W = 14  ;parameter                 TIME_1S = 50_000_000;input               clk     ;
input               rst_n   ;
input               echo    ;output              trig    ;
output[ 3:0]        s_g     ;    
output[ 3:0]        s_s     ;    
output[ 3:0]        s_b     ;    
output[ 3:0]        s_q     ;    wire                trig    ;
reg   [ 3:0]        s_g     ;    
reg   [ 3:0]        s_s     ;    
reg   [ 3:0]        s_b     ;    
reg   [ 3:0]        s_q     ;    
reg   [DATA_W-1:0]  distance;reg   [25:0]        cnt0    ;
reg   [20:0]        h_cnt   ;
reg                 echo_2  ;
reg                 echo_1  ;
wire                add_cnt0;
wire                end_cnt0;         
wire                flag_h  ;
wire                flag_l  ;always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt0 <= 0;endelse if(add_cnt0)beginif(end_cnt0)cnt0 <= 0;elsecnt0 <= cnt0 + 1'b1;end
endassign add_cnt0 = 1;       
assign end_cnt0 = add_cnt0 && cnt0 == TIME_1S - 1;assign trig = (cnt0>=500&&cnt0<1000)?1:0;always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginecho_1 <= 0;echo_2 <= 0;endelse beginecho_1 <= echo  ;echo_2 <= echo_1;end
endalways @(posedge clk or negedge rst_n)beginif(!rst_n)beginh_cnt <= 0;endelse if(add_h_cnt)beginif(end_h_cnt)h_cnt <= 0;elseh_cnt <= h_cnt + 1;endelse if(end_cnt0)beginh_cnt <= 0;end
endassign add_h_cnt = echo_2;       
assign end_h_cnt = 0 ;   always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begindistance <= 0;endelse if(add_cnt0 && cnt0 == 45_000_000-1)begindistance <= h_cnt*34/10000;end
endalways  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begins_g <= 0;endelse begins_g <= distance%10;end
endalways  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begins_s <= 0;endelse begins_s <= (distance/10)%10;end
end  always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begins_b <= 0;endelse begins_b <= (distance/100)%10;end
endalways  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begins_q <= 0;endelse begins_q <= (distance/1000)%10;endend

endmodule

1.3 显示模块设计

1.3.1接口信号
在这里插入图片描述

1.3.2设计思路

该模块对数码管的位选信号sel每隔1ms的时间移位一次,也就是1ms循环亮一个灯,由于1ms的频率肉眼观察不出,我们看到的就是4个灯全亮。

对输入距离distance进行求余处理,得到每一位的数据,通过case语句,让每一位数据形成段选信号,通过位选信号的控制显示在对应的数码管上。

1.3.3参考代码

module seg_disp(
clk ,
rst_n ,
segment_data,
segment ,
seg_sel
);

parameter ZERO = 8’b1100_0000 ;
parameter ONE = 8’b1111_1001 ;
parameter TWO = 8’b1010_0100 ;
parameter THREE = 8’b1011_0000 ;
parameter FOUR = 8’b1001_1001 ;
parameter FIVE = 8’b1001_0010 ;
parameter SIX = 8’b1000_0010 ;
parameter SEVEN = 8’b1111_1000 ;
parameter EIGHT = 8’b1000_0000 ;
parameter NINE = 8’b1001_0000 ;

input clk ;
input rst_n ;
input [31:0] segment_data ;
output [7:0 ] segment ;
output [7:0 ] seg_sel ;

reg [7:0 ] segment ;
reg [7:0 ] seg_sel ;
reg [10:0] delay ;
reg [3:0 ] delay_time ;
wire add_delay_time ;
wire end_delay_time ;
wire add_delay ;
wire end_delay ;
wire [3:0 ] segment_tmp ;

always @(posedge clk or negedge rst_n) begin
if (rst_n==0) begin
delay <= 0;
end
else if(add_delay) begin
if(end_delay)
delay <= 0;
else
delay <= delay+1 ;
end
end
assign add_delay = 1;
assign end_delay = add_delay && delay == 2000-1 ;

always @(posedge clk or negedge rst_n) begin
if (rst_n==0) begin
delay_time <= 0;
end
else if(add_delay_time) begin
if(end_delay_time)
delay_time <= 0;
else
delay_time <= delay_time+1 ;
end
end
assign add_delay_time = end_delay;
assign end_delay_time = add_delay_time && delay_time == 8-1 ;

assign segment_tmp = segment_data[(1+delay_time)*4-1 -:4];
always @(posedge clk or negedge rst_n)begin
if(rst_n==1’b0)begin
segment <= ZERO;
end
else begin
case(segment_tmp)
4’d0:segment <= ZERO;
4’d1:segment <= ONE ;
4’d2:segment <= TWO ;
4’d3:segment <= THREE;
4’d4:segment <= FOUR ;
4’d5:segment <= FIVE ;
4’d6:segment <= SIX ;
4’d7:segment <= SEVEN;
4’d8:segment <= EIGHT;
4’d9:segment <= NINE ;
default:begin
segment <= segment;
end
endcase
end
end

always @(posedge clk or negedge rst_n)begin
if(rst_n==1’b0)begin
seg_sel <= 8’b1111_1111;
end
else begin
seg_sel <= ~(8’b1<<delay_time);
end
end

endmodule

1.4 效果和总结

上板验证效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这个设计中,使用明德扬的至简设计法,让我的思路非常清晰,逻辑非常严谨,虽然没有做到一遍成功,但在调试过程中我都比较快速的找到问题,并快速解决。对于学习FPGA的同学,我非常推荐使用明德扬至简设计法和明德扬模块进行学习和设计。

教学视频和工程源代码请移步明德扬论坛学习!

好消息!FPGA至简设计200例已更新,👉🏻学习链接:https://pan.baidu.com/s/181l9fKI8BXwR7HuAF-ok0w 提取码:yt5p

【FPGA至简设计200例】毕业设计案例由浅入深步骤性教学明德扬

温馨提示:明德扬2023推出了全新课程——逻辑设计基本功修炼课,降低学习FPGA门槛的同时,增加了学习的趣味性,并组织了考试赢积分活动

http://www.mdy-edu.com/ffkc/415.html

(点击→了解课程详情☝)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/189764.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】树与二叉树(十三):递归复制二叉树(算法CopyTree)

文章目录 5.2.1 二叉树二叉树性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点&#xff0c;其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

vue,react虚拟dom

Virtual DOM 前言 在传统的Web开发中&#xff0c;直接操作真实的DOM通常是一个昂贵且低效的操作。为了解决这个问题&#xff0c;Virtual DOM&#xff08;虚拟DOM&#xff09;被引入为一个中间层&#xff0c;允许开发者在内存中进行操作&#xff0c;从而避免频繁且不必要的真实D…

深度学习的集体智慧:最新发展综述

一、说明 我们调查了来自复杂系统的想法&#xff0c;如群体智能、自组织和紧急行为&#xff0c;这些想法在机器学习中越来越受欢迎。人工神经网络正在影响我们的日常生活&#xff0c;从执行预测性任务&#xff08;如推荐、面部识别和对象分类&#xff09;到生成任务&#xff08…

git的分支及标签使用及情景演示

目录 一. 环境讲述 二.分支 1.1 命令 1.2情景演练 三、标签 3.1 命令 3.2 情景演示 ​编辑 一. 环境讲述 当软件从开发到正式环境部署的过程中&#xff0c;不同环境的作用如下&#xff1a; 开发环境&#xff1a;用于开发人员进行软件开发、测试和调试。在这个环境中…

【Spring Boot 源码学习】初识 SpringApplication

Spring Boot 源码学习系列 初识 SpringApplication 引言往期内容主要内容1. Spring Boot 应用程序的启动2. SpringApplication 的实例化2.1 构造方法参数2.2 Web 应用类型推断2.3 加载 BootstrapRegistryInitializer2.4 加载 ApplicationContextInitializer2.5 加载 Applicatio…

Codeforces Round 788 (Div. 2) E. Hemose on the Tree(树上构造)

题目 t(t<5e4)组样例&#xff0c;每次给定一个数p&#xff0c; 表示一棵节点数为的树&#xff0c; 以下n-1条边&#xff0c;读入树边 对于n个点和n-1条边&#xff0c;每个点需要赋权&#xff0c;每条边需要赋权&#xff0c; 权值需要恰好构成[1,2n-1]的排列 并且当你赋…

阿里云ACK(Serverless)安装APISIX网关及APISIX Ingress Controller

在k8s上安装apisix全家&#xff0c;通过helm安装很简单&#xff0c;但是会遇到一些问题。 安装 首先登录阿里云控制台&#xff0c;在ACK集群详情页&#xff0c;进入CloudShell&#xff0c;执行下面helm命令安装apisix、apisix-ectd、apisix-dashboard和apisix-ingress-contro…

汽车ECU的虚拟化技术初探(一)

目录 1.为什么要提汽车ECU的虚拟化&#xff1f; 2.虚拟化技术分类 2.1 硬件虚拟化 2.2 操作系统虚拟化 问题引入&#xff1a; Hypervisor是如何来管理和隔离硬件资源&#xff0c;保证各个不同功能的应用程序的资源使用安全和资源调度&#xff1f;没有MMU就做不了虚拟化&am…

扭矩传感器信号模拟地、数据地与电源地

在电子电路中&#xff0c;电源地、信号地、数字地和模拟地都是不同的地&#xff08;ground&#xff09;节点&#xff0c;它们在电路中有不同的作用。 电源地&#xff08;Power Ground&#xff09;是指用于连接电源电源回路的地节点。在大多数电子设备中&#xff0c;电源地通常是…

Git Commit 之道:规范化 Commit Message 写作指南

1 commit message 规范 commit message格式都包括三部分&#xff1a;Header&#xff0c;Body和Footer <type>(<scope>): <subject><body><footer>Header是必需的&#xff0c;Body和Footer则可以省略 1.1 Header Type&#xff08;必需&#xf…

高级项目管理总结

目录 一、背景介绍二、思路&方案三、过程1.升维思考2.结构化3.心理、知识阶段检验4.微观 四、总结 一、背景介绍 天性对学习对考试充满敌意的我&#xff0c;转变为依赖学习谋生&#xff0c;再到后来书中自有黄金屋&#xff0c;到现在学习对我而言就如同一日三餐&#xff1…

Three.js——基于原生WebGL封装运行的三维引擎

文章目录 前言一、什么是WebGL&#xff1f;二、Three.js 特性 前言 Three.js中文官网 Three.js是基于原生WebGL封装运行的三维引擎&#xff0c;在所有WebGL引擎中&#xff0c;Three.js是国内文资料最多、使用最广泛的三维引擎。既然Threejs是一款WebGL三维引擎&#xff0c;那么…

【操作系统】考研真题攻克与重点知识点剖析 - 第 3 篇:内存管理

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

JPA Buddy快速创建update、find、count、delete、exists方法

JPA Buddy快速创建update、find、count、delete、exists方法&#xff0c;JPA默认提供的CrudRepository\JpaRepository提供的方法比较少&#xff0c;一般我们会手写一些方法&#xff0c;这里我们选择通过JPA Buddy快速生成&#xff0c;之前文章中讲到了JPA Buddy原本是IDEA收费插…

Spark Job优化

1 Map端优化 1.1 Map端聚合 map-side预聚合&#xff0c;就是在每个节点本地对相同的key进行一次聚合操作&#xff0c;类似于MapReduce中的本地combiner。map-side预聚合之后&#xff0c;每个节点本地就只会有一条相同的key&#xff0c;因为多条相同的key都被聚合起来了。其他节…

前端面试题 计算机网络

文章目录 ios 7层协议tcp协议和udp协议的区别tcp协议如何确保数据的可靠http和tcp的关系url输入地址到呈现网页有哪些步骤post和get本质区别&#xff0c;什么时候会触发二次预检GET请求&#xff1a;POST请求&#xff1a;触发二次预检&#xff08;CORS中的预检请求&#xff09;&…

SolidWorks绘制花瓶教程

这个花瓶是我学习solidworks画图以来用时最长的一个图形了&#xff0c;特此记录一下&#xff0c;用了我足足两个早晨才把他给画出来&#xff0c;我这是跟着哔站里的隔壁老王学习的&#xff0c;下面是视频地址&#xff1a;点击我一下看视频教程 下面是我的绘图过程&#xff0c;…

美国材料与试验协会ASTM发布新版玩具安全标准 ASTM F963-23

美国材料与试验协会ASTM发布新版玩具安全标准 ASTM F963-23 2023年10月13日&#xff0c;美国材料与试验协会&#xff08;ASTM&#xff09;发布了新版玩具安全标准ASTM F963-23 ​根据CPSIA的规定&#xff0c;当ASTM将ASTM F963的拟定修订意见通知CPSC时&#xff0c;若CPSC认为…

如何配置Apple推送证书 push证书

转载&#xff1a;如何配置Apple推送证书 push证书 想要制作push证书&#xff0c;就需要使用快捷工具appuploader工具制 作证书&#xff0c;然后使用Apple的推送功能配置push证书&#xff0c;就可以得到了。PS&#xff1a;push没有描述文件&#xff0c;所以不 要问推送选择哪…

【c++随笔12】继承

【c随笔12】继承 一、继承1、继承的概念2、3种继承方式3、父类和子类对象赋值转换4、继承中的作用域——隐藏5、继承与友元6、继承与静态成员 二、继承和子类默认成员函数1、子类构造函数 二、子类拷贝构造函数3、子类的赋值重载4、子类析构函数 三、单继承、多继承、菱形继承1…