Xilinx FPGA:vivado实现超声波测距

项目要求:

超声波模块测出的距离显示在数码管上

产生时钟使能信号的模块:

`timescale 1ns / 1ps
//产生1us为周期的时钟使能信号
//1us/20ns=50,div_cnt内部计数周期为0~49
module vlg_en(input              sys_clk    ,input              rst_n      ,output    reg      clk_en      //clk_en的时钟周期为1us);reg  [7:0]    div_cnt   ;//对输入时钟sys_clk做分频计数,产生1us的时钟使能信号always @(posedge sys_clk )if(!rst_n)div_cnt <= 0 ;else if ( div_cnt == 50 )div_cnt <= 0 ;elsediv_cnt <= div_cnt +1 ;//产生时钟使能信号always@(posedge sys_clk )if(!rst_n)clk_en <= 0 ;else if ( div_cnt == 49 )clk_en <= 1 ;elseclk_en <= 0 ;endmodule

产生trig信号的模块

`timescale 1ns / 1ps
module vlg_trig(input                sys_clk    ,input                rst_n      ,input                clk_en     ,   //1us为周期的时钟使能信号output      reg      trig    );parameter        trig_50000 = 16'd50_000 ;reg    [16:0]     trig_cnt    ;  //  T=50ms   t=1us   50ms/1us = 50000   位宽是16//trig_cnt计满50msalways@(posedge sys_clk)if(!rst_n)trig_cnt <= 0 ;else if ( clk_en == 1 && trig_cnt == trig_50000 -1 )trig_cnt <= 0 ;else if ( clk_en == 1 ) trig_cnt <= trig_cnt +1 ;elsetrig_cnt <= trig_cnt   ;//产生保持10us的高脉冲trig信号always@(posedge sys_clk)if (!rst_n)trig <= 0 ;else if ( trig_cnt > 0 && trig_cnt < 4'd10)trig <= 1 ;elsetrig <= 0 ;endmodule

对echo信号高脉冲计时

`timescale 1ns / 1ps
module vlg_echo(input                  sys_clk   ,input                  rst_n     ,input                  clk_en    ,input                  echo      ,
//     output   reg[15:0]     num_max  ,output    wire[15:0]     distance  );reg[15:0]     num_max  ;reg        [1:0]        r_echo  ;//echo信号的边沿检测wire                  pos_echo  ;wire                  neg_echo  ;reg                     cnt_en  ;reg       [15:0]      echo_cnt  ;always@(posedge sys_clk)if(!rst_n)r_echo <= 0 ;elser_echo <= { r_echo[0],echo} ;  // echo 是原始信号  r_echo[0] 是延迟一拍的echoassign  pos_echo = r_echo[0] & ~r_echo[1]  ; //这句话中的r_echo[0]是原始信号echo,r_echo[1]是是延迟一拍的echoassign  neg_echo = ~r_echo[0] & r_echo[1]  ;  always @(posedge sys_clk)if(!rst_n)cnt_en <= 0 ;else if ( pos_echo ) cnt_en <= 1 ;else if ( neg_echo ) cnt_en <= 0 ;elsecnt_en <= cnt_en ;//对echo信号高脉冲计时,以us为单位always @(posedge sys_clk )if(!rst_n)echo_cnt <= 0 ;else if ( !cnt_en )echo_cnt <= 0 ;else if ( cnt_en )echo_cnt <= echo_cnt +1 ;elseecho_cnt <= 0 ;//对echo_cnt计数最大值进行锁存always@(posedge sys_clk)if( !rst_n )num_max <= 0 ;else if ( neg_echo )num_max <= echo_cnt ;assign distance = num_max * 20 /58 /1000   ;
endmodule

译码器模块:

`timescale 1ns / 1ps
module translate(input     [3:0]       num   ,output    reg[7:0]    seg   );always@(*)case(num)4'd0: seg = 8'h3f;4'd1: seg = 8'h06;4'd2: seg = 8'h5b;4'd3: seg = 8'h4f;4'd4: seg = 8'h66;4'd5: seg = 8'h6d;4'd6: seg = 8'h7d;4'd7: seg = 8'h07;4'd8: seg = 8'h7f;4'd9: seg = 8'h6f;default:;  endcase endmodule

数码管模块

`timescale 1ns / 1ps
module state_SEG(input                   sys_clk  ,input                   rst_n    ,input       [15:0]      number   ,output     wire[3:0]     DIG    ,output     wire[7:0]     SEG     );parameter           MODE =0  ;reg     [3:0]        num  ;reg     [3:0]        dig  ;wire    [7:0]        seg  ;//例化译码器模块   translate translate1(. num ( num ) ,. seg ( seg ) ); //数据提取wire      [3:0]      num_ge    ;wire      [3:0]      num_shi    ;wire      [3:0]      num_bai    ;wire      [3:0]      num_qian    ;assign       num_ge   = number%10  ;assign       num_shi  = number/10%10  ;assign       num_bai  = number/100%10  ;assign       num_qian = number/1000%10  ;//状态机parameter            TIME_1ms = 16'd50_00 ;localparam            IDLE = 4'b0000  ;localparam            GE   = 4'b0001  ;localparam            SHI  = 4'b0010  ;localparam            BAI  = 4'b0100  ;localparam            QIAN = 4'b1000  ;reg        [3:0]      cur_state       ;reg        [3:0]      next_state       ;reg        [15:0]     cnt_1ms          ;always@(posedge sys_clk)if(!rst_n)cur_state <= IDLE  ;elsecur_state <= next_state ;always@(*)case(cur_state)IDLE   :beginnext_state = GE  ;endGE     :                 beginif ( cnt_1ms == TIME_1ms -1 )next_state = SHI  ;elsenext_state = cur_state  ;endSHI    :beginif ( cnt_1ms == TIME_1ms -1 )next_state = BAI  ;elsenext_state = cur_state  ;endBAI    :beginif ( cnt_1ms == TIME_1ms -1 )next_state = QIAN  ;elsenext_state = cur_state  ;endQIAN   :beginif ( cnt_1ms == TIME_1ms -1 )next_state = GE  ;elsenext_state = cur_state  ;enddefault:;endcasealways@(posedge sys_clk)if(!rst_n)begincnt_1ms <= 0 ;dig     <= 0 ;num     <= 0 ;endelsecase(cur_state)IDLE  :begincnt_1ms <= 0 ; dig     <= 0 ; num     <= 0 ; endGE    :begindig <= 4'b1110 ;num <= num_ge  ;if( cnt_1ms == TIME_1ms -1 )cnt_1ms <= 0 ;elsecnt_1ms <= cnt_1ms +1 ;endSHI   :begindig <= 4'b1101 ;num <= num_shi  ;if( cnt_1ms == TIME_1ms -1 )cnt_1ms <= 0 ;elsecnt_1ms <= cnt_1ms +1 ;end           BAI   :begindig <= 4'b1011 ;num <= num_bai  ;if( cnt_1ms == TIME_1ms -1 )cnt_1ms <= 0 ;elsecnt_1ms <= cnt_1ms +1 ;end           QIAN  :begindig <= 4'b0111 ;num <= num_qian  ;if( cnt_1ms == TIME_1ms -1 )cnt_1ms <= 0 ;elsecnt_1ms <= cnt_1ms +1 ;end  default:;         endcaseassign     DIG  = ( MODE == 0 ) ? dig :~dig ;     assign     SEG  = ( MODE == 0 ) ? seg :~seg ;     endmodule

顶层

`timescale 1ns / 1ps
module vlg_top(input                      sys_clk    ,input                      rst_n      ,input                      echo       ,output                     trig       ,   output     wire[3:0]       DIG        ,output     wire[7:0]       SEG     );//使能时钟产生模块wire        clk_en    ;vlg_en  vlg_en1(.  sys_clk (sys_clk)   ,.  rst_n   (rst_n  )   ,.  clk_en  (clk_en )    //clk_en的时钟周期为1us);//产生超声波测距模块的触发信号trigvlg_trig vlg_trig1(.   sys_clk (sys_clk)   ,.   rst_n   (rst_n  )   ,.   clk_en  (clk_en )   ,   //1us为周期的时钟使能信号.   trig    (trig   ));//回响信号echo的高电平时间采集wire[15:0]     distance    ;vlg_echo vlg_echo1( . sys_clk (sys_clk)  ,. rst_n   (rst_n  )  ,. clk_en  (clk_en )  ,. echo    (echo   )  ,. distance (distance) );//数码管模块state_SEG state_SEG1(.   sys_clk (sys_clk) ,.   rst_n   (rst_n  ) ,.   number  (distance ) ,.    DIG    ( DIG   ) ,.    SEG    ( SEG   ) );endmodule

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

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

相关文章

go语言day2 配置

使用cmd 中的 go install &#xff1b; go build 命令出现 go cannot find main module 错误怎么解决&#xff1f; go学习-问题记录(开发环境)go: cannot find main module&#xff1b; see ‘go help modules‘_go: no flags specified (see go help mod edit)-CSDN博客 在本…

文字实录|Checkout.com大中华区总经理项尧:品牌全球化发展中的支付运营策略

大家好&#xff0c;很高兴在此次【品牌全球化营销增长峰会】与大家一起分享和交流。 我叫项尧&#xff0c;是 Checkout.com 大中华区的总经理&#xff0c;在支付领域有将近15年的经验。 我们 Checkout.com 是一家总部位于英国的支付公司&#xff0c;专注于线上收单&#xff0…

Charles 忽略IP授权 Allow 弹窗

当有新的设备连接到 Charles 时&#xff0c;会出现如下弹框确认是否允许&#xff0c;如果希望允许所有客户端连接不再有提示&#xff0c;可以通过添加模糊IP规则来实现。 配置方法&#xff1a;Proxy > Access Control Settings 中添加 0.0.0.0/0 和 ::/0 即可&#xff0c;…

数字孪生如何赋能智慧加油站?

在当今数字化转型的浪潮中&#xff0c;智慧城市的构建正以前所未有的速度推进&#xff0c;而智慧加油站作为智慧城市生态系统的重要组成部分&#xff0c;其升级转型显得尤为重要。随着国家“十四五”规划对智慧城市和数字化建设的明确指引&#xff0c;以及“碳达峰、碳中和”目…

08 元组和集合

目录 一、元组&#xff08;tuple&#xff09; 1. 什么是元组 2. 查操作 3. 函数和方法 二、集合&#xff08;set&#xff09; 1. 什么是集合 2. 数学集合运算 一、元组&#xff08;tuple&#xff09; 1. 什么是元组 元组是容器型数据类型&#xff0c;将( )作为容器的标…

java-冒泡排序 3

### 15. 综合示例 为了全面展示冒泡排序的各种实现和优化&#xff0c;我们可以编写一个综合示例&#xff0c;包含基本冒泡排序、优化版冒泡排序和鸡尾酒排序。 java public class ComprehensiveBubbleSort { // 基本冒泡排序 public static void basicBubbleSort(int[] a…

考研数学(3/9):一元函数积分学

目录 一元函数积分学 1. 不定积分 1.1 不定积分的定义 1.2 不定积分的性质 1.3 不定积分的计算方法 2. 定积分 2.1 定积分的定义 2.2 定积分的性质 2.3 定积分的计算方法 3. 定积分的应用 3.1 求平面图形的面积 3.2 求旋转体的体积 3.3 求曲线的弧长 3.4 求曲面的…

【数据建模】微分方程与动力系统

文章目录 微分方程与动力系统1. 微分方程的理论基础1.1 函数、导数与微分1.2 一阶线性微分方程的解1.3 二阶常系数线性微分方程的解 2. 使用python求解微分方程2.1 求解微分2.2 求解定积分2.2.1 quad函数求解2.2.2 梯型法则求解 3. 使用Scipy和Sympy解微分方程3.1 使用sympy求解…

MATLAB中findall用法

目录 语法 说明 示例 查找具有可见或隐藏句柄的图窗 查找句柄处于隐藏状态的对象 查找 Text 对象 提示 findall的功能是查找所有图形对象。 语法 h findall(objhandles) h findall(objhandles,prop1,value1,...,propN,valueN) 说明 h findall(objhandles) 返回 ob…

VUE JS 将html转成pdf 例子

在Vue.js中生成PDF文件&#xff0c;可以使用html2canvas和jspdf库。 安装依赖库 npm install html2canvas jspdf在Vue组件中使用 <template><div><button click"generatePDF">生成PDF</button></div> </template><script&…

ubuntu22.04 设置双屏

一 概述 最近把ubuntu18.04 升级到 22.04 双屏显示出来问题&#xff0c;在此记录下解决问题方案。二 解决方案 1 使用命令查看能检测到显示器 xrandr根据输出的信息&#xff0c;我们可以知道 HDMI-0 与 DP-0 是connected 。检测到两个显示器 2 设置输出显示器分辨率 由于我…

关于Vite+Vue+Ts WebStorm路径别名的问题

一、准备一个项目 二、在 vite.config.js 中添加 resolve: {alias: {: /src}} 三、tsconfig.app.json中添加代码 //添加代码"baseUrl": ".","paths": {"/*": ["src/*"]}把src的一个文件修改路径为开头 四、安装插件 npm i …

来给大家推荐得10个有效磁力导航链接(好用搜资料找资源)

都2024现在网上找资源像流水得鱼一样&#xff0c;抓一大把结果很难吃&#xff0c;我通宵特意整理的网站&#xff0c;网上有许多磁力导航网站可以提供海量的磁力链接资源&#xff0c;以下是一些有效的磁力导航网站推荐&#xff1a; 磁力搜索 网站地址&#xff1a;www.chiliso…

安装软件时出现风险警告——代码签名证书帮您解决(申请与优惠)

您开发的软件在用户下载安装时是否有以下弹窗提醒&#xff1f; 如何让用户信任软件并下载软件&#xff0c;是众多软件开发公司需要迫切去解决的问题&#xff0c;由此代码签名证书应运而生。 一 什么是代码签名证书 代码签名证书是一种提供给软件开发者&#xff0c;对其开发的…

上下文管理器在Python中的妙用

更多Python学习内容&#xff1a;ipengtao.com Python上下文管理器是一个非常强大的工具&#xff0c;它能够帮助开发者在特定代码块前后自动执行特定的操作&#xff0c;常用于资源管理&#xff0c;如文件操作、数据库连接和锁定等。本文将详细介绍Python上下文管理器的概念、使用…

【C++】final关键字 | 避免派生、重写

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

AWS云计算平台:全方位服务与实践案例

摘要 在数字化浪潮的推动下&#xff0c;云计算已成为企业转型的强大引擎。AWS作为云计算的先锋&#xff0c;不仅提供了一系列强大的基础设施服务&#xff0c;更是在人工智能领域不断探索和创新。本文将带您领略AWS的全方位服务&#xff0c;并透过实际案例&#xff0c;感受其在…

注解详解系列 - @ConditionalOnProperty:基于属性的条件配置

注解简介 在今天的注解详解系列中&#xff0c;我们将探讨ConditionalOnProperty注解。ConditionalOnProperty是Spring Boot提供的一个注解&#xff0c;用于基于配置属性的值来有条件地包含或排除Bean定义。通过ConditionalOnProperty注解&#xff0c;可以根据外部配置文件中的…

最新MDYS14源码影视视频网站模板/苹果CMS系统/附搭建教程

最新MDYS14源码影视视频网站模板/苹果CMS系统/附搭建教程 基本介绍&#xff1a; 1、后台增加自定义参数&#xff0c;对应会员升级页面&#xff0c;以及积分充值 2、视频&#xff0c;演员&#xff0c;专题&#xff0c;收藏&#xff0c;会员系统模块齐全&#xff0c;支持子分类…

发包真香之:scapy工具

scapy – python 可自由组包 参考学习&#xff1a;初识Scapy–Python的Scapy/Kamene模块学习之路 scapy 介绍 Scapy是基于Python语言的网络报文处理程序&#xff0c;它可以让用户发送、嗅探、解析、以及伪造网络报文&#xff0c;运用Scapy可以进行网路侦测、端口扫描、路由追…