基于FPGA的DS18B20控制程序设计及其Verilog实现_第1页
基于FPGA的DS18B20控制程序设计及其Verilog实现_第2页
基于FPGA的DS18B20控制程序设计及其Verilog实现_第3页
基于FPGA的DS18B20控制程序设计及其Verilog实现_第4页
基于FPGA的DS18B20控制程序设计及其Verilog实现_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于FPGA的DS18B20控制程序设计及其 Verilog实现一,总体介绍DS18B20是一个1-wire总线,12bit的数字温度传感器,其详细的参数这里不做具体的介绍, 只讨论其基于Verilog的控制程序的设计。实际上,对DS18B20的控制,主要是实现1-wire总线的初始化,读,写等操作,然后再根据DS18B20的控制要求,实现对其控制的verilog逻辑。在1-Wire总线上,有一个 master,可以有1个或者多个slave。而对于FPGA+DS18B20的 温度测试设计来讲,需要在FPGA上实现一个1-Wire总线的master。DS18B20作为1-wire总线的slave

2、设备存在,可以有一个或者多个,不过为了简化程序,例程里假定只存在一个 DS18B2020。1-Wire总线的操作形式上相对简单,但操作本身相对却又比较复杂。用 Verilog做控制程序 设计时,可以采用多层次嵌套的状态机来实现。二,FPGA + DS18B20的硬件设计硬件的设计非常简单,只需要将DS18B20的DQ与FPGA的一个IO连接,并加4.7K左右的上拉电阻就可以了。VDD和VPU可以为3.05.0V。这里我们参照 FPGA本身的IO电压, 选择3.3V。另外要注意的一点是,由于DQ的数据是双向的,所以FPGA的该IO要设定为inout类型。,1-Wire总线的基本操作及 Veril

3、og实现。根据1-Wire总线的特点,可以把 1-Wire总线的操作归结为初始化,单 bit读操作,单bit写 操作等最基础的几种。下面分别是几种基本操作的介绍和verilog实现。由于DS18B20的时序操作的最小单位基本上是 1us,所以在该设计中,全部采用 1MHz的时钟。1.初始化初始化实际上就是1-wire总线上的Reset操作。由master发出一定长度的初始化信号。 Slave看到该初始化信号后,在一定时间内发出规定长度的响应信号,然后初始化操作就结束了。下图是DS18B20的datasheet上给出的初始化的时序要求图示。tinnitusINITIALISATION TIMIN

4、G Figure 冷I 幽色'LUKtum r jt* a我们用一个简单的状态机来实现对DS18B20初始化的操作。根据初始化的时序要求,设计一个有3个状态的简单的状态机, 这三个状态分别是 RST_IDLE ,RST_MINIT和RST_SINIT。 系统初始化时, 处于RST_IDLE状态,当RST_EN信号有效时,进入RST_MINIT 状态,由 master发出初始化信号。当 master的初始化信号发出一定时间以后,直接进入RST_SINIT状态。在RST_SINIT状态时,master去观察slave是否输出了正确的状态:如果 slave没有 输出正确的状态,则状态机重新回

5、到RST_MINIT状态,由master重新发出初始化信号;如果slave输出了正确的状态,则意味着初始化正确完成,状态机回到RST_IDLE状态,整个初始化过程完成(这个文章里涉及到比较多的状态机,但状态机的转换都很简单,所以不会给出状态机的状态转换图,仅仅会用文字做简单叙述,有疑问的地方,可以仔细阅读相关代码)。wire RST_EN;wire RST_OVER;parameter RST_IDLE = 3'b001, /IDLE 状态RST_MINIT = 3'b010, /master 初始化操作RST_SINIT = 3'b100; /slave 初始化应答r

6、eg 2:0 RSTSM, RSTSMNXT;wire PHASE_RST_IDLE = RSTSM0;wire PHASE_RST_MINIT = RSTSM1;wire PHASE_RST_SINIT = RSTSM2;wire PHASENXT_RST_IDLE = RSTSMNXT0;always (posedge CLK1MHZ or negedge RESET) beginif(RESET)RSTSM <= RST_IDLE;elseRSTSM <= RSTSMNXT;endreg 9:0 MASTER_CNT; 用来控制 master发出初始化信号的长度always

7、(posedge CLK1MHZ or negedge RESET) begin if(RESET)MASTER_CNT <= 10'b0;else if(PHASE_RST_MINIT)MASTER_CNT <= 10'b0;elseMASTER_CNT <= MASTER_CNT + 10'b1;endreg 9:0 SLAVE_CNT;/用来判断slave是否在恰当时间返回初始化结束的信号always (posedge CLK1MHZ or negedge RESET)beginif(RESET)SLAVE_CNT <= 10'b0

8、;else if(PHASE_RST_SINIT)SLAVE_CNT <= 10'b0;elseSLAVE_CNT <= SLAVE_CNT + 10'b1;endreg SLAVE_IS_INIT; 采集并保存slave发出的初始化结束信号always (posedge CLK1MHZ or negedge RESET)beginif(RESET)SLAVE_IS_INIT <= 1'b1;else if(SLAVE_CNT = 10'd70)SLAVE_IS_INIT <= DQ_IN;else if(PHASE_RST_MINIT)

9、SLAVE_IS_INIT <= 1'b1;elseSLAVE_IS_INIT <= SLAVE_IS_INIT;endalways (RSTSM or RST_EN or MASTER_CNT or SLAVE_CNT or SLAVE_IS_INIT ) begin case(RSTSM)RST_IDLE:if(RST_EN)RSTSMNXT = RST_MINIT;elseRSTSMNXT = RST_IDLE;RST_MINIT:if(MASTER_CNT = 10'd500)RSTSMNXT = RST_SINIT;elseRSTSMNXT = RST_M

10、INIT;RST_SINIT:需要注意的是,对于master来讲,无论读回来的数据是 1还是0,其本身的操作及时序都是 一样的,没有差异。if( (SLAVE_CNT = 10'd500) & SLAVE_IS_INIT)RSTSMNXT = RST_IDLE;else if(SLAVE_CNT = 10'd500) & SLAVE_IS_INIT)RSTSMNXT = RST_MINIT;elseRSTSMNXT = RST_SINIT;default:RSTSMNXT = RST_IDLE;endcaseend在1-wire总线上,读数据的操作实际上是按bi

11、t来完成的。每次 master可以从slave读回一个bit的数据。读回的数据可能是 1或者0。下图是DS18B20的datasheet上给出的单bit读 操作的时序要求图示。assign RST_OVER = PHASE_RST_SINIT & PHASENXT_RST_IDLE; 初始化完成标志信号卜图是用示波器抓出的初始化过程DQ信号的波形(红色)。2.单bit读操作imi弑e evs4 Hv* 十MMTEA READ V SLOTMnttr “Ephn仍然用一个简单的状态机来实现对DS18B20的单bit读操作。设计一个有5个状态的简单的状态机,这五个状态分另1J是RD_IDL

12、E , RD_MPL , RD_MSAP , RD_WAIT 和 RD_OVER。系统初始化时,处于 RD_IDLE状态,当RDBEGIN信号有效时,进入 RD_MPL状态,由 master发出读信号。3us以后,进入RD_MSAP状态(master在该状态结束的前一个us读取DQ上的值彳乍为读bit的结果),在11us以后,进入RD_WAIT状态,而在读bit开始后的59us, 系统进入RD_OVER状态,意味着读bit操作结束。RD_OVER状态是为了符合 1-Wire总线 的操作规范(在每个操作之间至少有1us的总线空闲时间)而存在的。wire RDBEGIN ;parameter RD

13、_IDLE = 5'b00001, /resister pullup, larger than 1usRD_MPL = 5'b00010, /master pull low, larger than 1usRD_MSAP = 5'b00100, /ds18b20 pull low(read 0) or resister pullup(read 1), master sample data, near15usRD_WAIT = 5'b01000, /ds18b20 pull low(read 0) or resister pullup(read 1)RD_OVER

14、 = 5'b10000; /resister pullup, larger than 1usreg 4:0 RDSM, RDSMNXT;wire PHASE_RD_IDLE = RDSM0;wire PHASE_RD_MPL = RDSM1;wire PHASE_RD_MSAP = RDSM2;wire PHASE_RD_OVER = RDSM4;reg 5:0 RD_CNT;always (posedge CLK1MHZ or negedge RESET)beginif(RESET)RD_CNT <= 6'b0;else if(PHASE_RD_IDLE)RD_CNT

15、<= RD_CNT + 6'b1;elseRD_CNT <= 6'b0;endalways (posedge CLK1MHZ or negedge RESET)beginif(RESET)RDSM <= RD_IDLE;elseRDSM <= RDSMNXT;endalways (RDSM or RDBEGIN or RD_CNT) begincase(RDSM)RD_IDLE:if(RDBEGIN)RDSMNXT = RD_MPL;elseRDSMNXT = RD_IDLE;RD_MPL:if(RD_CNT = 6'd3)RDSMNXT = R

16、D_MSAP;elseRDSMNXT = RD_MPL;RD_MSAP:if(RD_CNT = 6'd14)RDSMNXT = RD_WAIT;elseRDSMNXT = RD_MSAP;RD_WAIT:if(RD_CNT = 6'd59)RDSMNXT = RD_OVER;elseRDSMNXT = RD_WAIT;RD_OVER:if(RD_CNT = 6'd61)RDSMNXT = RD_IDLE;elseRDSMNXT = RD_OVER;default:RDSMNXT = RD_IDLE;endcaseendreg RD_BIT_DATA; /读bit操作获得

17、的数据always (posedge CLK1MHZ or negedge RESET)beginif(RESET)RD_BIT_DATA <= 1'b0;else if( PHASE_RD_MSAP & (RD_CNT = 6'd13)RD_BIT_DATA <= DQ;else if(PHASE_RD_IDLE)RD_BIT_DATA <= 1'b0;elseRD_BIT_DATA <= RD_BIT_DATA;end3.单bit写操作在1-Wire总线上,写数据的操作也是按 bit来完成的。每次master可以向slave写入一个b

18、it 的数据。写数据可能是1或者0。下图是DS18B20的datasheet上给出的单bit写操作的时序 要求图示:«lotwmkr waite-v uotfI唱 eThL需要注意的是,对于 master来讲,写数据不同的时候(1或者0),其本身的操作及时序是 有差别的。对DS18B20的单bit写操作可以用一个有 4个状态的简单的状态机来实现。 这三个状态分别 是 WD_IDLE , WD_MPL , WD_OUT ,和 RD_OVER。系统初始化时, 处于 WD_IDLE 状态, 当WDBEGIN信号有效时,进入 WD_MPL状态,由master发出写信号。 9us以后,进入 W

19、D_MOUT状态(master将要写到slave的数据放到 DQ上),而在写bit开始后的59us,系 统进入RD_OVER状态,意味着写 bit操作结束。WD_OVER状态是为了符合 1-Wire总线 的操作规范(在每个操作之间至少有 1us的总线空闲时间)而存在的。wire WDBEGIN; 单bit写操作开始信号wire WD_DATA_OUT; 要写入到 slave 的值parameter WD_IDLE = 4'b0001, /resister pullup, no time requestWD_MPL = 4'b0010, /master pull low, lar

20、ger than 1us, use 10us.WD_MOUT = 4'b0100, /master pull low(write 0) or resister pull up(write 1), use 50us.WD_OVER = 4'b1000; /resister pullup, larger than 1usreg 3:0 WDSM, WDSMNXT;wire PHASE_WD_IDLE = WDSM0;wire PHASE_WD_MPL = WDSM1;wire PHASE_WD_MOUT = WDSM2;wire PHASE_WD_OVER = WDSM3;wire PHASENXT_WD_MOUT = WDSMNXT2;reg 5:0 WD_CNT;always (posedge CLK1MHZ or negedge RESET)beginif(RESET)WD_CNT <= 6'b0;else if(PHASE_WD_IDLE)WD_CNT <= WD_CNT + 6'b1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论