FPGA project : DS18B20

本想着一天发一个实验的,这个ds18b20,耗时两天。代码写了两次,呜呜~

由于第二次写代码没画时序图,所以代码和时序图一些参数有些不一致,但问题不大。

这里有几件事情值得一提:

1:关于状态机的编写,我觉得还是三段式比较好。

2:关于生成其他时钟信号,用来做触发边沿。我不喜欢用这种方法(提一个概念“全局时钟网络”)。所以用产生一个1us base基础计时器,产生一个1us的标志信号。之后的计数器与该计数器级联,记得把<end_cnt_base>这个标志信号加上。

我犯下的错误:

1:在画时序图是,没有画<end_cnt_base>标志信号,直接默认时钟为周期为1us,造成了混乱。所以以后要注意。

2:&& 逻辑写成了 || 逻辑

3:三态门输出 Z 写成了 1

4:数据位宽定义错误,因为少思考了一个数据对应的位宽。

4:读取温度时,少记一位。注意data_bit跳转条件,和发指令时不一样的。

 

 

module ds18b20(input   wire            sys_clk     ,input   wire            sys_rst_n   ,inout   wire            dq          ,output  reg     [19:0]  data        ,output  reg             sign  
);// localparam   指令,先发低位。localparam      WR_CMD_WORD = 16'h44CC    ,RD_CMD_WORD = 16'hBECC    ;localparam      INIT        =  6'b000_001 ,WR_CMD      =  6'b000_010 ,WAIT        =  6'b000_100 ,INIT_AGIN   =  6'b001_000 ,RD_CMD      =  6'b010_000 ,RD_TEMP     =  6'b100_000 ;// wire signal definewire            end_cnt_base      ;wire            INITtoWR_CMD      ;wire            WR_CMDtoWAIT      ;wire            WAITtoINIT_AGIN   ;wire            INIT_AGINtoRD_CMD ;wire            RD_CMDtoRD_TEMP   ;wire            RD_TEMPtoINIT     ;// reg  signal definereg     [5:0]   cnt_base     ;reg             dq_en        ;reg             dq_out       ;reg     [5:0]   state_c  /*synthesis preserve*/;reg     [5:0]   state_n  /*synthesis preserve*/;reg     [19:0]  cnt          ;reg     [4:0]   data_bit     ;reg             flag_respond ;reg             data_done    ;reg     [15:0]  data_temp    ; // 读取高速缓存器的byte0和byte1,一共16位。/****************************************************************************************/// reg     [5:0]       cnt_base ;// wire                end_cnt_base ;always @(posedge sys_clk or negedge sys_rst_n) if(~sys_rst_n)cnt_base <= 6'd0 ;else if(end_cnt_base)cnt_base <= 6'd0 ;else cnt_base <= cnt_base + 1'b1 ;assign  end_cnt_base = cnt_base == 49;// reg     [5:0]       state_c ;always @(posedge sys_clk or negedge sys_rst_n)if(~sys_rst_n)state_c <= INIT;else state_c <= state_n ;// reg     [5:0]       state_n ;always @(*)case (state_c)INIT       :if(INITtoWR_CMD)state_n <= WR_CMD ;else state_n <= INIT ;WR_CMD     :if(WR_CMDtoWAIT)state_n <= WAIT ;else state_n <= WR_CMD ;WAIT       :if(WAITtoINIT_AGIN)state_n <= INIT_AGIN ;else state_n <= WAIT ;INIT_AGIN  :if(INIT_AGINtoRD_CMD)state_n <= RD_CMD ;else state_n <= INIT_AGIN ;RD_CMD     :if(RD_CMDtoRD_TEMP)state_n <= RD_TEMP ;else state_n <= RD_CMD ;RD_TEMP    :if(RD_TEMPtoINIT)state_n <= INIT ;else state_n <= RD_TEMP ;default    :    state_n <= INIT ;endcase// 状态转移条件assign  INITtoWR_CMD        = (state_c == INIT      ) && (end_cnt_base && flag_respond == 1'b1 && cnt == 999);assign  WR_CMDtoWAIT        = (state_c == WR_CMD    ) && (end_cnt_base ==1'b1 && cnt == 60 && data_bit == 15) ;assign  WAITtoINIT_AGIN     = (state_c == WAIT      ) && (end_cnt_base && cnt == 749_999)  ;assign  INIT_AGINtoRD_CMD   = (state_c == INIT_AGIN ) && (end_cnt_base && flag_respond == 1'b1 && cnt == 999);assign  RD_CMDtoRD_TEMP     = (state_c == RD_CMD    ) && (end_cnt_base ==1'b1 && cnt == 60 && data_bit == 15)  ;assign  RD_TEMPtoINIT       = (state_c == RD_TEMP   ) && (end_cnt_base ==1'b1 && cnt == 60 && data_done == 1'b1);// reg     [19:0]       cnt ;always @(posedge sys_clk or negedge sys_rst_n)if(~sys_rst_n)cnt <= 20'd0 ;else case (state_c)INIT      : if(cnt == 999 && end_cnt_base == 1'b1)cnt <= 20'd0 ;else if(end_cnt_base == 1'b1)cnt <= cnt + 1'b1 ;WR_CMD    : if(cnt == 60 && end_cnt_base == 1'b1)cnt <= 20'd0 ;else if(end_cnt_base == 1'b1)cnt <= cnt + 1'b1 ;WAIT      : if(cnt == 749_999 && end_cnt_base == 1'b1)cnt <= 20'd0 ;else if(end_cnt_base == 1'b1)cnt <= cnt + 1'b1 ;INIT_AGIN : if(cnt == 999 && end_cnt_base == 1'b1)cnt <= 20'd0 ;else if(end_cnt_base == 1'b1)cnt <= cnt + 1'b1 ;RD_CMD    : if(cnt == 60 && end_cnt_base == 1'b1)cnt <= 20'd0 ;else if(end_cnt_base == 1'b1)cnt <= cnt + 1'b1 ;RD_TEMP   : if(cnt == 60 && end_cnt_base == 1'b1)cnt <= 20'd0 ;else if(end_cnt_base == 1'b1)cnt <= cnt + 1'b1 ;default   :     cnt <= 20'd0 ;endcase// reg     [3:0]       data_bit ;always @(posedge sys_clk or negedge sys_rst_n)if(~sys_rst_n)data_bit <= 5'd0 ;else case (state_c)INIT      : data_bit <= 5'd0 ;WR_CMD    : if(end_cnt_base == 1'b1 && cnt == 60 && data_bit == 15)data_bit <= 5'd0 ;else if(end_cnt_base == 1'b1 && cnt == 60)data_bit <= data_bit + 1'b1 ;else data_bit <= data_bit ;WAIT      : data_bit <= 5'd0 ;INIT_AGIN : data_bit <= 5'd0 ;RD_CMD    : if(end_cnt_base == 1'b1 && cnt == 60 && data_bit == 15)data_bit <= 5'd0 ;else if(end_cnt_base == 1'b1 && cnt == 60)data_bit <= data_bit + 1'b1 ;else data_bit <= data_bit ;RD_TEMP   : if(end_cnt_base == 1'b1 && cnt == 10 && data_bit == 16) // 第十微秒的时候采样。data_bit <= 5'd0 ;else if(end_cnt_base == 1'b1 && cnt == 10)data_bit <= data_bit + 1'b1 ;else data_bit <= data_bit ;default   :     data_bit <= 5'd0 ;endcase// reg                 flag_respond ;always @(posedge sys_clk or negedge sys_rst_n)if(~sys_rst_n)flag_respond <= 1'b0 ;else if(state_c != INIT && state_c != INIT_AGIN)flag_respond <= 1'b0 ;else if((state_c == INIT || state_c == INIT_AGIN) && cnt == 590 && dq == 1'b0)flag_respond <= 1'b1 ;else flag_respond <= flag_respond ;// reg                 data_done ;always @(posedge sys_clk or negedge sys_rst_n)if(~sys_rst_n)data_done <= 1'b0 ;else if(state_c != RD_TEMP)data_done <= 1'b0 ;else if(state_c == RD_TEMP && end_cnt_base == 1'b1 && data_bit == 16)data_done <= 1'b1 ;else data_done <= data_done ;// reg     [15:0]      data_temp ;always @(posedge sys_clk or negedge sys_rst_n)if(~sys_rst_n)data_temp <= 16'd0 ;else if(state_c == RD_TEMP && end_cnt_base == 1'b1 && cnt == 13)data_temp <= {dq,data_temp[15:1]} ;else data_temp <= data_temp ;// reg                 dq_en  ;// reg                 dq_out ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) begindq_en  <= 1'b0 ;dq_out <= 1'b0 ;end else begincase (state_c)INIT     :  beginif(cnt >= 0 && cnt <= 499) begindq_en  <= 1'b1 ;dq_out <= 1'b0 ;end else begindq_en  <= 1'b0 ;dq_out <= 1'b0 ;end     endWR_CMD   :  beginif(cnt == 60) begindq_en  <= 1'b0 ;dq_out <= 1'b0 ;end else beginif(WR_CMD_WORD[data_bit] == 1'b1) beginif(cnt >= 0 && cnt <= 14) begindq_en  <= 1'b1 ;dq_out <= 1'b0 ;end else begindq_en  <= 1'b0 ;dq_out <= 1'b0 ;endend else begindq_en  <= 1'b1 ;dq_out <= 1'b0 ;endend     endWAIT     :  begindq_en  <= 1'b1 ;dq_out <= 1'b1 ;endINIT_AGIN:  beginif(cnt >= 0 && cnt <= 499) begindq_en  <= 1'b1 ;dq_out <= 1'b0 ;end else begindq_en  <= 1'b0 ;dq_out <= 1'b0 ;end     endRD_CMD   :  beginif(cnt == 60) begindq_en  <= 1'b0 ;dq_out <= 1'b0 ;end else beginif(RD_CMD_WORD[data_bit] == 1'b1) beginif(cnt >= 0 && cnt <= 14) begindq_en  <= 1'b1 ;dq_out <= 1'b0 ;end else begindq_en  <= 1'b0 ;dq_out <= 1'b0 ;endend else begindq_en  <= 1'b1 ;dq_out <= 1'b0 ;endend     endRD_TEMP  :  beginif(cnt == 0 || cnt == 1) begindq_en  <= 1'b1 ;dq_out <= 1'b0 ;end else begindq_en  <= 1'b0 ;dq_out <= 1'b0 ;endenddefault:    begindq_en  <= 1'b0 ;dq_out <= 1'b0 ;endendcaseendend/***********************************************************************/// wire            dq          assign dq = (dq_en == 1'b1) ? dq_out : 1'bz ;// reg     [19:0]  data        always @(posedge sys_clk or negedge sys_rst_n)if(~sys_rst_n)data <= 20'd0 ;else if(state_c == RD_TEMP && data_done == 1'b1) if(data_temp[15] == 1'b0)data <= data_temp[10:0] * 10'd625;else data <= (~data_temp[10:0]  + 1'b1 ) * 10'd625;else data <= data ;// reg             sign always @(posedge sys_clk or negedge sys_rst_n)if(~sys_rst_n)sign <= 1'b0 ;else if(state_c == RD_TEMP && data_done == 1'b1)sign <= data_temp[15];else sign <= sign ;endmodule
module top(input       wire        sys_clk   ,input       wire        sys_rst_n ,inout       wire        dq        ,output      wire        ds        ,output      wire        oe        ,output      wire        shcp      ,output      wire        stcp    
);wire   [19:0]  data_w   /*synthesis keep */;wire           sign_w   ;wire   [05:00] point_w  ;wire           seg_en_w ;assign         seg_en_w= 1'b1       ;assign         point_w = 6'b010_000 ;ds18b20 ds18b20_insert(.sys_clk                ( sys_clk   ) ,.sys_rst_n              ( sys_rst_n ) ,.dq                     ( dq        ) ,.data                   ( 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                 ( seg_en_w  ) ,.ds                     ( ds        ) ,.oe                     ( oe        ) ,.shcp                   ( shcp      ) ,.stcp                   ( stcp      )    
);endmodule

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

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

相关文章

ceph分布式存储

ceph特点 Ceph项目最早起源于Sage就读博士期间的工作&#xff08;最早的成果于2004年发表&#xff09;&#xff0c;并随后贡献给开源社区。在经过了数年的发展之后&#xff0c;目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的…

【C语言】求一个整数的二进制序列中1的个数的三种方法

方法一&#xff1a;逐位%2法 该方法的初步测试代码如下: int NumberOf1(int n) {int count 0;while (n){if (n % 2 1){count;}n n / 2;}return count; } 众所周知&#xff0c;数据在内存里以补码的形式存储&#xff0c;这是为了简化计算机的结构设计&#xff0c;同时也提…

【数据结构】哈希表(详)

文章目录 前言正文一、基本概念二、基本原理1.哈希函数1.1直接定址法&#xff08;常用&#xff09;1.2除留余数法&#xff08;常用&#xff09;1.3 平方取中法&#xff08;了解&#xff09;1.4 折叠法(了解)1.5 随机数法(了解)1.6数学分析法(了解) 2.哈希冲突2.1 平均查找长度2…

Python —— excel文件操作(超详细)

背景 很多公司还是用excel去管理测试用例的&#xff0c;所以为了减少重复繁琐的导出导出工作&#xff0c;学会如何用代码操作excel表格很实用~ 1、读取excel文件基本步骤 1、操作excel的一些库 1、xlrd&#xff1a;读取库&#xff0c;xlwt&#xff1a;写入&#xff0c;现在…

No servers available for service: renren…。 Gateway 网关报503错误 ,已解决

目录 环境配置问题描述loadbalancer的作用 环境配置 问题描述 配置spring cloud gateway使用端口访问就可以&#xff0c;使用lb:// 就报503 gateway:routes:- id: admin_routeuri: lb://gulimall-admin # uri: http://localhost:8080predicates:- Path/api/**filter…

蓝桥杯 题库 简单 每日十题 day7

01 啤酒和饮料 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。啤酒每罐2.3元&#xff0c;饮料每罐1.9元。小明买了若干啤酒和饮料&#xff0c;一共花了82.3元。我们还知道他买的啤酒比饮料的数量少&#xff0c;请你…

CVPR 2023 | UniMatch: 重新审视半监督语义分割中的强弱一致性

在这里和大家分享一下我们被CVPR 2023录用的工作"Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation"。在本工作中&#xff0c;我们重新审视了半监督语义分割中的“强弱一致性”方法。我们首先发现&#xff0c;最基本的约束强弱一致性…

RHCE---时间服务器

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 Linux中的时间服务器是指NTP服务器&#xff0c;NTP是Network Time Protocol的缩写&#xff0c;即网络时间协议。NTP服务器可以提供精确的时间信息&#xff0c;从而使得网络上的所有设备都能…

C语言文件的相关操作

C语言中文件的相关操作 文件的打开 使用文件的打开函数需要引入这个头文件&#xff1a;#include <fcntl.h> open函数 int open(char const *pathname, int flags, mode_t mode) 功能&#xff1a;打开已有的文件或者创建新文件参数 pathname&#xff1a;文件路径名&…

基于Python+Tkinter实现一个贪食蛇小游戏

你是否还记得那个时代&#xff0c;当我们的手机还没有触摸屏&#xff0c;游戏也只有像“贪食蛇”这样的经典款&#xff1f;当时&#xff0c;许多人都沉迷于控制一条小蛇吃食物的乐趣中。而今&#xff0c;让我们利用Python和Tkinter&#xff0c;一起重温那个时代&#xff0c;制作…

C语言基础知识点(八)联合体和大小端模式

以下程序的输出是&#xff08;&#xff09; union myun {struct { int x, y, z;} u;int k; } a; int main() {a.u.x 4;a.u.y 5;a.u.z 6;a.k 0;printf("%d\n", a.u.x); } 小端模式 数据的低位放在低地址空间&#xff0c;数据的高位放在高地址空间 简记&#xff…

使用Java将PPT、PPTX和PDF转换为图片

从Office到图片—使用Java实现文件格式转换 PDF转图片1. 万事第一步2. 撸代码 PPT/PPTX转图片1. 万事第一步2. 撸代码验收一下 最近小雨遇到了一个需求&#xff0c;需要在前端小程序中嵌入展示Office文件的功能。然而&#xff0c;前端使用开源组件进行在线预览会导致性能消耗较…

R语言贝叶斯广义线性混合(多层次/水平/嵌套)模型GLMM、逻辑回归分析教育留级影响因素数据...

全文下载链接&#xff1a;http://tecdat.cn/?p24203 本教程使用R介绍了具有非信息先验的贝叶斯 GLM&#xff08;广义线性模型&#xff09; &#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 当前教程特别关注贝叶斯逻辑回归在二元结果和计数/比例结果场景中的…

基于SSM框架的《超市订单管理系统》Web项目开发(第四天)用户管理,增删改查(日期插件的使用)

基于SSM框架的《超市订单管理系统》Web项目开发&#xff08;第四天&#xff09;用户管理&#xff0c;增删改查&#xff08;日期插件的使用&#xff09; 昨天我们实现了多表关联查询&#xff0c;还有分页显示数据的功能。那么今天我们要继续完善用户管理这一模块。 今天要完成的…

clickhouse简单安装部署

目录 前言(来源于官方文档)&#xff1a; 一.下载并上传 1.下载地址&#xff1a;点我跳转下载 2.上传至Linux 二.解压和配置 1.解压顺序 注意&#xff1a;必须按照以下顺序解压&#xff0c;并且每解压一个都要执行该解压后文件的install/doinst.sh文件 解压步骤&#xff…

玩玩“小藤”开发者套件 Atlas 200I DK A2 之VSCode远程连接

玩玩“小藤”开发者套件 Atlas 200I DK A2 之VSCode远程连接 0. 背景1. VSCode 安装 Remote - SSH 插件2. 安装 OpenSSH 组件3. VSCode SSH 连接 Atlas 200I DK A24. 打开远程文件夹 0. 背景 总所周知&#xff0c;英伟达的GPU供不应求&#xff0c;还各种限制。华为推出了升腾A…

数据结构与算法:排序算法(2)

目录 堆排序 使用步骤 代码实现 计数排序 适用范围 过程 代码实现 排序优化 桶排序 工作原理 代码实现 堆排序 二叉堆的特性&#xff1a; 1. 最大堆的堆顶是整个堆中的最大元素 2. 最小堆的堆顶是整个堆中的最小元素 以最大堆为例&#xff0c;如果删除一个最大堆的…

计算机竞赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

服务器新建FTP文件备份的地址

步骤1&#xff1a;远程桌面连接 步骤2&#xff1a;输入服务器地址&#xff0c;账号&#xff0c;密码 服务器地址&#xff1a;IP地址 账号&#xff1a;Administrator 密码&#xff1a;123456 步骤3&#xff1a;点击这个一个小人的图标 步骤4&#xff1a;General–>Add–&g…

利用PPT导出一张高清图的方法,office与WPS只需要使用一个即可,我使用的是office。

利用PPT导出一张高清图的方法&#xff0c;office与WPS只需要使用一个即可&#xff0c;我使用的是office。 1&#xff0c;PPT的功能拓展来解决导出高清图片方法1.1&#xff0c;PPT功能拓展—>安装插件&#xff1a; 2&#xff0c;各种方法导出图片效果显示&#xff1a;2.1&…