全天候温度纪录仪设计与FPGA实现控温项目方案

PAGE

PAGE #

全天候温度纪录仪的 设计与 FPGA 实现控 温项目方案

一、 设计相关

1.1 设计题目

全天候温度纪录仪的设计与 FPGA 实现

1.2 选题背景

当今电子产品正向功能多元化, 体积最小化, 功耗最低化的方向发展。

 它与 传统的电子产品在设计上的显著区别是大量使用大规模可编程逻辑器件, 使产品 的性能提高, 体积缩小,功耗降低同时广泛运用现代计算机技术, 提高产品的自 动化程度和竞争力,缩短研发周期。

 FPGA 开发技术正是为了适应现代电子技术 的要求,吸收众多学科最新科技成果而形成的一门新技术。基于 Verilog HDL 语 言的设计开发更是灵活多变,容易上手,方便开发人员开发新产品。

时代在发展,人们的物质生活水平在不断提高,新产品、新技术层出不穷, 电子技术的发展更是日新月异。可以毫不夸张的说,电子技术的应用无处不在, 电子技术正在不断地改变我们的生活, 改变着我们的世界。

 一个方便实用的温度 计对于大众来说更是生活中不可或缺的一件产品。

美国ALTERA公司的可编程逻辑器件采用全新的结构和先进的技术,加上 最新的QUARTUS开发环境,更具有高性能,开发周期短等特点,十分方便进 行电子产品的开发和设计本节将从 FPGA嵌入式应用开发技术与温度计发展的 客观实际出发,通过对该技术发展状况的了解,以及课题本身的需要,指出研究 基于FPGA的芯片系统与设计一一全天候温度记录仪的设计与实现的必要性。

1.3设计要求

本设计要求设计一个温度计,通过温度传感器(DS18B20)周期的测量温度 数据,同时将数据存储在 EEPROM AT24C02中,在需要读取数据温度纪录时, 读出温度纪录至板载LCD( 1602)液晶显示器显示。

系统设计

系统设计

2.1系统设计图

LCD1602

图2-1系统设计图

2.2 系统设计说明

本设计是基于 FPGA 的温度记录仪,整体系统设计如下,首先由 FPGA 控 制器驱动 DS18B02 温度传感器对当前温度进行周期性采集,并且对采集到的数 据进行处理,然后存入 EEPROM AT24C02只读存储器,最后利用LCD1602液 晶显示屏进行显示。

 同时本系统通过向用户提供按键, 方便用户读取历史温度记 录。

三、 硬件设计

3.1 FPGA 简介

3.1 1 FPGA 芯片的介绍

FPGA是现场可编程门阵列(Field Programmable Gate Array的简称,与之 相应的CPLD是复杂可编程逻辑器件(Complex Programmable Logic Device)的 简称,两者的功能基本相同, 只是实现原理略有不同, 所以有时可以忽略这两者 的区别,统称为可编程逻辑器件。

3.12 FPGA 基本结构

FPGA具有可编程门阵列的通用结构,它由逻辑功能块排成阵列,并由可编 程的互连资源连接这些逻辑功能块来实现不同的设计。

FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器 SRAM

组成。这3种可编程电路是:可编程逻辑模块、输入/输出模块(IOB--I/O Block) 和互连资源。可编程逻辑模块 CLB 是实现逻辑功能的基本单元,它们通常规则 的排列成一个阵列,散布于整个芯片;可编程输入 / 输出模块( I O B )主要完成 芯片上的逻辑与外部封装脚的接口, 它通常排列在芯片的四周; 可编程互连资源 包括各种长度的连接线段和一些可编程连接开关, 它们将各个 CLB 之间或 CLB、 IOB 之间以及 IOB 之间连接起来,构成特定功能的电路。

CLB 是 FPGA 的主要组成部分。图 3-1 是 CLB 基本结构框图,它主要

由逻辑函数发生器、触发器、数据选择器等电路组成。

 CLB 中 3 个逻辑函数发

生器分别是G、F和H,相应的输出是G' F'和H ' G有4个输入变量G1、 G2、G3和G4; F也有4个输入变量F1、F2、F3和F4。这两个函数发生器是完 全独立的,均可以实现4输入变量的任意组合逻辑函数。

 逻辑函数发生器H有3 个输入信号;前两个是函数发生器的输出 G'和F',而另一个输入信号是来自

信号变换电路的输出H1。这个函数发生器能实现3输入变量的各种组合函数。

 这3个函数发生器结合起来,可实现多达 9变量的逻辑函数。

CLB中有许多不同规格的数据选择器(四选一、二选一等) ,通过对CLB

内部数据选择器的编程,逻辑函数发生器 G、F和H的输出可以连接到CLB输 出端X或丫,并用来选择触发器的激励输入信号、时钟有效边沿、时钟使能信号 以及输出信号。这些数据选择器的地址控制信号均由编程信息提供, 从而实现所

需的电路结构。

CLB中的逻辑函数发生器F和G均为查找表结构,其工作原理类似于ROM。

 F和G的输入等效于ROM的地址码,通过查找 ROM中的地址表可以得到相应 的组合逻辑函数输出。另一方面,逻辑函数发生器 F和G还可以作为器件内高

速RAM或小的可读写存储器使用,它由信号变换电路控制。

(2)输入/输出模块IOB。IOB提供了器件引脚和内部逻辑阵列之间的连接。

 它主要由输入触发器、输入缓冲器和输出触发 /锁存器、输出缓冲器组成。

每个IOB控制一个引脚,它们可被配置为输入、输出或双向 I/O功能。当

IOB控制的引脚被定义为输入时,通过该引脚的输入信号先送入输入缓冲器。

 缓 冲器的输出分成两路:一路可以直接送到 MUX,另一路经延时几纳秒(或者不 延时)送到输入通路 D触发器,再送到数据选择器。通过编程给数据选择器不 同的控制信息,确定送至 CLB阵列的I1和I2是来自输入缓冲器,还是来自触 发器。

□ 口 □ □ □口 □ □

□ 口 □ □ □ □ □ □

图3-1 CLB基本结构

当IOB控制的引脚被定义为输出时,CLB阵列的输出信号OUT也可以有两 条传输途径:一条是直接经 MUX送至输出缓冲器,另一条是先存入输出通路 D 触发器,再送至输出缓冲器。

IOB输出端配有两只MOS管,它们的栅极均可编程,使 MOS管导通或截 止,分别经上拉电阻接通 VCC、地线或者不接通,用以改善输出波形和负载能 力。

可编程互连资源IR。可编程互连资源IR可以将FPGA内部的CLB和 CLB之间、CLB和IOB之间连接起来,构成各种具有复杂功能的系统。IR主要 由许多金属线段构成,这些金属线段带有可编程开关,通过自动布线实现各种电 路的连接。

3.13 FPGA —般设计流程

图3-2 FPGA设计流程图

LCD1602液晶显示

3.21 LCD 1602实物显示:

图3-3 LCD1602实物图

3?22功能:用来显示当前的温度值,和显示查询的温度值。

3.23接口信号说明:

表3-1接口信号表

编号

符号

引脚说聘

编号

符号

引脚说聃

1

VSS

电譚地

9

Data I/O

2

VDD

电源正极

10

D3

Data 1/O

3

VL

港晶显示偏压信号

11

D4

Data I/O

RS

数据/曲令选擇崩(H/L)

12

D5

Data I/O

5

R/W

读/写选择端(H/L)

13

t)6

Data 1/O

6

E

便能信号

14

D7

Data I/O

1

00

Data I/O

15

BLA

背光源正极

g

01

Data I/O

16

BLK

背光源负IK

3.24时序图

RSE

RS

E

D60-DB7

图3-4时序图

3?25 LCD 1602 指令

0X38设置为16*2显示,5*7点阵,8位数据接口

0X0C说明 这里0C表示的是开显示,不显示光标,光标不显示,完整

描述如下:

指令码:00001DBC

D=1开显示 D=0关显示 C=1显示光标 C=0不显示光标

B=1光标闪烁B=0光标不闪烁

DS18B20温度传感器

3.31 DS18B20 实物图

o

III

图3-5 DS 18B20实物图

3?32 功能:采集当前周围温度信息值

3.33 DS18B20接口引脚信息

表3-2接口引脚图

序号

名称

引脚功能描述

1

GND

地信号

2

DQ

数据输入/输出引脚。开漏单总线接口引脚。当被用着在 寄生电源下,也可以向器件提供电源。

3

VDD

可选择的VDD引脚。当工作于寄生电源时,此引脚必须 接地。

3?34 DS18B20的读写操作

1TMTlilAffr 醉BLOT

1TMT

lilAffr 醉BLOT

图3-6写操作

写时隙分为写"0"和写"1",时序如图,在写数据时间间隙的前15us总线需要是 被控制器拉置低电平,而后则将是芯片对总线数据的采样时间,采样时间在 15-60us,采样时间内如果控制器将总线拉高则表示写 1,如果控制器将总线拉低

则表示写0。每一位的发送都应该有一个至少 15us的低电平起始位随后的数据 0

或1应该在45us内完成。整个位的发送时间应该保持在 60-120us,否则不能保

证通信的正常。

3.35 DS18B20的读操作

MASTFR READ '(^Sl OT

MASTFR READ '(^Sl OT

图3-7读操作

读时隙时也是必须先由主机产生至少 1us 的低电平,表示读时间的起始。随 后在总线被释放后的15us中DS18B20会发送内部数据位。注意必须要在读间隙 开始的 15us 内读数据为才可以保持通信的正确。通信时,字节的读或写是从高 位开始的,即A7到A0。控制器释放总线,也相当于将总线置 1。

AT24C02 读写模块

IIC 总线协议简介

IIC 总线是一种由 PHILIPS 公司开发的两线式串行总线, 用于连接微控制器 及其外围设备。

 IIC 总线是由数据线 SDA 和时钟 SCL 构成的串行总线,可发 送和接收数据。在 CPU 与被控 IC 之间、 IC 与 IC 之间进行双向传送,最高 传送速率 100kbps。

IIC 总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结 束信号和应答信号。

开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据 ; 结束信号: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据 ; 应答信号: 接收数据的 IC 在接收到 8bit 数据后, 向发送数据的 IC 发出特 定的低电平脉冲,表示已收到数据。

 CPU 向受控单元发出一个信号后,等待受 控单元发出一个应答信号, CPU 接收

到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答 信号,由判断为受控单元出现故障。

AT24C02 简介

AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,该 器件通过 IIC 总线接口进行操作。通过器件地址输入端 A0、A1 和 A2 可以实 现将最多 8 个 AT24C02 器件连接到 IIC 总线上。

AT24C02的存储容量为2KB,内容分成32页,每页8B,共256B,操作时有 两种寻址方式:芯片寻址和片内子地址寻址。

芯 片 寻 址 : AT24C02 的 芯 片 地 址为 1010, 其 地 址 控 制 字 格 式 为 1010A2A1A0R/W。其中 A2,A1,A0可编程地址选择位。

 A2,A1,A0引脚

接咼、低电平后得到确定的三位编码,与 1010形成7位编码,即为该器件的

地址码。R/W为芯片读写控制位,该位为 0,表示芯片进行写操作。

片内子地址寻址:芯片寻址可对内部256B中的任一个进行读/写操作,其寻 址范围为00~FF,共256个寻址单位。

对AT24C02的基本操作有字节写,连续读。操作时序如下:

startSTOPw

start

STOP

R

DEVICE T

ADDRESS H WORD ADDRESS

SDA LINEMSBMSB ACK R/w L s EACKLSBACK

SDA LINE

MSB

MSB ACK R/w L s E

ACK

LSB

ACK

图3-8字节写

STARTDEVICE

ADDRESSWOAD

ADDRESS nSTARTRUJAD

START

DEVICE

ADDRESS

WOAD

ADDRESS n

START

RUJAD

STOP

SDA LINE

No ACKL A OATA n

No ACK

8 C

8 K

DUMMY WRITE

图3-9连续读

3.43模块驱动方案:

在主模块里例化了 3个子模块,简单说一下各个模块的功能:

串口发送模块:负责将 FPGA通过IIC接口读取AT24C02的数据通过串 口发送给PC,这样我们就可以通过串口调试助手查看读到的数据与写入的数据 是否一致来调试。

IIC控制命令产生模块:负责发送控制命令如连续读、随机读、字节写及页 写等给IIC发送与接收模块,该模块不与 AT24C02直接打交道。

IIC发送与接收模块:根据接收到IIC控制命令产生模块发送的控制命令来

操作AT24C02,该模块与 AT24C02直接打交道。

按键模块设计

K1复位键:按下复位键所有模块进入复位状态。E2PR0M AT24C02 不清零。K2上翻页:查询上一个计数周期的采集值。K3下翻页:查询下一个计数周期的采集值。以下是按键和复位电路图S1QI茂0―-

K1复位键:按下复位键所有模块进入复位状态。

E2PR0M AT24C02 不清零。

K2上翻页:查询上一个计数周期的采集值。

K3下翻页:查询下一个计数周期的采集值。

以下是按键和复位电路图

S1

QI

茂0―-

■ S2

T J ■

?-D

S3

— S4

4.7k

图3-10按键图

图3-11复位图

四、软件设计

4.1 Quartus II软件介绍

Quartus II是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、 VerilogHDL 以及 AHDL ( Altera Hardware Description Language 等多种设计输入 形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整 PLD设计流程。软件界面如图:

□u^rtv^ ITIGetting StartedWith Qu^rtyj- II SoftwareStart Oesigning呵 S^tart LearningClpw i^vcnnl PmpKl:ClpMH RccHrri PmJfKl:"FPG观辭豪lEW!抽射_KtfF

□u^rtv^ IT

I

Getting Started

With Qu^rtyj- II Software

Start Oesigning

S^tart Learning

Clpw i^vcnnl PmpKl:

ClpMH RccHrri PmJfKl:

"FPG观辭豪lEW!抽射_KtfF理卩

Ylra QiMrlm II

QJpijirwT.卅

C Ahwa aJ l*acvsiDinblav/rEEy?lr mojhb j^pf

C. jUhviJ 論'"■! i uoyi? j^pl

口 J^hn^'nddiXIKj^f

图4-1软件界面图

4.2系统架构图

K1

K2

K3

图4-2系统架构图

4.3系统控制器

4.31作用

主要负责各个模块复位与启动,数据采集与处理以及任务调度等工作。当出 现复位信号时,所有模块进入复位状态,但 AT24C02 不清零。针对 AT24C02 的 数据可以采用上翻页和下翻页组合按键,同时按下进行清零。

4.32 实现方法

(1)、做出各模块驱动(部分代码见‘代码附录' )。

(2)、制作计数器

当产生周期性信号时, 控制器读取 DS18B20 数据,在控制器内部进行处理, 将处理完的结果送入 E2PROM 进行存储,同时送入 LCD1602 进行显示。

当按键信号出现时,分为以下两种。

1、复位信号,上面已经解释,不再赘述;

2、K2 和 K3 单个出现信号,若没有周期信号,直接读取 E2PROM 数据, 送入LCD 1602显示;若有周期信号,进行等待,固定等待1S,重复上述工作3、 当 K2 或 K3 同时按下时,无需判断周期性信号,直接清零。

控制器向 ROM 发送操作指令,进行温度转换,读写操作,周期性数据采集 使用计数器产生周期性采集信号,具体周期时间暂定为 5 分钟。

4.4 系统调试

在系统调试时,我们使用的是 Altera 公司的 Cyclone IV EP4CE40F23I7 。在 本系统中用到复位电路、电源电路、时钟电路、 JTAG下载电路、DS18B20传感 器电路、1602LCD液晶显示屏和AT24C02存储器等主要电路。

具体的硬件调试过程中,有很多细节时要注意,首先插上 JTAG下载线,然

后打开系统的电源。因为系统的时钟频率直接影响本设计的各个模块的正常运 行,所以一定要把时钟选正确。

做好准备工作以后,系统上电,使用 Quartus II选取EP4CE40F23I7型的

FPGA器件,进行编译。编译之后,将综合生成的配置文件使用 JTAG下载到开 发板上。然后进行实物验证:上电后,各个模块正常工作, LCD1602 显示温度 值,五分钟更新一次。按下 K1 键各个模块复位,此时 AT24C02 不清零, K2 和 K3同时按下模块复位和AT24C02清零。与预期基本相同,符合题目要求。

五、 代码附录

顶层模块

module Temperate(

CLK,

RST_n,

K1,

K2,

K3,

LCD_DATA,

LCD_RW,

LCD_RS,

LCD_EN,

LCD_B,

one_wire;

Tem,

SCL,

SDA,

LED,

TXD

)

input CLK;

input RST_n;

input K1;

input K2;

input K3;

output [7:0]LCD_DATA;

output LCD_RW;

output LCD_RS;

output LCD_EN;

output LCD_B; reg [7:0]LCD_DATA; reg LCD_RW; reg LCD_RS; reg LCD_EN; inout one_wire;

output [15:0]Tem;

inout SDA;

output SCL;

output LED;

output TXD;

assign LCD_B=1;

LCD1602 U0(

.CLK(CLK),

.RST_n(RST_n), .LCD_RW(LCD_RW), .LCD_RS(LCD_RS), .LCD_EN(LCD_EN), .LCD_B(LCD_B), .LCD_DATA(LCD_DATA)

);

DS18B20 U1( .CLK(CLK), .RST_n(RST_n), .Tem(Tem)

);

wire [7:0]wr_data;

wire [7:0]wr_rd_addr;

wire [7:0]data_out; AT24C02_Ctrl U2(

.CLK50M(CLK), .RST_n(RST_n), .SDA(SDA), .SCL(SCL), .LED(LED), .TXD(TXD)

); endmodule

LCD 驱动部分代码

LCD_RS,module lcm(CLOCK_50, LCD_DATA, LCD_RW, LCD_EN,LCD_BLON );

LCD_RS,

input CLOCK_50; output [7:0]LCD_DATA;

output LCD_RW;

output LCD_RS;

output LCD_EN; output LCD_BLON; reg [7:0]LCD_DATA; reg LCD_RW ; reg LCD_RS; reg LCD_EN; reg clk_1k=1'b0; reg [20:0]counter=0; reg [10:0]counter1=0; assign LCD_BLON=1;

always@(posedge CLOCK_50) if(counter==25000) begin clk_1k<=~clk_1k;

counter<=0; end else counter<=counter+1;

always@(posedge clk_1k)//

begin

if(counter1<1023) counter1<=counter1+1;

casex (counter1) 400:begin LCD_DATA<=8' //0x38 设置显示模式 LCD_RW<=1'b0; LCD_RS<=1'b0;

end 401:LCD_EN<=1'b1; 410: //0x0c 开显示 关光标 begin

LCD_DATA<=8' LCD_RW<=1'b0; LCD_RS<=1'b0; end 411: LCD_EN<=1'b1;

420: begin //0x01 清屏幕 LCD_DATA<=8' LCD_RW<=1'b0; LCD_RS<=1'b0;

end

421: LCD_EN<=1'b1;

430: begin //0x06 读或者写后 自动加 1 LCD_DATA<=8' LCD_RW<=1'b0; LCD_RS<=1'b0;

end

431: LCD_EN<=1'b1;

440:begin //0xc0 定位到第二行 LCD_DATA<=8' LCD_RW<=1'b0; LCD_RS<=1'b0;

end

441: begin

LCD_EN<=1'b1;

ack<=1;

end

/根/ 据数字的 ASCII 码值显示数据

631: LCD_EN<=1'b1;

default: LCD_EN<=1'b0; endcase

end

endmodule

DS18B20 驱动模块

// 50MHz

// 50MHz 时钟

// 异步复位

// One-Wire 总线 // 输出温度值

input clk, input rst_n, inout one_wire, output [15:0] temperature );

reg rst_n;

reg [19:0]count; always@(posedge clk) begin if(count<20'h80000) begin rst_n<=1; count<=count+1; end

else if(count<20'h8ffff) begin rst_n<=0; count<=count+1; end

else

rst_n<=1;

end

//++++++++++++++++++++++++++++++++++++++ // 分频器 50MHz->1MHz 开始

//++++++++++++++++++++++++++++++++++++++

// 此处省略分频部分的代码

// 分频器 50MHz->1MHz 结束

//

//延时模块的使用

//++++++++++++++++++++++++++++++++++++++

// 延时模块 开始

//++++++++++++++++++++++++++++++++++++++

reg [19:0] cnt_1us; // 1us 延时计数子 reg cnt_1us_clear; // 请 1us 延时计数子 always @ (posedge clk_1us)

if (cnt_1us_clear)

cnt_1us <= 0;

else

cnt_1us <= cnt_1us + 1'b1;

//

// 延时模块 结束

//++++++++++++++++++++++++++++++++++++++

// DS18B20 状态机 开始

//++++++++++++++++++++++++++++++++++++++

parameter S00 =5'h00;

parameter S00 =

5'h00;

parameter S0 =

5'h01;

parameter S1 =

5'h03;

parameter S2 =

5'h02;

parameter S3 =

5'h06;

parameter S4 =

5'h07;

parameter S5 =

5'h05;

parameter S6 =

5'h04;

parameter S7 =

5'h0C;

parameter WRITE0

= 5'h0D;

parameter WRITE1

= 5'h0F;

parameter WRITE00

= 5'h0E;

parameter WRITE01

= 5'h0A;

parameter READ0

= 5'h0B;

parameter READ1

= 5'h09;

parameter READ2

= 5'h08;

parameter READ3

= 5'h18;

reg [4:0] state;

reg one_wire_buf;

reg [15:0] temperature_buf;

reg [5:0] step;

reg [3:0] bit_valid;

// 格雷码

// 状态寄存器

// One-Wire 总线 缓存寄存器

// 采集到的温度值缓存器(未处理)

// 子状态寄存器 0~50

// 有效位

always @(posedge clk_1us, negedge rst_n) begin

if (!rst_n)

begin one_wire_buf <= 1'bZ; step <= 0;

state <= S00; end

else

begin case (state)

S00 : begin temperature_buf <= 16'h001F; state <= S0;

end

S0 : begin cnt_1us_clear <= 1; one_wire_buf <= 0; state <= S1;

end

S1 : begin cnt_1us_clear <= 0; if (cnt_1us == 500) begin cnt_1us_clear <= 1; one_wire_buf <= 1'bZ; state <= S2;

end end

S2 : begin cnt_1us_clear <= 0; if (cnt_1us == 100) begin cnt_1us_clear <= 1; state <= S3; end end

S3 : if (~one_wire) state <= S4; else if (one_wire) state <= S0;

S4 : begin cnt_1us_clear <= 0; if (cnt_1us == 400) begin cnt_1us_clear <= 1; state <= S5;

end end

S5 : begin

// 初始化

// 延时 500us

// 释放总线

// 等待 100us

//若18b20拉低总线,初始化成功

// 否则,初始化不成功 ,返回 S0

// 再延时 400us

// 写数据

……省略部分代码……

……刷新显示数据……

//++++++++++++++++++++++++++++++++

// 写状态机 //++++++++++++++++++++++++++++++++ WRITE0

// 写状态机 //++++++++++++++++++++++++++++++++ WRITE0 :

begin cnt_1us_clear <= 0; one_wire_buf <= 0; if (cnt_1us == 80) begin cnt_1us_clear <= 1; one_wire_buf <= 1'bZ;

state <= WRITE00;

end

end

WRITE00 :

state <= S5;

WRITE01 :

state <= WRITE1;

WRITE1 :

begin cnt_1us_clear <= 0; one_wire_buf <= 1'bZ; if (cnt_1us == 80) begin

cnt_1us_clear <= 1; state <= S5; end

// 输出 0

// 延时 80us

// 释放总线,自动拉高

// 空状态

// 空状态

// 输出 1 释放总线, 自动拉高 // 延时 80us

end

// 写状态机

//++++++++++++++++++++++++++++++++

// 读状态机

//++++++++++++++++++++++++++++++++

READ0 : state <= READ1;

READ1 :

// 空延时状态

begin

cnt_1us_clear <= 0; one_wire_buf <= 1'bZ; if (cnt_1us == 10) begin

cnt_1us_clear <= 1;

// 释放总线

// 再延时 10us

state <= READ2; end

end

READ2 : // 读取数据

begin temperature_buf[bit_valid] <= one_wire; state <= READ3;

end

READ3 :

begin

cnt_1us_clear <= 0;

if (cnt_1us == 55) // 再延时 55us begin

cnt_1us_clear <= 1;

state <= S7;

end

end

//

// 读状态机

//

default : state <= S00;

endcase

end

end

assign one_wire = one_wire_buf; // 注意双向口的使用 endmodule

  • 下载文档
  • 收藏
  • 0

推荐访问:项目方案 温度 纪录 方案 全天候温度纪录仪设计与FPGA实现控温项目方案