FPGA基于DE2-115开发板驱动HC_SR04超声波测距模块|集成蜂鸣器,led和vga提示功能

文章目录

  • 前言
  • 一、实验原理
  • 二、Verilog文件
    • 2.1 时钟分频
    • 2.2 超声波测距
    • 2.3 超声波驱动
  • 三、实现过程
    • 3.1 模块说明
    • 3.2 引脚分配
  • 三、演示视频
  • 总结
  • 参考


前言

环境

硬件 DE2-115 HC-SR04超声波传感器

软件 Quartus 18.1

目标结果

使用DE2-115开发板驱动HC-SR04模块,并将所测得数据显示到开发板上的数码管。

模拟倒车雷达,集成蜂鸣器,led和vga提示功能

蜂鸣器提示小于20cm1s一响小于10cm0.5s一响
LED提示小于20cm全亮提示
VGA提示小于20cm ,显示 警告warning 图片


一、实验原理

参考上一篇博客

基于STM32的HC-SR04超声波测距(PWM蜂鸣器+滤波算法+数据上云-标准库实现)

二、Verilog文件

2.1 时钟分频

定义时钟分频模块,产生周期为1us的时钟信号

//产生一个以微秒为周期的时钟信号clk_us,该信号可用于驱动一些需要精确时间控制的电路
module 	clk_div(input wire Clk				, // 输入系统时钟,50MHzinput wire Rst_n			, // 输入复位信号,低电平有效output wire clk_us      // 输出微秒级时钟信号
);// 参数声明 1us = 1000ns = 50个时钟周期parameter CNT_MAX = 19'd50		;	//1us的计数值为 50 * Tclk(20ns)// 内部线网/寄存器声明reg [18:0] cnt					;   // 定义一个19位的计数器wire add_cnt					;   // 计数器使能信号wire end_cnt					;   // 计数器结束信号,达到最大值时有效// 计数器的寄存器逻辑	always @(posedge Clk or negedge Rst_n)begin  if(!Rst_n)begin  // 如果复位信号有效,则计数器清零cnt <= 'd0; end  else if(add_cnt)begin   // 如果计数器达到最大值,则计数器重置if(end_cnt)begin  cnt <= 'd0; end  else begin   // 否则计数器继续计数cnt <= cnt + 1'b1; end  end  else begin  cnt <= cnt;  // 如果计数器未使能,则保持当前值end  end // 赋值计数器使能信号,始终使计数器有效assign add_cnt = 1'b1; // 赋值计数器结束信号,当计数器使能并且计数值达到CNT_MAX - 1时有效assign end_cnt = add_cnt && cnt >= CNT_MAX - 19'd1;// 赋值输出时钟信号,当计数器达到最大值时输出一个脉冲assign clk_us = end_cnt;endmodule 

2.2 超声波测距

  • 实现HC-SR04超声波传感器的触发模块,用于生成触发测距信号(trig)
  • 定义HC-SR04超声波传感器的回声模块,用于测量距离并输出检测距离数据(data_o)
module distance_drive (// 输入输出定义input       wire                clk                          ,                // 主时钟信号input       wire                clk_1                        ,              // 辅助时钟信号,1Mhzinput       wire                rst_n                        ,              // 复位信号,低电平有效input       wire                echo                         ,               // 回声输入,来自超声波传感器output      reg                 trig                         ,                // 发射触发信号,控制超声波传感器发射output      wire                data_out_vld                 ,      // 数据有效信号,表示距离数据准备好了output      wire      [23:0]    distance_data // 距离数据输出,24位宽
);localparam	MAX_DISTANCE = 117647; //最大距离 4mparameter	s_idle = 0;//空闲状态
parameter	s_send = 1;//发送触发信号
parameter	s_wait = 2;//等待内部发送脉冲
parameter	s_accept = 3;//检测回响信号
parameter	s_accept_wait = 4;//延时等待reg								echo_r0			;
reg								echo_r1			;
reg			[ 2:0 ]			    s_current		;
reg			[ 2:0 ]			    s_next			;
reg			[ 22 :0 ]		    cnt				;
reg			[ 22:0 ]			cnt_wait		;
reg			[ 22:0 ]		    cnt_max			;
reg			[ 16:0 ]			cnt_distance	;
// reg			[ 25:0 ]			cnt_distance_r1			;
// reg			[ 19:0 ]			cnt_distance_r2			;wire							accept_start_sig			;
wire							accept_stop_sig			;
wire							idle_sig			;
wire							send_sig			;
// wire							wait_sig			;
wire							flag_clear_cnt			;
wire							flag_clear_cnt_wait			;
reg			[ 19:0 ]			distance_data_r			;
wire			[ 23:0 ]			distance_data_r1			;assign idle_sig = s_current == s_idle;
assign send_sig = s_current == s_send && flag_clear_cnt;
// assign wait_sig = s_current == s_wait && flag_clear_cnt_wait;
assign accept_wait_sig = s_current == s_accept_wait &&  flag_clear_cnt_wait;
assign accept_start_sig = s_current == s_wait && echo_r0 && ~echo_r1;
assign accept_stop_sig = s_current == s_accept && (~echo_r0 && echo_r1);// always @(posedge clk or negedge rst_n) begin
//     if(!rst_n) begin
//         cnt_distance_r1 <= 0;
//         // cnt_distance_r2 <= 0;
//     end
//     else begin
//         cnt_distance_r1 <= cnt_distance * 340 / 100;
//         // cnt_distance_r2 <= cnt_distance_r1 >> 4;
//     end
// endalways @(posedge clk or negedge rst_n) beginif(!rst_n) beginecho_r0 <= 0;echo_r1 <= 0;endelse beginecho_r0 <= echo;echo_r1 <= echo_r0;end
end
always @(posedge clk or negedge rst_n) beginif(!rst_n) begins_current <= s_idle;    endelse begins_current <= s_next;end
endalways @(*) begincase (s_current)s_idle : beginif(idle_sig) begins_next = s_send;endelse begins_next = s_idle;endends_send : beginif(send_sig) begins_next = s_wait;endelse begins_next = s_send;endends_wait : beginif(accept_start_sig) begins_next = s_accept;endelse begins_next = s_wait;endends_accept : beginif(accept_stop_sig) begins_next = s_accept_wait;endelse begins_next = s_accept;endends_accept_wait : beginif(accept_wait_sig) begins_next <= s_idle;endelse begins_next <= s_accept_wait;endenddefault: s_next = s_idle;endcase
end//距离
always @(posedge clk or negedge rst_n) beginif(!rst_n) begindistance_data_r <= 0;endelse if(accept_stop_sig) begindistance_data_r <= cnt_distance * 340 / 200;end
end//转BCD码
assign     distance_data_r1[3:0]   = distance_data_r % 10;
assign     distance_data_r1[7:4]   = distance_data_r / 10 % 10;
assign     distance_data_r1[11:8]  = distance_data_r / 100 % 10;
assign     distance_data_r1[15:12] = distance_data_r / 1000 % 10;
assign     distance_data_r1[19:16] = distance_data_r / 10000 % 10;
assign     distance_data_r1[23:20] = distance_data_r / 100000 % 10;assign data_out_vld = accept_wait_sig;
assign distance_data = distance_data_r1;//回响信号计数器
always @(posedge clk_1 or negedge rst_n) beginif(!rst_n) begincnt_distance <= 0;endelse if(accept_start_sig) begincnt_distance <= 0;endelse if(s_current == s_accept) begincnt_distance <= cnt_distance + 1;endelse begincnt_distance <= 0;end
end//发送触发信号
always @(posedge clk_1 or negedge rst_n) begincase (s_current)s_idle : begintrig <= 0;ends_send : begintrig <= 1;ends_wait : begintrig <= 0;ends_accept : begintrig <= 0;ends_accept_wait : begintrig <= 0;enddefault: begintrig <= 0;endendcase
end
//等待发送玩脉冲
always @( posedge clk_1 or negedge rst_n ) beginif ( !rst_n ) begincnt <= 0;endelse if ( s_current == s_send ) beginif ( flag_clear_cnt == 9 ) begincnt <= 0;endelse begincnt <= cnt + 1;endendelse begincnt <= 0;end
end
assign flag_clear_cnt = cnt == 9;//延时计数器
always @( posedge clk_1 or negedge rst_n ) beginif ( !rst_n ) begincnt_wait <= 0;endelse if ( s_current == s_accept_wait ) beginif ( flag_clear_cnt_wait ) begincnt_wait <= 0;endelse begincnt_wait <= cnt_wait + 1;endendelse begincnt_wait <= 0;end
end
assign flag_clear_cnt_wait = cnt_wait == 250_000;
endmodule //distance

2.3 超声波驱动

查看平台手册,发现DE2-115开发板不涉及位选信号,每个段选信号都有一个单独的引脚。在这里插入图片描述
数码管驱动器模块代码如下,用于将输入的数据(data_o)转换为对应的数码管显示:

// seg_driver模块定义开始,用于驱动七段显示器
module seg_driver(input wire Clk,        // 时钟信号输入input wire Rst_n,      // 复位信号输入,低电平有效input wire [18:0] data_o, // 输入的数字数据,即测得的距离数据//第1个七段显示器的段选信号输出output  wire [6:0]  hex1    ,output  wire [6:0]  hex2    ,output  wire [6:0]  hex3    ,output  wire [6:0]  hex4    ,output  wire [6:0]  hex5    ,output  wire [6:0]  hex6    ,output  wire [6:0]  hex7    ,output  wire [6:0]  hex8     
);/*
通过cnt_20us计数器实现动态扫描定时,sel_r选择寄存器用于选择当前激活的七段显示器。
根据sel_r的选择,从data_o中提取相应的数字,并将其转换为七段显示器的段选编码seg_r。
最后,根据sel_r的选择,将seg_r的值赋给对应的七段显示器输出寄存器,并从这些寄存器输出到实际的七段显示器硬件上。
NOTION和FUSHU参数分别定义了消隐和小数点的编码,用于控制七段显示器的显示。
*/// 参数定义
parameter   NOTION  = 4'd10,// 定义数字"10"用于消隐的编码FUSHU   = 4'd11;parameter   MAX20us = 10'd1000;// 定义20微秒计数器的最大值reg [9:0]   cnt_20us        ;  // 20微秒计数器
reg [7:0]   sel_r           ;  // 选择寄存器,用于动态扫描控制 片选信号
reg [3:0]   number          ;  // 要显示的数字 0-9
reg [6:0]   seg_r           ;  // 七段显示器的段选编码 段选信号// 第n个七段显示器的段选编码寄存器
reg [6:0]   hex1_r          ;
reg [6:0]   hex2_r          ;
reg [6:0]   hex3_r          ;
reg [6:0]   hex4_r          ;
reg [6:0]   hex5_r          ;
reg [6:0]   hex6_r          ;
reg [6:0]   hex7_r          ;
reg [6:0]   hex8_r          ;// 20微秒计数器逻辑,用于动态扫描定时
always @(posedge Clk or negedge Rst_n) beginif (!Rst_n) begincnt_20us <= 10'd0;endelse if (cnt_20us == MAX20us - 1'd1) begincnt_20us <= 10'd0;endelse begincnt_20us <= cnt_20us + 1'd1;end
end// 单个信号sel_r位 片选 拼接约束,实现动态扫描
always @(posedge Clk or negedge Rst_n) beginif (!Rst_n) beginsel_r <= 8'b11_11_11_10;endelse if (cnt_20us == MAX20us - 1'd1) beginsel_r <= {sel_r[6:0],sel_r[7]};//向左循环移动endelse beginsel_r <= sel_r;end
end// 根据选择信号sel_r获取要显示的数字
always @(*) begincase (sel_r)//片选信号8'b11_11_11_10:     number  = NOTION                                        ;//18'b11_11_11_01:     number  = data_o/10_0000                                ;//28'b11_11_10_11:     number  = (data_o%10_0000)/1_0000                       ;//38'b11_11_01_11:     number  = ((data_o%10_0000)%1_0000)/1000                ;//48'b11_10_11_11:     number  = FUSHU                                         ;//58'b11_01_11_11:     number  = (((data_o%10_0000)%1_0000)%1000)/100          ;//68'b10_11_11_11:     number  = ((((data_o%10_0000)%1_0000)%1000)%100)/10     ;//78'b01_11_11_11:     number  = ((((data_o%10_0000)%1_0000)%1000)%100)%10     ;//8default:            number  = 4'd0                                          ;endcase
end// 根据数字解析出对应的七段显示器段选值seg_r, 低电平点亮,高电平熄灭
always @(*) begincase (number)                   //654_3210     4'd0    :       seg_r   =  7'b100_0000;//_    7 段数码管的点在 DE2-115 开发板上是不可用的。4'd1    :       seg_r   =  7'b111_1001;//14'd2    :       seg_r   =  7'b010_0100;//24'd3    :       seg_r   =  7'b011_0000;//34'd4    :       seg_r   =  7'b001_1001;//44'd5    :       seg_r   =  7'b001_0010;//54'd6    :       seg_r   =  7'b000_0010;//64'd7    :       seg_r   =  7'b111_1000;//74'd8    :       seg_r   =  7'b000_0000;//84'd9    :       seg_r   =  7'b001_0000;//9NOTION  :       seg_r   =  7'b111_1111;// 灭 定义消隐的编码FUSHU   :       seg_r   =  7'b111_0111;// 定义小数点的编码default :       seg_r   =  7'b111_1111;// 默认消隐endcase
end//根据片选信号sel_r
// 根据选择信号sel_r将seg_r值赋给对应的七段显示器寄存器
always @(*) begincase (sel_r)//sel_r片选信号8'b11_11_11_10:     hex1_r = seg_r;//seg_r段选信号8'b11_11_11_01:     hex2_r = seg_r;8'b11_11_10_11:     hex3_r = seg_r;8'b11_11_01_11:     hex4_r = seg_r;8'b11_10_11_11:     hex5_r = seg_r;8'b11_01_11_11:     hex6_r = seg_r;8'b10_11_11_11:     hex7_r = seg_r;8'b01_11_11_11:     hex8_r = seg_r;default:            seg_r  = seg_r;endcase
end// 将寄存器的值赋予输出端口
assign  hex1 = hex1_r;
assign  hex2 = hex2_r;
assign  hex3 = hex3_r;
assign  hex4 = hex4_r;
assign  hex5 = hex5_r;
assign  hex6 = hex6_r;
assign  hex7 = hex7_r;
assign  hex8 = hex8_r;endmodule

三、实现过程

3.1 模块说明

这里要求超声波模块的正负极分别接入5V和GND,其余trigger和echo自由接线,我这里使用的是GPIO[0]和GPIO[1]

在这里插入图片描述

3.2 引脚分配

首先这里提出引脚配置,其中trig和echo引脚与自己所接线的位置向同即可在这里插入图片描述

三、演示视频

FPGA基于DE2-115开发板驱动HC_SR04超声波测距模块|集成蜂鸣器,led和vga提示功能


总结

本次测试借用了一些学长的代码,也带有自己的一些思考,补全了学长没有写进代码的部分。由于代码中设计的寄存器只有那么多位数,也和驱动本身的下限,决定了这次设计只能测试大概4~247cm左右的距离。能够自己补全一部分代码,对于我来说还是很有成就感的,下次见

参考

FPGA基于DE2-115 开发板板和HC_SR04驱动的超声波测距

基于DE2 115开发板驱动HC_SR04超声波测距模块

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

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

相关文章

Windows 下 PostgreSQL 图形化界面安装、配置详解

相信大家对PostgreSQL都不陌生吧&#xff0c;自从MySQL被Oracle所控制后&#xff0c;PostgreSQL就成为了国内去O的首选数据库了&#xff0c;并且PostgreSQL目前不受任何商业公司控制&#xff0c;所以国内很多厂商都是基于PostgreSQL做二次开发来实现数据库自主可控的目标(国内很…

简单模拟实现shell(Linux)

目录​​​​​​​ 前言 展示效果 实现代码 前言 该代码模拟了shell的实现&#xff0c;也就是解析类似于“ls -a -l"的命令&#xff0c;当我们启动我们自己写的shell的可执行程序时&#xff0c;我们输入"ls"的命令&#xff0c;也可以展示出在shell中输入&…

学习笔记——网络参考模型——TCP/IP模型(物理层)

一、TCP/IP模型-物理层 1、数据传输(交换)的形式 (1)电路交换 特点&#xff1a;通信双方独占通信链路。 优点&#xff1a;数据传输时延小&#xff0c;适用于实时通信&#xff1b;数据按序发送&#xff0c;不存在失序问题&#xff1b;适合模拟信号和数字信号传输。 缺点&am…

【前缀和】42. 接雨水

本文涉及知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&am…

IDEA+MyBatisX根据mapper方法自动添加注解和生成xml方法结构

前提&#xff1a;确保IDEA已安装并启用了MyBatisX插件 在service层写dao或mapper的方法结构&#xff0c;反向生成dao层方法声明&#xff0c;如下&#xff1a; void updateStock(Long skuId, Long wareId, Integer skuNum); 由于该方法传递多个参数&#xff0c;为了让MyBatis识…

心链6----开发主页以及后端数据插入(多线程并发)定时任务

心链 — 伙伴匹配系统 开发主页 信息搜索页修改 主页开发&#xff08;直接list用户&#xff09; 在后端controller层编写接口去实现显示推荐页面的功能 /*** 推荐页面* param request* return*/GetMapping("/recommend")public BaseResponse<List<User>&…

Go-知识并发控制WaitGroup

Go-知识并发控制WaitGroup 1. 认识 WaitGroup2. 基本原理2.1 信号量2.2 数据结构2.3 Add2.4 Wait2.5 Done 3. 小例子3.1 主协程等待子协程执行完成3.2 子协程等待主协程信号3.3 GetFirst 4. 总结 gitio: https://a18792721831.github.io/ 1. 认识 WaitGroup WaitGroup 是Go 应…

公网IP地址如何查询?

公网IP地址是指在互联网中可以被全球范围内的设备访问的IP地址。在网络通信中&#xff0c;公网IP地址扮演着重要的角色&#xff0c;它可以标识设备在互联网中的位置。查询公网IP地址是一种常见的网络管理需求&#xff0c;因为它能够提供网络设备的准确位置信息&#xff0c;方便…

AI 绘画爆火背后:扩散模型原理及实现

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

Java进阶学习笔记34——Arrays类

Arrays&#xff1a; 用来操作数组的工具类。 解释说明&#xff1a; 只要知道代码这么写就可以了。 package cn.ensource.d5_arrays;import java.util.Arrays; import java.util.function.IntToDoubleFunction;public class ArraysTest1 {public static void main(String[] arg…

LTspice仿真中设置电阻随时间变化的方法

背景&#xff1a; 笔者找了很多资料都没有看到如何设置电阻、电容等参数随时间变化。但在实际模拟中&#xff0c;总会遇到需要模拟这些量的变化。故撰写此文&#xff0c;供大家参考。 除了模拟随时间变化外&#xff0c;同样的思路也可以模拟随其他变量变化 效果展示 设置电…

32【Aseprite 作图】石头——拆解

1 石头先画轮廓&#xff0c;还是2 4 1 1 2 2 2&#xff0c;这样画一个圆的轮廓 或者2 1 1 3 5 1 1 1 1 2 4 &#xff0c; 2 最暗一层的黑色&#xff0c;做阴影部分&#xff0c;就是7 4 3 2 做最深的部分 各个地方画一些浅色的&#xff0c;做高光部分&#xff0c;上面的高光偏圆…

015、列表_应用场景

1.消息队列 如图所示,Redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。 2.文章列表 每个用户有属于自己的文章列表,现…

收银系统源码-千呼新零售2.0【智慧供应链】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

FinalShell 配置SSH密钥登陆

转载请标明出处&#xff1a;http://blog.csdn.net/donkor_/article/details/139355489 文章目录 前言生成密钥服务器配置公钥本地配置私钥存储私钥FinalShell配置 总结 前言 本机FinalShell 配置SSH密钥登陆服务器&#xff0c;这样就不再需要使用密码进行登陆了。由于FinalSh…

【StableDiffusion秋叶包反斜杠问题】Failed to find xxx\sd-webui-aki-v4.8\...\xxx.pth

一、问题发生 1.在我额外安装预处理器时报错 意思是没办法找到有这么一个包&#xff08;但我已经把这个包扔进去了&#xff09; 完整报错&#xff1a; Failed to find S:\app_AI\stableDiffusion-webui-aki\sd-webui-aki-v4.8\extensions\sd-webui-controlnet\annotator\dow…

电机测试方法的介绍与功能实现(T测试方法)

目录 概述 1 理论介绍 2 实现原理 2.1 旋转式编码器原理 2.2 系统实现框图 2.3 测速原理 2.4 计算速度值 3 STM32Cube配置项目 3.1 软件版本信息 3.2 配置项目 4 代码实现 4.1 电机速度控制 4.2 速度计算函数 4.3 功能实现 5 测试 概述 本文主要介绍测试电机速…

Vue项目运行页面禁止缩放【移动端和PC端都禁止缩放】解决方案

Vue项目运行页面禁止缩放【移动端和PC端都禁止缩放】解决方案&#xff0c;有的人手很J,总喜欢放大缩小&#xff0c;从而会导致页面错乱&#xff0c;以下是解决方案&#xff0c;简单有效 效果图PC&#xff1a;滚轮缩放和其他缩放都会禁止 移动端效果图&#xff1a;各种手机平板…

SSL发送邮件时如何配置客户端确保安全性?

怎么使用SSL安全协议通过AokSend发送加密的电子邮件&#xff1f; SSL是一种常用的加密通信协议&#xff0c;用于确保数据在客户端和服务器之间的安全传输。AokSend将讨论如何通过配置客户端确保SSL发送邮件的安全性&#xff0c;并介绍如何使用SSL安全协议通过AokSend发送加密的…

zibll-V7.7最新版2024完美破解授权可用(含授权教程)

最近这个正版安装包流出来了,试了一下用以前的绕过授权方法&#xff0c;一样可以授权。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89379057 更多资源下载&#xff1a;关注我。