基于FPGA的VHDL语言温度控制
- 格式:doc
- 大小:2.61 MB
- 文档页数:19
基于VHDL的Vivado使用流程1. 简介在数字电路设计中,VHDL(VHSIC Hardware Description Language)是一种常用的硬件描述语言。
而Vivado是Xilinx公司推出的一款集成化设计环境,用于FPGA(Field-Programmable Gate Array)设计和验证。
本文将介绍基于VHDL的Vivado使用流程。
2. 准备工作在开始使用Vivado之前,需要进行以下准备工作:•安装Vivado软件:进入Xilinx官方网站,下载并安装最新版本的Vivado软件。
•确定目标FPGA设备:选择合适的FPGA芯片作为目标设备,并了解其技术规格和功能。
•编写VHDL代码:使用VHDL语言编写需要实现的功能代码。
3. 创建新项目完成准备工作后,可以开始创建新的Vivado项目。
按照以下步骤进行:1.启动Vivado软件,选择“Create New Project”选项。
2.在弹出的对话框中,指定项目名称和保存路径。
3.选择目标FPGA设备,并指定时钟频率、IO标准等参数。
4.选择VHDL作为设计源文件语言。
5.添加设计源文件:将之前编写好的VHDL代码文件添加到项目中。
6.完成项目创建,进入Vivado集成化设计环境。
4. 添加约束文件在Vivado中,约束文件是用于指定设计中信号的时钟频率、引脚约束、时序要求等重要信息的文件。
要将约束文件添加到项目中,请按照以下步骤进行:1.在Vivado界面的左侧面板中,打开“Sources”选项卡。
2.右键单击“Constraints”文件夹,并选择“Add Sources”。
3.在弹出的对话框中,选择约束文件并添加到项目中。
4.在Vivado界面的左侧面板中,打开“Constraints”选项卡,确认约束文件已成功添加。
5. 进行综合和实现在Vivado中,综合是将HDL(硬件描述语言)代码和约束文件结合起来,生成逻辑网表的过程。
fpga设计中vhdl语言简介
VHDL是一种硬件描述语言(HDL),旨在帮助工程师和设计师进行复杂电路和系统的设计和仿真。
VHDL语言是由美国国防部发起的,现在已经成为全球应用最广泛的HDL之一。
VHDL语言的基础包括三个部分:实体(entity)、体(architecture)和过程(process)。
实体定义组件的接口,在其内部,architecture结构体提供了具体的实现。
过程是编写复杂操作的基本方式,类似于C语言中的函数。
VHDL语言的数据类型包括标准逻辑类型,如布尔、位和字符类型,以及更复杂的数据类型,如数组和记录类型。
此外,VHDL也支持自定义数据类型。
在FPGA设计中,VHDL语言的主要作用是设计和实现可编程逻辑电路。
VHDL语言描述的电路可以在硬件上运行,也可以使用仿真器进行验证和测试。
总体而言,VHDL语言是一种强大的硬件描述语言,对于设计和实现复杂的电路和系统非常有用。
在FPGA设计中,VHDL语言是必不可少的一部分。
基于FPGA的测控系统设计与实现一、引言随着科技的发展,现代工程领域对于高精度、高速度、高可靠性的测控设备的需求也越来越大。
其中,基于FPGA的测控系统具有极高的灵活性和可扩展性,能够满足不同领域的测控需求。
本文将介绍基于FPGA的测控系统设计与实现,主要包括系统架构、硬件设计、软件编程等方面。
二、系统架构设计基于FPGA的测控系统一般由FPGA芯片、外设模块、存储设备和通信接口等部分组成。
其中,FPGA芯片作为核心部分,负责控制整个系统的运行。
外设模块提供不同功能的接口,如模拟采集、数字转换、时钟输入、GPIO等。
存储设备用于存储测量数据和程序代码。
在系统架构设计时,需要根据实际需求选择适合的外设模块和通信接口,以及合适的存储设备。
此外,还需要考虑不同模块之间的数据传输和控制信号,确定系统的总体布局和数据流图。
三、硬件设计基于FPGA的测控系统的硬件设计主要包括电路原理图设计、PCB设计和硬件调试等部分。
在电路原理图设计时,需要根据系统架构设计绘制不同模块的电路图,并考虑电路参数的选择和优化。
在PCB设计时,需要将电路原理图转化为布局图和线路图,并按照标准的PCB设计流程进行布线、加强电路抗干扰性、防止电磁辐射等操作。
在硬件调试过程中,需要用示波器、万用表等工具对电路进行调试和测试,确保电路稳定运行。
四、软件编程基于FPGA的测控系统的软件编程主要包括FPGA芯片的Verilog/VHDL编程、上位机程序的编写等内容。
在FPGA芯片的Verilog/VHDL编程中,需要根据不同外设模块的接口来编写对应的硬件描述语言代码,如时钟控制、数据输入输出、状态控制等。
在上位机程序编写中,需要使用不同编程语言(如C/C++、Python等)来编写程序,实现与FPGA芯片的通信、测控算法的实现、数据可视化等功能。
五、系统应用与实现基于FPGA的测控系统应用广泛,如测量、控制、自动化、通信等领域。
在实际应用中,需要根据具体的应用场景和需求来设计相应的测控系统,并进行相关智能算法的设计和调试。
基于FPGA智能温度传感器监控报警系统的设计概述本文将详细介绍基于FPGA智能温度传感器监控报警系统的设计。
该系统由FPGA、温度传感器和报警器等组成,可以实时采集环境温度数据并进行处理,同时还可以根据设定的报警阈值进行温度报警。
该系统具有实时性、准确性和灵敏度高等优点,在工业、仓储等领域有广泛应用价值。
设计方案系统硬件设计智能温度传感器智能温度传感器采用DS18B20数字温度传感器,其精度高、体积小、响应速度快、使用方便等优点,能够满足系统的需要。
传感器输出数字量信号,可通过FPGA进行处理并转化为模拟量信号。
FPGAFPGA是本系统的核心部件,负责实现数字信号处理和温度阈值报警功能。
我们选用Xilinx Spartan-6系列FPGA,其具有高速、低功耗、可编程等特点,同时还有丰富的外设资源可以扩展。
报警器为了保证报警的及时和可靠性,我们使用了声光报警器,其能够在温度超出设定阈值时及时报警。
系统软件设计VHDL设计我们采用了VHDL语言对系统进行设计,通过其高级抽象、可移植性强等特点,实现了可适应性强、代码简洁的设计。
其中,数字信号处理主要包含数据的采集、过滤和频率变换等部分;温度阈值报警主要包含数据的计算和闸门控制等。
界面设计为了让用户更加便捷地使用该系统,我们设计了简洁明了的界面,包括温度值显示、报警阈值设置和报警状态等。
系统实现硬件实现按照上述设计方案,我们完成了硬件电路的设计,其中智能温度传感器采用了标准接口,与FPGA连接顺畅稳定。
报警器也能有良好的响应效果。
软件实现通过VHDL语言,我们完成了数字信号处理和温度报警部分的代码编写,在模拟器中进行了仿真和调试,并进行了综合和布局。
最终在FPGA平台上进行了验证,并与界面进行了充分交互。
结果分析经过系统实现,我们完成了一个基于FPGA智能温度传感器监控报警系统的设计。
在实际测试中,该系统具有所需的准确性、灵敏度和实时性等特点,能够实时采集环境温度并进行温度阈值报警。
《VHDL语言程序设计》课程教学大纲课程简介课程简介:本课程为软件工程专业嵌入式专业方向的专业课,是开发基于FPGA/CPLD嵌入式系统的必备基础。
主要内容包括FPGA/CPLD目标器件的结构和工作原理、EDA技术和工作流程、VHDL基础知识、VHDL实用方法和设计深入、原理图输入法、LPM宏功能模块实用方法、状态机设计以及EDA优化设计。
目的是为后续课程的学习和嵌入式系统的设计作必须的基础准备。
课程大纲一、课程的性质与任务:本课程是软件工程专业的专业方向课程。
教学任务主要包括使学生了解EDA技术的工作流程,正确使用开发平台,掌握以VHDL为代表的硬件描述语言的基本知识、编程实用方法和工程设计方法,掌握原理图设计法、状态机设计法,能够正确使用IP Core和LPM等宏功能模块。
本课程是软件工程专业嵌入式专业方向的第一门专业方向课,是后续课程的必备基础,具有较重要的地位。
二、课程的目的与基本要求:本课程涉及到的学科基础知识面广,要求软硬件兼备,需要较好的学科基础。
通过本课程的学习,最终达到能够设计基于FPGA/CPLD的ASIC,并能进行EDA优化的目的。
三、面向专业:软件工程四、先修课程:《计算系统基础》五、本课程与其它课程的联系:本课程的先行课程是计算系统基础。
服务的主要后续课程包括基于FPGA的嵌入式软件开发、基于ARM的嵌入式软件开发等。
六、教学内容安排、要求、学时分配及作业:第一章概述(2学时)1.1 EDA技术及其发展(C)1.2 硬件描述语言硬件描述语言种类、自顶向下设计方法、EDA工程设计流程。
(A)1.3 面向FPGA/CPLD的开发流程设计输入、分析综合、布局布线、仿真、下载和硬件测试。
(A)1.4 IP Core 及EDA技术发展趋势。
(C)第二章 FPGA硬件特性与编程技术(8学时)2.1 PLD发展历程及其分类(c)2.2 低密度PLD工作原理PROM、PLA、PAL、GAL。
GDOU-B-11-213《VHDL语言程序设计》课程教学大纲课程简介课程简介:本课程为软件工程专业嵌入式专业方向的专业课,是开发基于FPGA/CPLD嵌入式系统的必备基础。
主要内容包括FPGA/CPLD目标器件的结构和工作原理、EDA技术和工作流程、VHDL基础知识、VHDL实用方法和设计深入、原理图输入法、LPM宏功能模块实用方法、状态机设计以及EDA优化设计。
目的是为后续课程的学习和嵌入式系统的设计作必须的基础准备。
课程大纲一、课程的性质与任务:本课程是软件工程专业的专业方向课程。
教学任务主要包括使学生了解EDA技术的工作流程,正确使用开发平台,掌握以VHDL为代表的硬件描述语言的基本知识、编程实用方法和工程设计方法,掌握原理图设计法、状态机设计法,能够正确使用IP Core和LPM等宏功能模块。
本课程是软件工程专业嵌入式专业方向的第一门专业方向课,是后续课程的必备基础,具有较重要的地位。
二、课程的目的与基本要求:本课程涉及到的学科基础知识面广,要求软硬件兼备,需要较好的学科基础。
通过本课程的学习,最终达到能够设计基于FPGA/CPLD的ASIC,并能进行EDA优化的目的。
三、面向专业:软件工程四、先修课程:《计算系统基础》五、本课程与其它课程的联系:本课程的先行课程是计算系统基础。
服务的主要后续课程包括基于FPGA的嵌入式软件开发、基于ARM的嵌入式软件开发等。
六、教学内容安排、要求、学时分配及作业:第一章概述(2学时)1.1 EDA技术及其发展(C)1.2 硬件描述语言硬件描述语言种类、自顶向下设计方法、EDA工程设计流程。
(A)1.3 面向FPGA/CPLD的开发流程设计输入、分析综合、布局布线、仿真、下载和硬件测试。
(A)1.4 IP Core 及EDA技术发展趋势。
(C)第二章 FPGA硬件特性与编程技术(8学时)2.1 PLD发展历程及其分类(c)2.2 低密度PLD工作原理PROM、PLA、PAL、GAL。
摘要随着微电子技术的发展,现场可编程逻辑门阵列FPGA(Field Programmable Gate Array)可以实现数字电路系统设计的功能。
尤其现场可编程逻辑门阵列FPGA具有集成度高的优点,受到工程界高度的重视。
I2C 总线以接口简单,成本底,可扩展性好在数字系统中得到了广泛的应用。
硬件描述语言是数字系统高层设计的核心,是实现数字系统设计新方法的关键技术之一。
本课题正是利用VHDL语言在FPGA上实现I2C总线控制器的功能。
首先研究了I2C总线的规范,又简要介绍了QuartusⅡ设计环境以及FPGA 的设计流程。
在此基础上,重点介绍了I2C控制器的总体设计方案,以及在QuartusⅡ平台上的时序仿真。
关键词Quartus II;I2C总线控制器;现场可编程逻辑门阵列;时序仿真AbstractWith the development of micro electric and EDA(electronic design automation)technology, FPGA(field programmable gates array) can realize the function of digital circuit system design .FPGA have the merit of filed programmability and High integration rate ,therefore is highly recognized for engineering.I2C bus is widely applied in the digital system as simple interface ,expedient use ,low cost and good expansibility .VHDL is considered as a core of digital system design and a key technique of implement digital system.The design realizes the function of I2C bus interface on the FPGA .At first the thesis deeply research I2C bus specification ,then briefly introduce the Quartus II design environment and the design method ,as well as FPGA design flow .In this foundation,I2C bus controller design scheme and the timing simulation under Quartus II is particularly introduced.Key words Quartus II;I2C bus controller ;FPGA ;timing simulation目录摘要 (I)Abstract .................................................................................................................. I I 第1章绪论.. (5)1.1 课题背景 (5)1.2 I2C总线的产生及发展 (6)1.3 FPGA的现状与展望 (6)1.4 相关工作 (6)第2章I2C总线技术的研究 (8)2.1 I2C总线的概念 (8)2.2 I2C总线的传输 (9)2.2.1 数据的有效性 (9)2.2.2 I2C总线数据传送的开始和停止条件 (9)2.2.3 I2C总线传输过程中的应答信号 (10)2.2.4 I2C总线数据传送的重复开始条件 (11)2.2.5 I2C总线的传输过程中的字节格式 (11)2.2.6 I2C总线的器件子地址 (11)2.2.7 I2C总线传输信号的时序 (12)2.3 本章小结 (14)第3章VHDL语言的基础知识 (15)3.1 VHDL语言的概述 (15)3.2 VHDL语言的特点 (15)3.3 VHDL语言的程序结构 (16)3.3.1 VHDL程序的库 (16)3.3.2 包集合 (16)3.3.3 实体说明 (17)3.3.4 构造体 (18)3.3.5 配置 (18)3.4 本章小结 (18)第4章设计工具和设计方法 (19)4.1 设计工具 (19)4.2 基于FPGA的数字电路的设计流程 (20)4.3 本章小结 (21)第5章I2C总线的功能设计 (23)5.1 I2C总线完成的功能 (23)5.2 用VHDL语言实现写操作时的串行转并行 (24)5.3 用VHDL语言实现顺序读操作时的并行转串行 (24)5.4 I2C总线控制器的顶层设计 (25)5.5 本章小结 (26)第6章I2C总线的硬件时序仿真 (27)6.1 器件的选择 (27)6.2 硬件仿真 (28)6.2.1 用VHDL语言实现写字节周期 (29)6.2.1 用VHDL语言实现顺序读字节周期 (30)6.2.3 用VHDL语言实现选择性读字节周期 (30)6.3 本章小结 (31)结论 (32)致谢 (33)参考文献 (34)第1章绪论1.1 课题背景近年来,随着社会的发展,电子产品越来越多的进入人们的生活和工作中,成为了我们生活中必不可少的一部分,随着计算机的普及,以及电子设备之间相互沟通的更加频繁,为了更方便的实现器件与器件之间的通信,研发人员从消费者电子、电讯和工业电子中许多看上去不相关的设计中寻找到了他们的相似之处,例如几乎每个系统都包括:(1)一些智能控制,通常是一个单片的微控制器。
基于FPGA的恒温控制系统孵化器是一种最新的孵化禽蛋的机器,通过人工制造适合禽蛋孵化的恒温环境,来以较小的经济投入孵化禽蛋,通过调查,市面上的孵化器多数是以模拟电路的方式制造恒温环境,如下图这种模拟电路控制在实际应用中很难做到恒温控制,温度会在最终归的预设值附近上下浮动,影响禽蛋的孵化。
而且,孵化器的温度设置也是模拟电路,这样是完全达不到精准的温度设置。
通过学习FPGA,我设想运用数字电路来对禽蛋孵化器内部温度进行控制,来实现可控,可调,温度恒定的禽蛋孵化器。
具体的设计框架如下通过前向温度采集电路,采集当前孵化器内部的温度信号,将采集到的模拟信号通过ADC0809模数转换芯片,转变为FPGA可控的数字信号,FPGA芯片根据输入的当前实际温度,控制输出合理的数字信号,再由DAC0832转换为模拟信号,输入到后向加热执行电路,以此来完成对整个孵化器的温度控制。
整个系统中,带有温度传感器的前向温度采集电路作为系统的反馈环节,实时反映当前环境的具体温度,具体的电路图如下。
前向温度采集电路图此电路设计以AD590作为温度触感器,通过添加相应的调节电阻,让温度与输出电压保持一个相对线性的关系其中: W1R 为调零电阻2w R 为调满度电阻最终得到的温度与输出电压的关系式为: 0U 5T 100 模数转换芯片采用的是ADC0809,具体的连接电路图如下IN0—IN7管角中任选一路作为前向温度采集电路的输入,VCC与VREF同时接+5V电压,_VREF与GND接地,OUT1—OUT8数据输出端连接FPGA,START,OE,EOC,ADDA-C均连接FPGA,根据ADC0809的工作时序图,由FPGA给出相应的信号控制ADC0809。
数模转换部分采用的是DAC0832,具体连接图如下DI0-DI7分别于FPGA的8位数据输出端相连,因为DAC0832工作在连续的负反馈电路中,故采用直通的工作方式,将WR1与WR2直接与地相连,ILE与CS,Xfer引脚均接至FPGA,有FPGA发送控制信号来控制DAC0832的工作。
输出引脚Iout1与Iout2连接一个流压转换器,将输出的电流信号转换为需要的电压信号,并进行适当的放大。
最后输出到孵化器的加热电路。
FPGA模块控制ADC0809的工作状态,并接收来自ADC0809的数字信号,与键盘输入的预设信号进行比较后,将控制信息传送给DAC0832,经由数模转换器转换后加在发热装置两端,对整个孵化器内部温度进行控制。
整个的FPGA模块分为以下几个部分;分频模块:由于外界的时钟源一般都较高,而ADC0809以及键盘扫描模块需要的时钟频率较低,故需要对外界时钟源进行分频,这里外界输入时钟源为20MHz,对其进行64分频。
波形仿真图如下:从波形图可以看出,clk每经过64个脉冲,clk1跳转一次。
分频模块工作正常;统计报告图如下:分频模块的VHDL 文件见附录1.键盘模块:键盘模块的脉冲输入来自分频模块。
其中,输入端口为两位二进制数,分别接两个按键,来对预设温度进行加减调控。
输出有两个端口,xianshi 端口作为保留端口,存储着当前预设温度的数值,可外接显示设备。
zhi 端口为信息传送端口,其存储值为当前预设温度值经由采集电路温度—电压公式换算后的十进制数值。
换算公式如下: 0U 5T 100 例:38摄氏度对应的ADC0809输出数据为5*38*256/100/5,得到十进制值为97;波形仿真图如下:图(1)图(2)图中,shuru(1)为温度减按键,shuru(0)为温度加按键,相应的预设温度对应相应的ADC0809输出值,由图2得,当预设温度为38摄氏度时,对应换算后的ADC0809输出数据为97,与计算相符。
键盘输入模块工作正常。
统计报告图如下:键盘模块的VHDL文件见附录2.ADC0809控制模块:经查阅资料,DAC0832需采用直通式,故,将DAC0832的控制语句直接写在了ADC0809的控制语句块内。
ile为输出到ADC0832的输入锁存允许信号,cont 为ADC0832WR1,WR2,CS等引脚。
Wendu为预设温度的输入引脚。
din为ADC0809转换后的输出信号,dout为受FPGA控制的输出到DAC0832的控制信号。
clk8为来自为频器的时钟信号。
根据ADC0809的时序图,总结出相应的状态转移图,一次来编写控制ADC0809的VHDL语言文件,状态转移图如下:具体波形仿真图如下:波形仿真建立在预设温度为38摄氏度的条件下。
前面提到,38摄氏度对应的ADC0809输出值为97,VHDL程序中设定,当ADC0809输入值大于或等于97时(当前温度大于或等于预设温度),FPGA输出到DAC0832的控制信号为0,即停止加热。
当ADC0809输入值小于92(即36摄氏度,与设定温度相差大于两度)时,FPGA 输出到DAC0832的控制信号为255,即以最大功率加热。
当ADC0809输入值小于92时,将会细分为5个阶段,即以逐次递减的功率加热。
由图可知,ADC0809工作正常。
统计报告图如下:ADC0809模块的VHDL仿真文件见附录3.最后,将三个模块运用元件例化语句连接在一块,并进行电路观察,生成相应的逻辑电路,如下图:总体波形仿真如下图波形分析:刚开始,FPGAjia置1,预设温度逐渐增加,如下图当温度到达38摄氏度后停止增加,即将38摄氏度作为预设温度,随后,观察FPGAin与FPGAout。
当预设温度为38摄氏度时,输入为97时,对应输出为0,当为92时,对应输出为5,当为96时,对应输出为1,当输入不在92-97之间,输入大于97时,输出为0,输入小与92时,输出为255.观察上图波形仿真,完全符合程序设计。
后面给FPGAjian置1,预设温度会随之降低。
统计报告图如下:总体的VHDL程序见附录4.附录1:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity fenpin isport(clk :in std_logic; --外部输入时钟源clk1: out std_logic);end fenpin; --分频后的时钟源architecture b of fenpin issignal count : std_logic_vector(7 downto 0); --信号定义signal clk2 : std_logic;beginprocess(clk)beginif(clk'event and clk='1') then --计数脉冲上升沿if(count="01000000") thencount<=(others=>'0');clk2<=not clk2; --当达到64个脉冲时count置0,clk2取反elsecount<=count+1; --未达到64脉冲时继续计数;end if;end if;clk1<=clk2; ——将产生的分频信号给输出端口end process;end b;附录2:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity jianpan isport(clk:in std_logic; --分频后的时钟输入shuru:in std_logic_vector(1 downto 0); --输入端,按键加0位,按键减1位zhi :out integer; --预设温度转化为ADC0809输出值xianshi :out integer); --当前预设温度end entity;architecture beha of jianpan issignal x:integer range 0 to 200; --定义信号beginprocess(clk)beginif(clk'event and clk='1') thencase shuru is --检测是否有输入when "01"=>x<=x+1; --按键加按下,温度+1when "10"=>if(x=0)then x<=0; --按键减按下,判断温度是否为0 else x<=x-1; --若为0,则依旧为0,否则,温度-1 end if;when others=>x<=x; --其他按键情况,温度不变end case;end if;xianshi<=x; --将温度赋给显示输出端zhi<=x*5*256/100/5; --将温度转化后赋给输出端end process;end beha;附录3:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity ADC0809 isport(din :in std_logic_vector(7 downto 0); --ADC0809输出的采样数据clk8 :in std_logic; --时钟信号eoc :in std_logic; --ADC0809转换结束指示,高电平有效ale :out std_logic; --ADC0809地址锁存次信号ile: out std_logic; --DAC0832数据锁存允许cont: out std_logic; --DAC0832控制信号(WR1,WR2,CS,Xfer)start :out std_logic; --ADC0809转换启动信号oe :out std_logic; --ADC0809数据输出允许信号wendu:in integer; --温度显示adda :out std_logic; --ADC0809信号通道控制位addb :out std_logic; --ADC0809信号通道控制位addc :out std_logic; --ADC0809信号通道控制位lock0 :out std_logic; --ADC0809观察数据锁存时钟dout :out std_logic_vector(7 downto 0)); --输出到DAC0832的8位数据end ADC0809;architecture beha of ADC0809 istype states is(st0,st1,st2,st3,st4); --定义ADC0809工作状态signal current_state,next_state:states:=st0; --定义信号signal regl :std_logic_vector(7 downto 0);signal shuchu :std_logic_vector(7 downto 0);signal lock :std_logic;signal count :std_logic_vector(7 downto 0);beginadda<='1'; --地址输入001,选择IN1 addb<='0';addc<='0';dout<=shuchu; -将处理后的数据传输到输出端口lock0<=lock; --数据传输ile<='1'; --DAC0832的控制信号cont<='0';com:process(current_state,eoc) --状态转移begincase current_state iswhen st0=>ale<='0';start<='0';lock<='0';oe<='0';next_state<=st1;when st1=>ale<='1';start<='1';lock<='0';oe<='0';next_state<=st2;when st2=>ale<='0';start<='0';lock<='0';oe<='0';next_state<=st1;if(eoc='1')then next_state<=st3;else next_state<=st2;end if;when st3=>ale<='0';start<='0';lock<='0';oe<='1';next_state<=st4;when st4=>ale<='0';start<='0';lock<='1';oe<='1';next_state<=st0;when others=>next_state<=st0;end case;end process com;reg:process(clk8)beginif(clk8'event and clk8='1')then current_state<=next_state; --在时钟上升沿改变状态end if;end process reg;latch1:process(lock)beginif lock='1'and lock'event then regl<=din; --将输入数据赋给中间变量end if;end process latch1;kongzhi:process(regl)beginif(regl<wendu) then --判断输入数据与预设温度的大小case wendu-regl is --判断输入数据与预设温度的when "00000101"=>shuchu<="00000101"; --差值为5时输出控制信号5when "00000100"=>shuchu<="00000100"; --差值为4时输出控制信号4when "00000011"=>shuchu<="00000011"; --差值为3时输出控制信号3when "00000010"=>shuchu<="00000010"; --差值为2时输出控制信号2when "00000001"=>shuchu<="00000001"; --差值为1时输出控制信号1when others=>shuchu<="11111111"; --差值大于5时输出255end case;else shuchu<="00000000"; --当前温度大于预设温度,输出0 end if;end process kongzhi;end beha;附录4:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity FPGA isport(clkin:in std_logic; --定义外部时钟端口FPGAeoc:in std_logic;FPGAin :in std_logic_vector(7 downto 0);FPGAout:out std_logic_vector(7 downto 0);FPGAale :out std_logic;FPGAjia :in std_logic;FPGAjian :in std_logic;FPGAwendu:out integer;FPGAile: out std_logic;FPGAcont: out std_logic;FPGAstart :out std_logic;FPGAoe :out std_logic;FPGAadda :out std_logic;FPGAaddb :out std_logic;FPGAaddc :out std_logic);end entity;architecture beha of FPGA iscomponent ADC0809 is --元件例化声明port(din :in std_logic_vector(7 downto 0);clk8 :in std_logic;eoc :in std_logic;ale :out std_logic;ile: out std_logic;cont: out std_logic;start :out std_logic;wendu:in integer;oe :out std_logic;adda :out std_logic;addb :out std_logic;addc :out std_logic;lock0 :out std_logic;dout :out std_logic_vector(7 downto 0));end component;component fenpin is --元件例化声明port(clk :in std_logic;clk1: out std_logic);end component;component jianpan isport(clk:in std_logic;shuru:in std_logic_vector(1 downto 0);zhi :out integer;xianshi:out integer);end component;signal c:std_logic; --定义中间变量signal n:integer;beginU0:fenpin port map(clk=>clkin,clk1=>c); --元件例化U1:ADC0809 port map(clk8=>c,wendu=>n,din=>FPGAin,eoc=>FPGAeoc,dout=>FPGAout,ale=>FPGAale,ile=>FP GAile,cont=>FPGAcont,start=>FPGAstart,oe=>FPGAoe,adda=>FPGAadda,addb=>FPGAaddb,addc=> FPGAaddc);U2:jianpan port map(clk=>c,shuru(1)=>FPGAjian,shuru(0)=>FPGAjia,zhi=>n,xianshi=>FPGAwendu);end beha;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity fenpin isport(clk :in std_logic; --外部输入时钟源clk1: out std_logic);end fenpin; --分频后的时钟源architecture b of fenpin issignal count : std_logic_vector(7 downto 0); --信号定义signal clk2 : std_logic;beginprocess(clk)beginif(clk'event and clk='1') then --计数脉冲上升沿if(count="01000000") thencount<=(others=>'0');clk2<=not clk2; -当达到64个脉冲时count置0,clk2取反elsecount<=count+1; --未达到64脉冲时继续计数;end if;end if;clk1<=clk2; ——将产生的分频信号给输出端口end process;end b;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity jianpan isport(clk:in std_logic; --分频后的时钟输入shuru:in std_logic_vector(1 downto 0); --输入端,按键加0位,按键减1位zhi :out integer; --预设温度转化为ADC0809输出值xianshi :out integer); --当前预设温度end entity;architecture beha of jianpan issignal x:integer range 0 to 200; --定义信号beginprocess(clk)beginif(clk'event and clk='1') thencase shuru is --检测是否有输入when "01"=>x<=x+1; --按键加按下,温度+1 when "10"=>if(x=0)then x<=0; --按键减按下,判断温度是否为0 else x<=x-1; --若为0,则依旧为0,否则,温度-1 end if;when others=>x<=x; --其他按键情况,温度不变end case;end if;xianshi<=x; --将温度赋给显示输出端zhi<=x*5*256/100/5; --将温度转化后赋给输出端end process;end beha;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity ADC0809 isport(din :in std_logic_vector(7 downto 0); --ADC0809输出的采样数据clk8 :in std_logic; --时钟信号eoc :in std_logic; --ADC0809转换结束指示,高电平有效ale :out std_logic; --ADC0809地址锁存次信号ile: out std_logic; --DAC0832数据锁存允许cont: out std_logic; --DAC0832控制信号(WR1,WR2,CS,Xfer)start :out std_logic; --ADC0809转换启动信号oe :out std_logic; --ADC0809数据输出允许信号wendu:in integer; --温度显示adda :out std_logic; --ADC0809信号通道控制位addb :out std_logic; --ADC0809信号通道控制位addc :out std_logic; --ADC0809信号通道控制位lock0 :out std_logic; --ADC0809观察数据锁存时钟dout :out std_logic_vector(7 downto 0)); --输出到DAC0832的8位数据end ADC0809;architecture beha of ADC0809 istype states is(st0,st1,st2,st3,st4); --定义ADC0809工作状态signal current_state,next_state:states:=st0; --定义信号signal regl :std_logic_vector(7 downto 0);signal shuchu :std_logic_vector(7 downto 0);signal lock :std_logic;signal count :std_logic_vector(7 downto 0);beginadda<='1'; --地址输入001,选择IN1 addb<='0';addc<='0';dout<=shuchu; --将处理后的数据传输到输出端口lock0<=lock; --数据传输ile<='1'; --DAC0832的控制信号cont<='0';com:process(current_state,eoc) --状态转移begincase current_state iswhen st0=>ale<='0';start<='0';lock<='0';oe<='0';next_state<=st1;when st1=>ale<='1';start<='1';lock<='0';oe<='0';next_state<=st2;when st2=>ale<='0';start<='0';lock<='0';oe<='0';next_state<=st1;if(eoc='1')then next_state<=st3;else next_state<=st2;end if;when st3=>ale<='0';start<='0';lock<='0';oe<='1';next_state<=st4;when st4=>ale<='0';start<='0';lock<='1';oe<='1';next_state<=st0;when others=>next_state<=st0;end case;end process com;reg:process(clk8)beginif(clk8'event and clk8='1')then current_state<=next_state; --在时钟上升沿改变状态end if;end process reg;latch1:process(lock)beginif lock='1'and lock'event then regl<=din; --将输入数据赋给中间变量end if;end process latch1;kongzhi:process(regl)beginif(regl<wendu) then --判断输入数据与预设温度的大小case wendu-regl is --判断输入数据与预设温度的when "00000101"=>shuchu<="00000101"; --差值为5时输出控制信号5when "00000100"=>shuchu<="00000100"; --差值为4时输出控制信号4when "00000011"=>shuchu<="00000011"; --差值为3时输出控制信号3when "00000010"=>shuchu<="00000010"; --差值为2时输出控制信号2when "00000001"=>shuchu<="00000001"; --差值为1时输出控制信号1when others=>shuchu<="11111111"; --差值大于5时输出255end case;else shuchu<="00000000"; --当前温度大于预设温度,输出0 end if;end process kongzhi;end beha;。