fpga-关于FPGA的DS18B20模块的时序问题,感觉一点错都没有啊。。。。

问题描述

关于FPGA的DS18B20模块的时序问题,感觉一点错都没有啊。。。。 5C
求大神指导一下到底哪里错了,已经调试了三四天了,不管怎么调temp的值都是0.。。

module DS18B20
(
CLK48M
//RST
DQ
temp
);
//Port declaration
input CLK48M;
//input RST;
inout DQ;
output [11:0] temp;

reg [7:0] Cnt;
reg clk1MHz;

always@(posedge CLK48M)
begin
if(Cnt==8'd23)
begin
Cnt<=8'd0;
clk1MHz<=~clk1MHz;
end
else
Cnt<=Cnt+8'd1;
end

parameter IDLE = 11'b000_0000_0001
DO_RESET = 11'b000_0000_0010
CMD_CC = 11'b000_0000_0100
CMD_44 = 11'b000_0000_1000
CMD_BE = 11'b000_0001_0000
WRITE_BYTE = 11'b000_0010_0000
Write_High = 11'b000_0100_0000
Write_Low = 11'b000_1000_0000
WAIT_750ms = 11'b001_0000_0000
READ_BIT = 11'b010_0000_0000
GET_TMP = 11'b100_0000_0000
WAIT_4MS = 11'b100_1000_1000;
//-------------------------------------------------------------------
reg [10:0] state;
reg [31:0] counter;
reg DQ;
reg [7:0] write_byte;//中间寄存器保存主机要写的指令字节
reg [3:0] write_byte_cnt;
reg [1:0] byte_flag;
reg [3:0] read_bit;
reg[11:0] temp;//12位温度数据
reg TMP_bit;

always@(posedge clk1MHz)
begin
case(state)
IDLE:
begin
DQ<=1'bz;//空闲状态释放数据总线由外接上拉电阻将DQ数据线置高
counter<=0;
write_byte_cnt<=4'b0000;
byte_flag<=2'b00;
read_bit<=4'b0;
state<=DO_RESET;
end
DO_RESET://主机拉低数据总线持续至少480us,然后释放总线
begin
if(counter<=480)
begin
DQ<=1'b0;//拉低数据线480us
counter<=counter+1'b1;
end
else if(counter>480 && counter<=780)
begin
DQ<=1'bz;//释放数据总线60us+240us=300us
counter<=counter+1'b1;
if(DQ)//检测从机是否发送Presence Pulse(持续60us~240us低电平)
begin
state<=CMD_CC;
counter<=0;
end
else
begin
state<=IDLE;
end
end
end
CMD_CC:
begin
write_byte<=8'hCC;
state<=WRITE_BYTE;
end
WRITE_BYTE://写指令字节由低位向高位依次写入从机
begin
case(write_byte_cnt)
4'b0000:
begin
state<=write_byte[0]?Write_High:Write_Low;
write_byte_cnt<=write_byte_cnt+1'b1;
end
4'b0001:
begin
state<=write_byte[1]?Write_High:Write_Low;
write_byte_cnt<=write_byte_cnt+1'b1;
end
4'b0010:
begin
state<=write_byte[2]?Write_High:Write_Low;
write_byte_cnt<=write_byte_cnt+1'b1;
end
4'b0011:
begin
state<=write_byte[3]?Write_High:Write_Low;
write_byte_cnt<=write_byte_cnt+1'b1;
end
4'b0100:
begin
state<=write_byte[4]?Write_High:Write_Low;
write_byte_cnt<=write_byte_cnt+1'b1;
end
4'b0101:
begin
state<=write_byte[5]?Write_High:Write_Low;
write_byte_cnt<=write_byte_cnt+1'b1;
end
4'b0110:
begin
state<=write_byte[6]?Write_High:Write_Low;
write_byte_cnt<=write_byte_cnt+1'b1;
end
4'b0111:
begin
state<=write_byte[7]?Write_High:Write_Low;
write_byte_cnt<=write_byte_cnt+1'b1;
end
4'b1000://8bit字节写完后在此处进行状态转换
begin
write_byte_cnt<=4'b0000;
case(byte_flag)
2'b00:
begin
state<=CMD_44;
byte_flag<=2'b01;
end
2'b01:
begin
state<=DO_RESET;
byte_flag<=2'b10;
end
2'b10:
begin
state<=CMD_BE;
byte_flag<=2'b11;
end
2'b11:
begin
state<=GET_TMP;
byte_flag<=2'b00;
end
endcase
end
default:write_byte_cnt<=4'b0000;
endcase
end
Write_High://写‘1’时序:主机拉低数据线1~27us然后释放数据总线30~数千us.
begin
if(counter<=8)//拉低数据线15us(至少1us)
begin
DQ<=1'b0;
counter<=counter+1'b1;
end
else if(counter>8 && counter begin
DQ counter end
else
begin
counter state end
end
Write_Low://写‘0’时序:主机拉低数据线30~227us然后释放数据总线1us~数千us.
begin
if(counter begin
DQ counter end
else if(counter>78 && counter begin
DQ counter end
else
begin
counter state end
end
CMD_44:
begin
write_byte state end
WAIT_750ms:
begin
if(counter>750000)//实际上只等待几us甚至不等待也可以
begin
state<=DO_RESET;
counter<=0;
end
else
counter<=counter+1'b1;
end
CMD_BE:
begin
write_byte<=8'hBE;
state<=WRITE_BYTE;
end
GET_TMP:
begin
case(read_bit)
4'h0:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
end
4'h1:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[0]<=TMP_bit;
end
4'h2:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[1]<=TMP_bit;
end
4'h3:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[2]<=TMP_bit;
end
4'h4:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[3]<=TMP_bit;
end
4'h5:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[4]<=TMP_bit;
end
4'h6:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[5]<=TMP_bit;
end
4'h7:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[6]<=TMP_bit;
end
4'h8:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[7]<=TMP_bit;
end
4'h9:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[8]<=TMP_bit;
end
4'hA:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[9]<=TMP_bit;
end
4'hB:
begin
state<=READ_BIT;
read_bit<=read_bit+1'b1;
temp[10]<=TMP_bit;
end
4'hC:
begin
state<=WAIT_4MS;
read_bit<=4'h0;
temp[11]<=TMP_bit;
end
default:read_bit<=4'h0;
endcase
end
READ_BIT://读时序:主机拉低数据总线约2~4us然后释放数据总线2~4us再读取DQ数据线上的值
begin
if(counter>=0 && counter<=3)
begin
DQ<=1'b0;//主机拉低数据总线约5us
counter<=counter+1'b1;
end
else if(counter>=4 && counter<=7)//最迟必须在29us处释放数据线
begin
DQ<=1'bz;//释放数据总线5us
counter<=counter+1'b1;
end
else if(counter==8)
begin

counter<=counter+1'b1;
TMP_bit<=DQ;
end
else if(counter>=9 && counter begin
counter end
else
begin
state counter end
end
WAIT_4MS:
begin
if(counter>4000)
begin
state<=IDLE;
counter<=0;
end
else
begin
counter<=counter+1'b1;
end
end
default:state<=IDLE;
endcase

end
endmodule

解决方案

http://zhidao.baidu.com/link?url=hHuhCm-7kxrPRRTueh_UmY_2K4si1Et8HLWvQHejTFQVlxhHJafeYOJ6A5WK--fFGmUo0QwIFQGQQTlf6yx_fK

时间: 2024-10-30 10:39:54

fpga-关于FPGA的DS18B20模块的时序问题,感觉一点错都没有啊。。。。的相关文章

什么是FPGA?FPGA是什么

本文讲的是什么是FPGA?FPGA是什么,[IT168 资讯]FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,它是在可编程阵列逻辑PAL(Programmable Array Logic).门阵列逻辑GAL(Gate Array Logic).可编程逻辑器件PLD(Programmable Logic Device)等可编程器件的基础上进一步发展的产物.它是作为专用集成电路ASIC(Application Specific Integrated

linux/weblogic 某一模块新建点击保存时报错500

问题描述 linux/weblogic 某一模块新建点击保存时报错500 在linux系统的weblogic上部署的应用包,但是有一个新建页面点击报错报错500,控制台显示错误如图所示,有遇到同样错误或是熟悉weblogic的么?急求 解决方案 http://zhidao.baidu.com/link?url=6GSnOoJ8bBKVyoutxSUtD3BimSwyhN_qpYuxW5kYZtqPqiCcyOIjyrwIHljiRGhlQZoXfhhRMbBqOcWwb8plYHPlXhf1qe

什么是FPGA?FPGA是什么?

FPGA是英文Field Programmable Gate Array的缩写,即现场可编程门阵列,它是在可编程阵列逻辑PAL(Programmable Array Logic).门阵列逻辑GAL(Gate Array Logic).可编程逻辑器件PLD(Programmable Logic Device)等可编程器件的基础上进一步发展的产物.它是作为专用集成电路ASIC(Application Specific Integrated Circuit)领域中的一种半定制电路而出现的,既解决了定制

VMware Fushion解决&quot;vmmon模块的版本不匹配&quot;报错

我手上一份新的虚拟机环境是用Windows下的VMWare Workstation 12这版本做的,对应于Mac下的VMware Fushion我的版本是7.0,加载虚机后提示错误: 说明VMware Fushion 7.0版本不能匹配上VMWare Workstation 12版本. 网上搜了一下,针对VMWare Workstation 12,需要VMware Fushion 8.5版本.下载.安装再次启动可还是报错: 机锋网上这篇文章可以解决这个问题(http://bbs.feng.com

FPGA 那些事儿之异构计算

FPGA 那些事儿之异构计算 简介 对于一个软件开发人员,可能听说过 FPGA,甚至在大学课程设计中,可能拿FPGA做过计算机体系架构相关的验证,但是对于它的第一印象可能觉得这是硬件工程师干的事儿. 目前,随着人工智能的兴起,GPU 借助深度学习,走上了历史的舞台,并且正如火如荼的跑者各种各样的业务,从 training 到 inference 都有它的身影.FPGA 也借着这股浪潮,慢慢地走向数据中心,发挥着它的优势.所以接下来就讲讲 FPGA 如何能让程序员们更好友好的开发,而不需要写那些烦

Intel FPGA技术大会分享

9月8日,Intel FPGA技术大会(IFTD)在杭州举办,我和鹏起共同参加了这次技术大会.会上Intel对FPGA未来发展的技术路线和应用场景进行了介绍,并且给我们带来了应用在未来FPGA上的一些新技术.本文着重介绍未来的FPGA和基于FPGA的硬件平台会具有哪些新的功能和特点,以及这些功能和特点对我们互联网企业和云计算的价值. 什么是FPGA 首先向大家介绍一些什么是FPGA.FPGA(Field-Programmable Gate Array)是现场可编程门阵列的英文缩写.简单来说,FP

人工智能芯片FPGA与ASIC的产业分析

随着人工智能产业链的火速延伸,GPU并不能满足所有场景(如手机)上的深度学习计算任务, GPU并不是深度学习算力痛点的唯一解.目前以深度学习为代表的人工智能计算需求,主要采用GPU.FPGA等已有适合并行计算的通用芯片来实现加速. FPGA人工智能芯片.jpg 在产业应用没有大规模兴起之时,使用这类已有的通用芯片可以避免专门研发定制芯片(ASIC)的高投入和高风险.但是,由于这类通用芯片设计初衷并非专门针对深度学习,因而天然存在性能.功耗等方面的瓶颈.随着人工智能应用规模的扩大,这类问题将日益突

MPEG-2复用器PSI信息分析部分的FPGA实现

复用器是数字电视前端平台的关键设备,它的主要功能是完成对输入多路传输流(Transport Stream,TS)的复用工作,它的性能稳定性直接影响前端平台的运行.而复用器对传输流中节目特殊信息(Program Spe-cial Information,PSI)的分析处理是否完整全面,则直接影响到复用器其他功能部分的运行结果是否正确.对PSI信息的检测分析是复用器设计中首要的也是最重要的部分之一.下文将对PSI信息检测问题进行深入的分析探讨. 1 TS流语法结构 传输流以TS包为单位,其中每个包的

FPL 2017最佳论文:如何对FPGA云发动DoS攻击?

第27届现场可编程逻辑与应用国际会议(The International Conference on Field-Programmable Logic and Applications,FPL)九月份在比利时根特召开.在FPL 2017上,一篇来自德国卡尔斯鲁厄理工学院(Karlsruhe Institute of Technology)的论文<Voltage Drop-based Fault Attacks on FPGAs using Valid Bitstreams>获得了最佳论文奖,同