FPGA project : HCSR04

犯下的错误:

1,由于使用cnt_base 做echo回响信号高电平时间的测量,它的数据应该很大,位宽也很大。也可以采用cnt_us计数器,计算这个高电平时间的。我为了精确计算距离,所以才仍然用的cnt_base计数器。

2,在RESPOUND状态下,cnt_base归零条件写错了。呜呜。

因为这个add_cnt_base信号是我写代码时后加上去的,没有画它的时序图。也是我对时序逻辑赋值延后条件一个时钟周期的认识还不够深刻吧。导致这个归零条件错了一个sys_clk.

遇到的警告与解决办法:

Error:(vsim-3601) Iteration limit reached at time 55445 ns.(仿真时遇到的)

在55445ns的时候,超出了迭代的限制。一般modelsim的迭代限制为5000次。

一般认为出现这种错误,是因为在代码里面出现了回环,通常是组合电路的问题。比方说在一个组合逻辑块里面,对敏感变量进行赋值。

作为敏感变量,只要变化,就会触发组合逻辑块的赋值,而赋值又会立马让敏感变量变化,然后再触发组合逻辑块赋值。

这样循环往复,每次触发变化的时间,是几乎可以忽略不计的。一旦敏感变量触发组合电路的赋值,便会不断地,触发--赋值--触发---赋值。。。

并且组合电路动作,几乎不花时间,这样实际上就是一个死循环。

解决办法:找到代码中采用电平敏感描述组合的逻辑块,查找问题;具体,就是避免在敏感变量A所触发的逻辑块中,再次对敏感变量A进行赋值操作。

hc_sr04的代码里64行,就是活生生的例子。

 

 

 

module hc_sr04 (input       wire            sys_clk     ,input       wire            sys_rst_n   ,input       wire            echo        ,output      reg             trig        ,output      reg     [19:0]  distance
);// parameter parameter       MS_500     = 20'd499_999 ;// localparamlocalparam      WAIT_500MS = 3'b001 ,TRIGER     = 3'b010 ,RESPOUND   = 3'b100 ;// wire signal definewire            flag_base           ;wire            nege                ;wire            pose                ;wire            WAIT_500MStoTRIGER  ;  wire            TRIGERtoRESPOUND    ;    wire            RESPOUNDtoWAIT_500MS;// reg signal definereg             echo_reg0   ;reg             echo_reg1   ;reg             echo_reg2   ;reg             flag        ;reg             add_cnt_base;reg     [2:0]   state_c     ;reg     [2:0]   state_n     ;reg     [31:0]  cnt_base    ;reg     [19:0]  cnt_us      ;/*******************************************************************************/// wire            flag_base;assign flag_base = (cnt_base == 49) ? 1'b1 : 1'b0 ;// wire            flag    ;// assign flag = (state_c != RESPOUND) ? ((state_c == WAIT_500MS && cnt_us == MS_500) ?  1'b1 : (state_c == TRIGER && cnt_us == 10) ? 1'b1 : 1'b0) : 1'b0 ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginflag <= 0 ;end else begincase (state_c)WAIT_500MS: beginif(cnt_us == MS_500) beginflag <= 1 ;end else beginflag <= 0 ;endendTRIGER    : beginif(cnt_us == 10) beginflag <= 1 ;end else beginflag <= 0 ;endendRESPOUND  : flag <= 0 ;default   : flag <= 0 ;endcaseendend// wire            nege    ;// wire            pose    ;assign nege = ~echo_reg1 &&  echo_reg2 ;assign pose =  echo_reg1 && ~echo_reg2 ;// // wire            add_cnt_base;// assign add_cnt_base = (pose || nege) ? ~add_cnt_base : 1'b0 ; 这里产生了迭代。不利于仿真,所以改成时序逻辑。always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginadd_cnt_base <= 1'b0 ;end else beginif(pose || nege) beginadd_cnt_base <= ~add_cnt_base ;end else beginadd_cnt_base <=  add_cnt_base ;endendend// reg signal define// reg             echo_reg0;// reg             echo_reg1;// reg             echo_reg2;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginecho_reg0 <= 1'b0 ;echo_reg1 <= 1'b0 ;echo_reg2 <= 1'b0 ;end else beginecho_reg0 <= echo      ;echo_reg1 <= echo_reg0 ;echo_reg2 <= echo_reg1 ;endend// reg     [2:0]   state_c  ;// reg     [2:0]   state_n  ; 三段式状态机,状态转移描述,状态转移条件描述,与状机有关信号描述always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginstate_c <= WAIT_500MS ;end else beginstate_c <= state_n ;endendalways @(*) begincase (state_c)WAIT_500MS :beginif(WAIT_500MStoTRIGER) beginstate_n <= TRIGER ;end else beginstate_n <= WAIT_500MS ;endendTRIGER     :beginif(TRIGERtoRESPOUND) beginstate_n <= RESPOUND ;end else beginstate_n <= TRIGER ;endendRESPOUND   :beginif(RESPOUNDtoWAIT_500MS) beginstate_n <= WAIT_500MS ;end else beginstate_n <= RESPOUND ;endenddefault:state_n <= WAIT_500MS ;endcaseendassign  WAIT_500MStoTRIGER      = (state_c == WAIT_500MS) && (flag_base && flag) ;assign  TRIGERtoRESPOUND        = (state_c == TRIGER    ) && (flag_base && flag) ;assign  RESPOUNDtoWAIT_500MS    = (state_c == RESPOUND  ) && (nege) ;// reg     [19:0]  cnt_base ; // 用来产生1us信号,也用来计算距离。always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begincnt_base <= 32'd0 ;end else begincase (state_c)WAIT_500MS :beginif(cnt_base == 49) begincnt_base <= 32'd0 ;end else begincnt_base <= cnt_base + 1'b1 ;endendTRIGER     :beginif(cnt_base == 49) begincnt_base <= 32'd0 ;end else begincnt_base <= cnt_base + 1'b1 ;endendRESPOUND   :beginif(nege) begincnt_base <= 32'd0 ;end else beginif(add_cnt_base) begincnt_base <= cnt_base + 1'b1 ;end else begincnt_base <= cnt_base ;endendenddefault:cnt_base <= 32'd0 ;endcaseendend// reg     [19:0]  cnt_us   ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begincnt_us <= 20'd0 ;end else begincase (state_c)WAIT_500MS: beginif(flag_base && cnt_us == MS_500) begincnt_us <= 20'd0 ;end else beginif(flag_base) begincnt_us <= cnt_us + 1'b1 ;end else begincnt_us <= cnt_us ;endendendTRIGER    : beginif(flag_base && cnt_us == 10) begincnt_us <= 20'd0 ;end else beginif(flag_base) begincnt_us <= cnt_us + 1'b1 ;end else begincnt_us <= cnt_us ;endendendRESPOUND  :cnt_us <= 20'd0 ;default: cnt_us <= 20'd0 ;endcaseendend// reg             trig     ,always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begintrig <= 1'b0 ;end else beginif(state_c == TRIGER) begintrig <= 1'b1 ;end else begintrig <= 1'b0 ;endendend// reg     [19:0]  distancealways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begindistance <= 20'd0 ;end else beginif(nege) begindistance <= (cnt_base * 20'd34 / 20'd10000) ;end else begindistance <= distance ;endendend
endmodule

 

module top(input       wire            sys_clk     ,input       wire            sys_rst_n   ,input       wire            echo        ,output      wire            trig        ,output      wire            ds          ,output      wire            oe          ,output      wire            shcp        ,output      wire            stcp    
);// 例化间连线wire    [19:0]      distance_w ;wire    [05:0]      point_w    ;wire                sign_w     ;wire                seg_en_w   ;assign              point_w = 6'b000_010 ;assign              sign_w  = 1'b0       ;assign              seg_en_w= 1'b1       ;hc_sr04 hc_sr04_insert(.sys_clk                    ( sys_clk    ) ,.sys_rst_n                  ( sys_rst_n  ) ,.echo                       ( echo       ) ,.trig                       ( trig       ) ,.distance                   ( distance_w )
);seg_595_dynamic seg_595_dynamic_insert(.sys_clk                    ( sys_clk    ) ,.sys_rst_n                  ( sys_rst_n  ) ,.data                       ( distance_w ) ,.point                      ( point_w    ) ,.sign                       ( sign_w     ) ,.seg_en                     ( seg_en_w   ) ,.ds                         ( ds         ) ,.oe                         ( oe         ) ,.shcp                       ( shcp       ) ,.stcp                       ( stcp       )    
);endmodule

 

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

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

相关文章

什么算泄露公司机密的行为(什么程度算公司泄密行为)

在当今的商业环境中&#xff0c;保护公司的核心竞争力和商业机密是至关重要的。然而&#xff0c;员工可能出于各种原因泄露这些信息&#xff0c;包括对竞争对手的追求、个人利益的驱动或者对工作的不满。在这种情况下&#xff0c;企业需要依赖专业的调查工具来揭示和证明员工的…

【Cpp】位图Bitmap

code #include <iostream> #include <vector> #include <stdio.h> #include <stdint.h>class Bitmap { private:std::vector<uint8_t> data; // 存储位图数据的字节数组uint32_t size; // 位图的大小&#xff08;以位为单位&#x…

Vue路由及Node.js环境搭建

目录 一、Vue路由 1.1 定义 1.2 应用领域 1.3 代码展示 二、Node.js 2.1 定义 2.2 特点 2.3 Node.js安装与配置 2.3.1 下载安装包 2.3.2 手动新建文件夹 2.3.3 注意事项 2.3.4 配置环境变量 2.3.5 检验是否安装配置成功 2.3.6 设置淘宝源 2.3.7 查看全局路径设置…

通用返回结果类ResultVO

1. 定义通用返回结果类 ​ 定义ResultVO类&#xff0c;作返回给前端的对象结构&#xff0c;主要有4个字段 code : 错误码 data : 内容message : 消息description : 具体描述 import lombok.Data; import java.io.Serializable;/*** 通用返回结果类* param <T>*/ Data …

史上最详细的测试用例写作规范

软件测试用例得出软件测试用例的内容&#xff0c;其次&#xff0c;按照软件测试写作方法&#xff0c;落实到文档中&#xff0c;两者是形式和内容的关系&#xff0c;好的测试用例不仅方便自己和别人查看&#xff0c;而且能帮助设计的时候考虑的更周。 一个好的测试用例必须包含…

Tessy 5.0.4

Tessy 5.0.4 Linux 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

论文研读-数据共享-大数据流分析中的共享执行技术

Shared Execution Techniques for Business Data Analytics over Big Data Streams 大数据流分析中的共享执行技术 1、摘要 2020年的一篇共享工作的论文&#xff1a;商业数据分析需要处理大量数据流&#xff0c;并创建物化视图以便给用户实时提供分析结果。物化每个查询&#x…

Centos7安装wps无法打开及字体缺失的问题解决

在centos7上安装了最新的wps2019版本的wps-office-11.1.0.11704-1.x86_64.rpm&#xff0c;生成了桌面图标并信任&#xff0c;可以新建文件&#xff0c;但是软件无法打开。在终端执行如下命令&#xff0c;用命令行启动wps&#xff1a; cd /opt/kingsoft/wps-office/office6/ ./…

Learn Prompt- Midjourney 图片生成:基本设置和预设

/settings指令为模型版本、样式值、质量值和升级器版本等常用选项提供切换按钮。 备注 添加到提示末尾的参数将覆盖/settings中的设置。 模型版本​ 1️⃣ MJ Version 12️⃣ MJ Version 23️⃣ MJ Version 34️⃣ MJ Version 45️⃣ MJ Version 5&#x1f308; Niji Mode&a…

zerotier-client

title: “zerotier-client” createTime: 2022-10-10T11:50:5108:00 updateTime: 2022-10-10T11:50:5108:00 draft: false author: “zcb” tags: [“zerotier-plant”,“zerotier-client”,“zerotier”] categories: [“zerotier”] description: “测试的” 1.windows 1.1…

存储管理详解

目录 存储管理&#xff08;1&#xff09; 第一节 存储管理概述&#xff08;内存管理&#xff09; 一、存储体系 二、存储管理的任务 三、地址转换 存储管理&#xff08;2&#xff09; 第二节 分区管理方案 一、固定分区 二、可变分区 三、分区管理方案的优缺点 第…

人类的态势感知可分为先验、似然、后验的三部分

人类的态势感知可以分为先验、似然和后验三个部分。这些部分描述了在不同阶段对环境的感知和理解。先验感知&#xff1a;先验感知基于先前的知识、经验和先验信息来理解环境。它利用已有的知识和模型&#xff0c;进行预测和推断&#xff0c;从而形成对当前环境的初步认知。先验…

Qt5开发及实例V2.0-第二十一章-Qt.Quick Controls开发基础

Qt5开发及实例V2.0-第二十一章-Qt.Quick Controls开发基础 第21章 Qt Quick Controls开发基础21.1 Qt Quick Controls概述21.1.1 第一个Qt Quick Controls程序21.1.2 Qt Quick窗体应用程序的构成 21.2 Qt Quick控件21.2.1 概述21.2.2 基本控件21.2.3 高级控件21.2.4 样式定制 2…

通过插件去除Kotlin混淆去除 @Metadata标记

在Kotlin中&#xff0c;Metadata是指描述Kotlin类的元数据。它包含了关于类的属性、函数、注解和其他信息的描述。Metadata的作用主要有以下几个方面&#xff1a; 反射&#xff1a;Metadata可以用于在运行时获取类的信息&#xff0c;包括类的名称、属性、函数等。通过反射&…

Spring面试题5:面试官:为什么说Spring是一个容器?如何给Spring容器提供配置元数据?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:为什么说Spring是一个容器? Spring被称为一个容器,是因为它提供了一个运行环境和管理机制,用于管理应用程序中的对象的生命周期和依赖关系。 …

多维时序 | MATLAB实现WOA-CNN-LSTM-Attention多变量时间序列预测(SE注意力机制)

多维时序 | MATLAB实现WOA-CNN-LSTM-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09; 目录 多维时序 | MATLAB实现WOA-CNN-LSTM-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基本描…

STL-函数对象、谓词、常用算法

函数对象 函数对象概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象 函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数 本质&#xff1a; 函数对象&#xff08;仿函数&#xff09;是一个类&#xff0c;不是一个函数 函数对象使用…

嵌入式单片机上练手的小型图形库

大家好&#xff0c;今天分享一款小型的图形库。 Tiny Graphics Library&#xff1a; http://www.technoblogy.com/show?23OS 这个小型图形库提供点、线和字符绘图命令&#xff0c;用于 ATtiny85 上的 I2C 128x64 OLED 显示器. 它通过避免显示缓冲器来支持RAM有限的处理器&…

tcpdump常用命令

需要安装 tcpdump wireshark ifconfig找到网卡名称 eth0, ens192... tcpdump需要root权限 网卡eth0 经过221.231.92.240:80的流量写入到http.cap tcpdump -i eth0 host 221.231.92.240 and port 80 -vvv -w http.cap ssh登录到主机查看排除ssh 22端口的报文 tcpdump -i …

银行家算法——C语言实现

算法思路 将操作系统看作是银行家&#xff0c;操作系统所拥有的资源就相当于银行家所拥有的资产&#xff0c;进程向操作系统申请资源就相当于资产家向银行贷款&#xff0c;规定资产家在向银行贷款之前&#xff0c;先申明其所贷数额的最大值&#xff0c;申明之后其贷款的数额不…