FPGA project : dht11 温湿度传感器

没有硬件,过几天上板测试。

 

 

 

module dht11(input       wire        sys_clk     ,input       wire        sys_rst_n   ,input       wire        key         ,inout       wire        dht11       ,output      wire        ds          ,output      wire        oe          ,output      wire        shcp        ,output      wire        stcp          
);// 例化连线wire                    key_out_w ;wire        [19:00]     data_w    ;wire                    sign_w    ;wire        [ 5: 0]     point_w   ;wire                    en_w      ;
key_filter key_filter_insert(.sys_clk                ( sys_clk   ) ,.sys_rst_n              ( sys_rst_n ) ,.key_in                 ( key       ) ,.key_out                ( key_out_w )         
);dht11_ctrl dht11_ctrl_insert(.sys_clk                ( sys_clk    ) ,.sys_rst_n              ( sys_rst_n  ) ,.key_flag               ( key_out_w  ) ,.dht11                  ( dht11      ) ,.data_out               ( data_w     ) ,.sign                   ( sign_w     )  
);seg_595_dynamic seg_595_dynamic_insert(.sys_clk                ( sys_clk    ) ,.sys_rst_n              ( sys_rst_n  ) ,.data                   ( data_w     ) ,        .point                  ( point_w    ) ,.sign                   ( sign_w     ) ,        .seg_en                 ( en_w       ) ,.ds                     ( ds         ) ,.oe                     ( oe         ) ,.shcp                   ( shcp       ) ,.stcp                   ( stcp       )    
);endmodule
module dht11_ctrl (input               wire            sys_clk     ,input               wire            sys_rst_n   ,input               wire            key_flag    ,inout               wire            dht11       ,output              reg  [19:0]     data_out    ,output              reg             sign  
);// reg signal define// 产生us时钟reg             clk_us      ;reg     [4:0]   cnt_clk_us  ;// 内部信号(用于产生状态转移条件与输出信号)reg     [19:0]  cnt_us      ;reg     [ 6:0]  cnt_low     ;reg             dht11_reg1  ;reg             dht11_reg2  ;wire            dht11_fall  ;wire            dht11_rise  ;reg    [ 5:0]   bit_cnt     ;reg    [39:0]   data_temp   ;reg    [31:0]   data        ;reg             data_flag   ;// 三态输出reg             dht11_en    ;wire            dht11_out   ;// [4:0]   cnt_clk_us  ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begincnt_clk_us <= 5'd0 ;end else beginif(cnt_clk_us == 5'd24) begincnt_clk_us <= 5'd0 ;end else begincnt_clk_us <= cnt_clk_us + 1'b1 ;endendend//         clk_us      ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginclk_us <= 1'b0 ;end else beginif(cnt_clk_us == 5'd24) beginclk_us <= ~clk_us ;end else beginclk_us <= clk_us ;endendend// reg signal define// 在clk_us时钟域下// 状态机 三段式写法(现态与次态描述)(状态转移条件描述)(输出信号描述)localparam   WAIT_1S = 6'b000_001 ,START   = 6'b000_010 ,DELAY_1 = 6'b000_100 ,REPLAY  = 6'b001_000 ,DELAY_2 = 6'b010_000 ,RD_DATA = 6'b100_000 ;reg     [5:0]   state_c  ;reg     [5:0]   state_n  ;wire            WAIT_1StoSTART   ;wire            STARTtoDELAY_1   ;wire            DELAY_1toREPLAY  ;wire            REPLAYtoDELAY_2  ;wire            REPLAYtoSTART    ;wire            DELAY_2toRD_DATA ;wire            DELAY_2toSTART   ;always @(posedge clk_us or negedge sys_rst_n) beginif(~sys_rst_n) beginstate_c <= 6'd0 ;end else beginstate_c <= state_n ;endendalways @(*) begincase (state_c)WAIT_1S:beginif(WAIT_1StoSTART) begin state_n <= START ;end else beginstate_n <= WAIT_1S ;endendSTART  :beginif(STARTtoDELAY_1) beginstate_n <= DELAY_1 ;end else beginstate_n <= START ;endendDELAY_1:beginif(DELAY_1toREPLAY) beginstate_n <= REPLAY ;end else beginstate_n <= DELAY_1 ;endendREPLAY :beginif(REPLAYtoDELAY_2) begin state_n <= DELAY_2 ;end else beginif(REPLAYtoSTART) beginstate_n <= START ;end else beginstate_n <= REPLAY ;endendendDELAY_2:beginif(DELAY_2toRD_DATA) begin state_n <= RD_DATA ;end else beginstate_n <= DELAY_2 ;endendRD_DATA:beginif(DELAY_2toSTART) beginstate_n <= START ;end else beginstate_n <= RD_DATA ;endenddefault: state_n <= START ;endcaseend// 状态机第二段描述assign      WAIT_1StoSTART  =  (state_c == WAIT_1S && cnt_us == 20'd999_999) ? 1'b1 : 1'b0 ;assign      STARTtoDELAY_1  =  (state_c == START && cnt_us == 20'd17_999) ? 1'b1 : 1'b0 ;assign      DELAY_1toREPLAY =  (state_c == DELAY_1 && cnt_us == 20'd10) ? 1'b1 : 1'b0 ;assign      REPLAYtoDELAY_2 =  (state_c == REPLAY && dht11_rise == 1'b1 && cnt_low <= 7'd85 && cnt_low >= 7'd81) ? 1'b1 : 1'b0;assign      REPLAYtoSTART   =  (state_c == REPLAY && dht11_rise == 1'b1 && (cnt_us >= 20'd100 || cnt_us <= 20'd70)) ? 1'b1 : 1'b0 ;assign      DELAY_2toRD_DATA=  (state_c == DELAY_2 && dht11_fall == 1'b1 && cnt_us >= 20'd85 && cnt_us <= 20'd88) ? 1'b1 : 1'b0 ;assign      DELAY_2toSTART  =  (state_c == RD_DATA && bit_cnt == 6'd40 && dht11_rise == 1'b1) ? 1'b1 : 1'b0 ;// // 内部信号(用于产生状态转移条件与输出信号)// reg     [19:0]  cnt_us      ;always @(posedge clk_us or negedge sys_rst_n) beginif(~sys_rst_n) begincnt_us <= 20'd0 ;end else beginif((state_c == WAIT_1S && cnt_us == 20'd999_999) || (state_c == START && cnt_us == 20'd17_999) || (state_c == DELAY_1 && cnt_us == 20'd10) || (state_c == REPLAY && dht11_rise == 1'b1)|| (state_c == DELAY_2 && dht11_fall == 1'b1)|| (state_c == RD_DATA && (dht11_fall || dht11_rise)))begin // 记得最后加大括号cnt_us <= 20'd0 ;end else begincnt_us <= cnt_us + 1'b1 ;endendend// reg     [ 6:0]  cnt_low     ;always @(posedge clk_us or negedge sys_rst_n) beginif(~sys_rst_n) begincnt_low <= 7'd0 ;end else beginif(state_c == REPLAY && dht11_reg1 == 1'b0) begincnt_low <= cnt_low + 1'b1 ;end else begincnt_low <= 7'd0 ;endendend// reg             dht11_reg1  ;// reg             dht11_reg2  ;always @(posedge clk_us or negedge sys_rst_n) beginif(~sys_rst_n) begindht11_reg1 <= 1'b1 ;dht11_reg2 <= 1'b1 ;end else begindht11_reg1 <= dht11 ;dht11_reg2 <= dht11_reg1 ;endend// wire            dht11_fall  ;// wire            dht11_rise  ;assign dht11_fall = ~dht11_reg1 &&  dht11_reg2 ;assign dht11_rise =  dht11_reg1 && ~dht11_reg2 ;// reg    [ 5:0]   bit_cnt     ;always @(posedge clk_us or negedge sys_rst_n) beginif(~sys_rst_n) beginbit_cnt <= 6'd0 ;end else beginif(dht11_rise && bit_cnt == 6'd40 ) beginbit_cnt <= 6'd0 ;end else beginif(state_c == RD_DATA && dht11_fall) beginbit_cnt <= bit_cnt + 1'b1 ;end else beginbit_cnt <= bit_cnt ;endendendend// reg    [39:0]   data_temp   ;always @(posedge clk_us or negedge sys_rst_n) begin if(~sys_rst_n) begindata_temp <= 40'd0 ;end else beginif(state_c == RD_DATA && dht11_fall && bit_cnt <= 39) beginif(cnt_us >= 20'd50) begin // 也可以是68data_temp[39 - bit_cnt] <= 1'b1 ;end else begindata_temp[39 - bit_cnt] <= 1'b0 ;endend else begindata_temp <= data_temp ;endendend// reg    [31:0]   data        ;always @(posedge clk_us or negedge sys_rst_n) beginif(~sys_rst_n) begindata <= 32'd0 ;end else beginif(data_temp[7:0] == (data_temp[15:8] + data_temp[23:16] + data_temp[31:24] + data_temp[39:32])) begindata <=  data_temp[39:8] ;end else begindata <= data ;endendend// reg             data_flag   ; sys_clk时钟域下always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begindata_flag <= 1'b0 ;end else beginif(key_flag) begindata_flag <= ~data_flag ;end else begindata_flag <=  data_flag ;endendend// // 三态输出// wire            dht11_out   ;assign dht11 = (dht11_en == 1'b1) ? dht11_out : 1'bz ;assign dht11_out = 1'b0 ;// reg            dht11_en    ;always @(posedge clk_us or negedge sys_rst_n) beginif(~sys_rst_n) begindht11_en <= 1'd0 ;end else beginif(state_c == START) begindht11_en <= 1'b1 ;end else begindht11_en <= 1'b0 ;endendend// output signal//     reg  [19:0]     data_out    ,always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begindata_out <= 20'd0 ;end else beginif(data_flag == 1'b0) begin // 显示湿度data_out <= data[31:24] * 16'd10 ;end else begindata_out <= data[15:8] * 16'd10 + data[3:0] ;endendend // reg             sign  always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginsign <= 1'b0 ;end else beginif(key_flag == 1'b1 && data[7] == 1'b1) beginsign <= 1'b1 ;end else beginsign <= 1'b0 ;endendend
endmodule

 其他模块都是之前的,就不发了。

 

 

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

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

相关文章

安卓判断是否是模拟器,适配主流雷电,MUMU,夜神,逍遥

前言 最近游戏项目组又有新的要求&#xff0c;对于数据上报和数据统计接口&#xff0c;尽可能的具体化&#xff0c;比如是否是模拟器&#xff0c;模拟器的型号&#xff0c;品牌等&#xff0c;都要求统计&#xff0c;后续模拟器玩家在活动发放&#xff0c;安全风控等方面也易于…

uniapp开发小程序中实现骨架屏

第一步&#xff1a;小程序中实现骨架屏在微信开发者工具中点击生成骨架屏&#xff1a; 第二步&#xff1a;复制html代码&#xff0c;到骨架屏vue组件汇中再把之前写的样式代码引入进去&#xff1a; import ../../pages/user/user.css; 第三步&#xff1a;组件中引入骨架屏&am…

【干货】有效削减工厂“隐性”成本的策略

导读 在资源限制条件下&#xff0c;通过企业成本管理提高资源的利用效率&#xff0c;使有限的经济资源生产出更多的产品、创造出更多的价值&#xff0c;达到节约增产的目的&#xff0c;也是企业成本管理的重要目标。通过对大多数企业进行调研&#xff0c;发现企业成本在以下方…

大数据-玩转数据-Flink CEP编程

一、Flink CEP FlinkCEP(Complex event processing for Flink) 是在Flink实现的复杂事件处理库。它可以让你在无界流中检测出特定的数据&#xff0c;有机会掌握数据中重要的那部分。 是一种基于动态环境中事件流的分析技术&#xff0c;事件在这里通常是有意义的状态变化&#…

JDK8源码阅读环境配置

说明 环境 jdk 版本&#xff1a;1.8.0_381 系统&#xff1a;macos 13.5.1 Intel 目的 学习 jdk8 源码&#xff0c;并能自定注释。 新建 java 工程 在 idea 中新建 java 工程&#xff0c;注意并非 maven 工程。如下图&#xff1a;完成后&#xff0c;如下图&#xff1a; 配置…

kali搭建vulhub漏洞靶场

安装kali 下载kali作为虚拟环境&#xff0c; Get Kali | Kali Linux 通过vmvare打开&#xff0c;默认账号密码kali/kali 修改root密码 su passwd root 如果一些配置普通用户做不了就切换kali&#xff0c;或sudo 命令 kali配置 apt换源 echo > /etc/apt/sources.list v…

JS中BigInt的使用

JS中BigInt的使用 BigInt是一种内置对象&#xff0c;它提供了一种方法来表示大于2^53 - 1的整数&#xff0c;通俗来讲就是提供了一种可以表示任意大整数的方法&#xff0c;当我们使用Number来表示一个超过了2 ^53 - 1的整数的时候&#xff0c;会出错。所以此时我们需要使用Big…

LinkedList 源码分析

LinkedList 是一个基于双向链表实现的集合类。 LinkedList 插入和删除元素的时间复杂度 头部插入/删除&#xff1a;只需要修改头结点的指针即可完成插入/删除操作&#xff0c;因此时间复杂度为 O(1)。尾部插入/删除&#xff1a;只需要修改尾结点的指针即可完成插入/删除操作…

STM32的HAL库SPI操作(master 模式)-根据时序图配置SPI

SPI相关基础知识 SPI基本概念请自行百度&#xff0c;参考&#xff1a;百度百科SPI简介.我们讲重点和要注意的地方。 master模式下要关注的地方 接线一一对应 也就是说主控的MISO,MOSI,SCLK,[CSn]分别和设备的MISO,MOSI,SCLK,[CSn]一一对应相连&#xff0c;不交叉&#xff0…

Linux 命令大全(下)

Linux 命令大全&#xff08;上&#xff09; 本文目录 6. 网络通讯 常用命令6.1 ssh 命令 – 安全的远程连接服务器6.1.1 含义6.1.2 语法格式6.1.3 常用参数6.1.4 参考示例 6.2 netstat 命令 – 显示网络状态6.2.1 含义6.2.2 语法格式6.2.3 常用参数6.2.4 参考示例 6.3 dhclient…

爬虫逆向实战(32)-某号店登录(RSA、补环境、混淆)

一、数据接口分析 主页地址&#xff1a;某号店 1、抓包 通过抓包可以发现登录接口是/publicPassport/login.do 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现&#xff0c;有三个加密参数&#xff1a;username、password、captchaTok…

swift 问答app

结构体 mvc模式 不变性 试一试

航天航空及国防制造领军企业「同步电子」携手企企通,推进电子制造供应链管理数字化升级

从地球表面到广阔的星空&#xff0c;从近地轨道到深远的太空&#xff0c;中国的航天事业正在以前所未有的速度向前发展。每一次成功的发射&#xff0c;每一次精确的降落&#xff0c;都展现了国人无比的毅力和精湛的技术。而在北斗导航、长征火箭、嫦娥月球探测器等多个航天设备…

vscode 代码高亮显示

很多情况下vscode显示代码无法完全高亮显示&#xff0c;就很不舒服 除了语言设置为pylance之外&#xff0c;vscode本身的主题也是很重要的一个因素 改现代神色即可

Hadoop sqoop

0目录 1.安装sqoop 2.补充sqoop流程 1.安装sqoop 解压、改名 [rootkb129 install]# tar -xvf ./sqoop-1.4.7.tar.gz -C /opt/soft/ [rootkb129 soft]# mv sqoop-1.4.7/ sqoop147 拷贝配置文件 [rootkb129 conf]# pwd /opt/soft/sqoop147/conf [rootkb129 conf]# cp sqoop-en…

Java环境搭建安装IDE

Java环境搭建、安装IDE 文章目录 Java环境搭建、安装IDE1. 下载Java JDK &#xff0c;配置环境变量&#xff0c;在命令行环境下完成hello world程序&#xff1b;简介安装Step 0 安装包准备工作Step 1 下载 Java JDKStep 2 配置环境变量配置 JAVA_HOME配置 Path配置 CLASSPATH S…

巨人互动|Facebook海外户Facebook客户反馈分数

Facebook客户反馈分数是一项用于衡量用户对Facebook产品和服务满意度的指标。该指标被广泛应用于各种调研和评估活动&#xff0c;帮助Facebook了解用户对其平台和功能的意见和建议&#xff0c;并从中识别出改进的机会。 巨人互动|Facebook海外户&Facebook新闻提要的算法&am…

django添加数据库字段进行数据迁移

1.修改view.py里面的变量 2.在model.py新增字段 3.打开terminal并将环境切到项目所在环境&#xff0c;切换方式为 4.执行命令 python manage.py makemigrations backend python manage.py migrate

社区版MyApps低代码平台,免费即刻拥有!

编者按&#xff1a;本文主要介绍了MyApps推出的免费社区版的优势&#xff0c;为企业数字化转型提供了解决方案。立即登录MyApps低代码平台&#xff0c;就能获取永久免费的低代码平台。 1.MyApps社区版的优势 1.1不受限制&#xff0c;畅享自由 无用户限制、无安装限制、全面应用…

使用Cpolar 内网穿透工具,实现公网访问SeaFile搭建的私有云盘

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 现在我们身边的只能设备越来越多&#xff0c…