FPGA课程设计报告_第1页
FPGA课程设计报告_第2页
FPGA课程设计报告_第3页
FPGA课程设计报告_第4页
FPGA课程设计报告_第5页
已阅读5页,还剩22页未读, 继续免费阅读

下载本文档

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

文档简介

1、华北水利水电大学North China University of Water Resources and Electric Power电子设计自动化课程设计题目I2C控制器 学院 信息工程学院 专业 电子信息工程 姓名 学号 指导教师 完成时间 2016.1.11 目录摘要1引言1一设计任务21.1设计要求21.2 设计目的21.3 I2C总线简介21.4 LM75A简介2二系统设计详述32.1系统总体方案设计32.2电路原理图4三.系统硬件电路设计43.1 温度采集电路设计43.2 LM75A详述4四Verilog代码设计64.1 IIC通信模块74.2状态机的设计84.3 温度显示模块8

2、4.4 系统整合9五仿真波形及说明10六设计小组的分工及安排10七收获和体会11八参考文献12附录:12摘要: 设计了一种基于FPGA和LM75A的温度测量系统。采用数字温度传感器LM75A检测环境温度,并利用LM75A自带的IIC总线接口传输数据,通过数码管将温度实时显示出来.关键字: FPGA;LM75A ;IIC总线引言: 目前温度测量主要通过单片机来实现控制. 但单片机是基于顺序语言的, 其描述过程繁琐, 信号采集频率受单片机时钟频率的限制, 难于实现高速的温度测量且不易在线修改. 由于传感器多数采用的是分立元件, 如热敏电阻、热电偶等, 精度很低, 远远不能满足实际使用所需要的高精度

3、测温要求. 笔者采用集成温度传感器, 使传统传感器和集成电路融为一体, 极大地提高了传感器的性能, 具有测温精度高、复现性好、线性优良、体积小、热容量小、稳定性好、输出电信号大等优点. 更重要的是采用现场可编程门阵列(FPGA)实现温度测量比采用单片机大大改善了设计效果, 可实现高速的温度测量.文中阐述了FPGA 的实现方法及如何利用FPGA 器件实现多路温度测量. 由于FPGA 具有集成度高,高速、高效率, 内部有嵌入式阵列块等特点, 易于实现FIFO 和ROM , 可使整个温度测量系统主要由硬件实现.一设计任务1.1设计要求: 利用VerilogHDL 设计I2C 控制模块,并在Magic

4、SOPC 实验箱上实现。该控制模块,可以通过I2C 总线协议,实现总线数据传输,实现温度传感器LM75A 的基本操作,并将温度数值扫描显示到数码管上。1.2 设计目的: 1. 了解串行总线 2. 熟悉I2C 协议 3. 学习LM75A 接口控制器编写 4. Singialtap 在线监测工具使用 1.3. I2C总线简介 I2C总线是一种由PHILIPS公司推出的两线式串行总线, 用于IC(IntegratedCircuit)器件之间的互连。它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到该总线上的器件之间传送信息, 并根据地址识别每个器件。每个器件有一个唯一的地址, 而且都可以作

5、为一个发送器或接收器使用(由器件的功能决定)。I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上, 因此I2C总线占用的空间非常小, 减少了电路板的空间和芯片管脚的数量, 降低了互联成本。I2C总线的另一个优点是, 它支持多主控制(multimastering), 其中任何能够进行发送和接收的设备都可以成为主设备, 而当其从总线上接收信息时,又成为接收器(也叫从设备)。一个主控器能够控制信号的传输和时钟频率。在任何时间点上只能有一个主控器。4连接多个I2C总线设备的可能性意味着超过一个以上主机可以同时尝试初始化传输数据, 此时会产生仲裁过程进行总线使用权的裁决。SDA和SCL均为

6、双向线路, 都通过一个上拉电阻连接到电源电压的正端, 当总线空闲时这两条线路都是高电平。连接到总线的器件是通过线与的功能互连的, 因此输出级应设计为漏极开路或集电极开路。I2C总线上数据的传输速率在标准模式下可达100kbit/s,在快速模式下可达400kbit/s, 在高速模式下可达3.4Mbit/s。11.4 LM75A简介 LM75A 数字温度传感器是一种内置带隙温度传感器, 应用- 模数转换技术提供过热检测输出的温度监测器。LM75A 内部包含多个数据寄存器: ( 1)配置寄存器(Conf) : 用来存储器件的配置, 如: 器件工作模式、OS 工作模式、OS 极性和OS 故障队列; (

7、 2) 温度寄存器(Temp): 用来存储读取的数字温度; ( 3) 设定点寄存器( Tos&Thyst) : 用来存储可编程的过热关断和滞后限制。器件通过2 线的串行I2C 总线接口与控制器通信。LM75A 包含一个开漏输出(OS) , 当温度超过编程限制的值时该输出有效。LM75A 有3 个可选的逻辑地址管脚, 使得同一总线上可同时连接8 个器件而不发生地址冲突。LM75A OS 输出有2 种可选的工作模式: OS 比较器模式和OS 中断模式。OS 输出可选择高电平或低电平有效。温度寄存器可存放一个11 位的二进制补码, 从而实现0.125的精度。在缺省模式下,OS 工作在比较器模

8、式, 温度阈值为80, 滞后75。2二系统设计详述2.1系统总体方案设计 FPGA不像单片机那样逐条执行程序,而是以并行运算为主,以硬件描述语言来完成电路设计。因此,基于FPGA的温度测量系统具有运行速度更快,支持大量数据的高速处理等优点。应用Verilog HDL(hardware description language)语言编写的程序写入FPGA后,能形成实际电路。FPGA的内部程序是并行操作,所以硬件电路不会存在程序逐条执行的问题,且FPGA硬件的数据处理速度非常快,可达到ns级别,因而本系统比单片机系统能更迅速、实时地监测信号的变化和及时更新数据。5本文将Altera公司生产的FPG

9、A芯片EP2C35F672C8作为处理器。此芯片有475个可自由分配的I/O口连接外设很方便。该芯片采用60 nm低功耗工艺,与单片机系统相比,系统总功率消耗更低。在综合考虑稳定性、可实现性以及精确性之后,提出了基于FPGA和LM75A的温度系统设计方案。该系统总体设计框图1所示。 图1 系统总体设计框图2.2电路原理图 图2 LM75A与FPGA的接口电路 分析:由于SDA、OS与SCL均为开漏输出,必须加上拉电阻。A0A1A2为器件标识,000为LM75A的身份标识,故全部接地。驱动电压为1.8-5.4V,故可接3.3V电压源。 三.系统硬件电路设计 基于FPGA和LM75A的测温系统总体

10、分为2个部分:温度采集电路、温度显示电路。3.1 温度采集电路设计温度采集电路主要由LM75A组成(如图3所示)。OS与VCC接口接3.3 V电源,SDA与SCL分别接上拉电阻,与主控芯片IIC接口相连,A0,A1, A2接地。 图3 温度采集电路图3.2 LM75A详述 LM75A是具有IIC接口的数字温度传感器,管脚有8个,分别为A2, A1, A0, OS, SCL(串行时钟线),SDA(串行双向数据线)VCC, GND。其内部集成了很多器件,有IIC总线接口、逻辑控制接口、带隙温度传感器、11 位模拟转数字转换器以及各种寄存器等。存储器件的某些配置的寄存器(Conf)、存储数字温度的寄

11、存器(Temp)也都包含在内。LM75A测温最大范围为-55+125 ,测温精度0.125 。SCL和SDA构成IIC串行总线,可以实现多个器件之间的主从式通信;OS为过热关断输出接口,外部可连接检测器或中断线,当温度超过设定温度值时该输出有效;VCC, GND分别接系统电源和地;A0A2是用户自定义地址位,通过对A0, A1和A2的逻辑定义,可以使8个LM75A接在同一总线而不会有地址冲突。由于系统只采用了一个测温器件测量温度,所以电路中A0, A1, A2接地,逻辑地址为0。温度寄存器(Temp)是一个由高8 位字节和一个低8 位字节组成的只读寄存器,其中仅有高11位被存放到Temp数据,

12、其余低5位为08。Temp数据的分辨率为0.125 ,当读到Temp寄存器时,所有16位数据都提供给总线。若Temp数据的最高有效位为逻辑0,则表示温度是正值,温度值()=+(Temp数据)*0.125 ;若Temp数据的最低有效位为逻辑1,则表示温度是负值,温度值()=-(-Temp数据+1)*0.125 。在进行温度采集前,FPGA必须先对LM75A器件初始化,包括对LM75A的地址选择,滞后寄存器、配置寄存器等的数据写入等。初始化完成之后,从LM75A器件的Temp中读取当前温度。2 LM75A的功能框图如下: 图4 功能框图 LM75A的管脚描述如下: 图5 LM75A的管脚描述图 表

13、1 LM75A的管脚描述表 LM75A内部温度寄存器工作原理如下: 表2 温度寄存器工作原理 4 Verilog代码设计 FPGA的设计输入方法有原理图和硬件描述语言(包括VHDL、AHDL、VerilogHDL等)2种。传统设计方法一般是采用直观、容易理解的原理图输入。但是此方法移植性不好,当所选芯片升级之后,所有设计的原理图都需改动。现在工程师常用的设计方法是用硬件描述语言完成所需设计,其特点主要表现为自顶向下设计。3相比于原理图设计方法,自顶向下设计方法主要有以下优点:1)从功能描述到物理实现完全符合设计者的设计思路。2)设计可以重复利用,能应用在不同的产品设计中。3)容易修改设计。设计

14、者可以在门消耗以及时序2方面对FPGA的结构进行比较,从而选择最佳的设计方案。4)设计周期短,效率高。采用自顶向下设计方法的效率可以达到传统原理图设计方法的24倍。鉴于自顶向下设计方法的诸多特点,本系统软件部分采用自顶向下模块化设计思想进行设计,主要包括IIC通信模块、温度显示模块等。4.1 IIC通信模块FPGA和LM75A两者之间的通信严格按照IIC总线管理定义的规则。在LM75A检测温度时,须先对LM75A初始化,即对其配置寄存器写入控制字进行工作模式的设定。写配置寄存器时序如图6所示。 图6 读温度寄存器时序 通信开始前,IIC 总线一定要有空间或者不忙,这就要求总线上的器件必须释放S

15、DA和SCL线。主机启动起始信号S 后,开始对配置寄存器写入要选择的器件地址,硬件电路图中的A0, A1, A2与地相接,因此器件的逻辑地址是“000”,再将“00000001”写入寄存器地址指针,等待器件响应一个系统时钟周期后,再进行工作模式的写入。完成上述步骤后,LM75A开始工作,若在正常工作模式下,每隔100 ms进行一次转换(模数转换),转换的结果存放在Temp寄存器中。FPGA读取Temp寄存器中的数据,对其处理后,就能得到温度数据。FPGA读取Temp寄存器中的数据也需严格按照IIC 总线管理定义的规则。读取温度数据的时序图如图7所示。由于系统时钟为50 MHz,为了方便分频,选

16、择用800kHz的频率作为LM75A的时钟频率,即SCL时钟频率为800kHz。由时序图8可知,62个时钟周期即可完成一次读操作;该计数器控制SDA相对于SCL的相位关系,此时SDA的时钟频率为400kHz。 图7 读温度寄存器时序4.2状态机的设计表3 状态机状态表 图8 状态转换图4.3 温度显示模块系统采用6位八段共阳数码管显示温度。为使6位数码管动态显示温度,可采用动态扫描的方法依次点亮数码管,当扫描速度达到某个范围时,可利用人眼视觉暂留的特点,使人感觉4位数码管是在同一时间显示。动态扫描的频率最好大于50 Hz,每个数码管显示的时间要适中,不能过长或过短,时间过长则会出现闪烁的情况,

17、时间过短发光二极管电流的导通时间也短,会导致数码管亮度变暗。一般扫描时间控制在12 ms左右。FPGA产生的扫描时间程序如下。/ 产生数码管扫描的计数器, 扫描时间为0.1msalways (posedge sys_clk or negedge sys_rst_n)beginif ( sys_rst_n =1'b0)scan_cnt <= 16'b0;elsescan_cnt <= scan_cnt + 16'b1;end 其中,scan_cnt为16位寄存器,存储计数值,记一次数的时间为1 ms。syc_clk是系统时钟信号,sys_ret_n是系统复位信

18、号,c1c4为数码管位选信号,seg_a seg_h分别接数码管的发光二极管,其中seg_h控制小数点。lm75_temp是FPGA从器件LM75A采集到的11位温度数据经过计算后的数据,其算法是:lm75_temp <= (buff10:0*125)/10; /存储在缓存器buff中的11位数据经计算后,赋值给lm75_temp寄存器。由于lm75_temp里面寄存的为二进制数据,所以需先转成为BCD码,才能输出显示。4.4 系统整合 在用Verilog HDL编程中,系统软件部分采用模块化设计。上文的IIC通信模块和温度显示模块为系统独立模块,故需编写顶层模块(命名为top)将2个模

19、块整合起来。top模块能定义各个管脚接口,从而使系统与外界进行通信。top模块通过顶层调用方法将iic(FPGA和LM75A通信模块)和led(数码管扫描显示模块)组合成为一个完整的系统。将完整的程序下载到FPGA芯片,系统即可测量环境温度。图9 顶层方案图五仿真波形及说明 图10 仿真波形仿真结果分析:Clk为外部输入时钟,为50MHZ,初始值为1,;rst_n为系统复位,初值为0;key_rd为读信号,低电平有效;scl为iic的时钟线;读sda为iic的数据线;count为一个8位计数器,每计数31,clk_sys翻转一次,即分频产生800K的系统时钟;,当clk_sys 或 rst_n

20、为下降沿时,若总线忙,flag为1,scl翻转,产生近400K的时钟,空闲时flag为0,scl为高;clk_sys 上升沿或rst_n为下降沿;data_out为0,flag为1,sda_buffer 为1,state转为0状态,发送控制字,寻找从机,写控制字10010000,从机发送应答信号sda为0,仿真显示为高阻状态,之后写指针,选定温度寄存器,从机发送应答sda为高阻,flag为0;再次启动,写控制字,sda为10010001,进行读操作,等待从机发送应答信号,sda为高阻态,flag为0;主机读数据,读数据高8位,发送应答,再读低八位,读数据时flag为低电平,sda为高阻态。之后

21、发送非应答信号,scl为高电平时,sda由低变为高电平,即为停止。六设计小组的分工及安排设计小组成员:范亚君 胡花欣 段郁丹设计工作主要涉及查阅资料原理分析代码编写仿真模拟修正纠错设计报告等内容.设计分工及安排: 1. 1月4号至5号到图书馆及网上查阅相关资料.2.根据硬件特性分析原理.三人分别进行初步编写,然后互相修改各运行模块和测试模块;其中范亚君负责iic.v文件的编写,胡花欣负责iic_tb.v和top_tb.v测试文件的编写,段郁丹负责top.vled.v和key_filter.v文件的编写。3.在Quartus II 13.0中进行仿真模拟,验证其与预想结果是否一致,并进行仿真分析

22、,做相关细节修改.4.仿真结果检验正确后,共同书写设计报告书.七收获和体会本文设计实现了一种基于FPGA和LM75A的测温系统。用FPGA的I/O引脚来模拟I2C总线实现主控制器, 可以降低研制成本、节约空间和降低电路的复杂性,在实际应用中有重大意义。其设计简单、功耗低、操作方便、响应快、测量精度高。该系统可用于室内温度测量、室外动植物生长环境温度测量等测温场所,该测温系统还可扩展利用8个LM75A数字温度传感器测温,从而实现多点大范围测温。 通过这次课程设计,我们对FPGA的整个开发过程有了更加深入的了解,并有了实际动手操作的经验,让我更好的掌握了相关知识。通过FPGA器件,我们可以方便、快

23、速开发出很多复杂的数字电路以供实际需要,通过编写代码省去了许多硬件连接,增强了系统的可靠性。在设计过程中,我们经常需要修改、完善系统的功能,这也只是改变代码并下载到芯片中就行了,省去了很多时间。本次课程设计是3人一组完成,这也锻炼了我们之间合作的能力,这是十分必要的,因此今后在工作中必须要加强与他人的合作。由于verilog理论课程是在上一个学期学习的,经过一个暑假,很多知识点都有遗忘,这给我们完成课程设计带来了一定困难,好在老师对我们精心指导,学校也提供实验室给我们实验,在我们的共同合作下,我们终于克服困难,完成了课程设计。8 参考文献1 褚振勇, 翁木云. FPGA 设计及应用 M . 西

24、安:西安电子科技大学出版社, 2002.2 LM75A数字温度传感器使用手册3 杨新鹏. 基于LM75A的多点温度监控系统设计J.工业仪表与自动化装置,2013.4 谭会生,张昌凡. EDA技术及应用 M. 2版. 西安:西安电子科技大学出版社,2004.5 夏宇闻. Verilog数字系统设计教程 第3版 北京航空航天大学出版社附录:1.VerilogHDL 程序清单 表3 程序清单2.VerilogHDL语言源代码和测试代码 iic.v文件代码 module iic( clk, /外部输入时钟 rst_n, /系统复位 key_rd, /读信号(低电平有效) scl, /iic的数据线 s

25、da, /iic的时钟线 data_out /输出数据 ); /系统输入 input clk;/外部输入时钟 input rst_n; /系统复位 input key_rd;/读信号(低电平有效) /系统输出 output reg scl;/iic的时钟线 output reg 15:0 data_out;/输出数据 inout sda; /iic的数据线 reg sda_buffer;/写入数据的中间寄存器 reg flag;/控制系统是否占有总线控制权 assign sda = (flag) ? sda_buffer : 1'bz;/当flag为高电平时,系统拥有总线控制权 /并发

26、送sda_buffer中的数据。当flag为低电平时, /释放总线。 reg 7:0 count;/计数器 reg clk_sys;/系统时钟 /-分频产生800Khz时钟clk_sys- always (posedge clk or negedge rst_n) begin if (!rst_n) begin clk_sys <= 1'b0; count <= 8'd0; end else if (count < 31)/分频成为近800K的时钟 count <= count + 1; else begin count <= 8'd0;

27、clk_sys <= clk_sys; end end /- reg 5:0 state;/状态寄存器 /-输出scl- always (negedge clk_sys or negedge rst_n) begin if (!rst_n) begin scl <= 1'b1;/复位时,scl为高 end else begin if (state > 0)/当总线忙的时候,scl为近400K的时钟 scl <= scl; else scl <= 1'b1;/空闲时,scl为高 end end /- reg 3:0 cnt;/发送或者接收数据的个数

28、reg 7:0 memory;/发送或者接受数据的中间寄存器 always (posedge clk_sys or negedge rst_n) begin if (!rst_n) begin data_out <= 16'd0; flag <= 1'b1; /复位时,系统获得总线的控制权 sda_buffer <= 1'b1; /向iic的数据线上发送高电平 state <= 0; cnt <= 0; memory <= 8'd0; end else case(state) 0 : if(scl)begin if(!key_

29、rd)/有按键按下 begin sda_buffer <= 1'b0;/发送启动信号 state <= 1; memory <= 8'b1001_0000;/准备控制字 end else state <= 0; end else state <= 0; 1 : if(scl = 0) && (cnt < 8)/发送八位控制字 begin sda_buffer <= memory7; cnt <= cnt + 1; memory = memory6:0,memory7; state <= 1; end else

30、 begin if (scl = 0) && (cnt = 8) begin cnt <= 0; flag <= 0;/释放总线控制权 state <= 2; end else begin state <= 1; end end 2 :/ if(!sda)/检测应答信号 begin state <= 3; memory <= 8'b0000_0000;/指针寄存器temp地址 end / else/ begin/ state <= 0;/ end 3 : if(scl = 0) && (cnt < 8) /

31、发送指针地址 begin flag <= 1;/获得总线控制权 sda_buffer <= memory7; cnt <= cnt + 1; memory = memory6:0,memory7; state <= 3; end else begin if (scl = 0) && (cnt = 8) begin cnt <= 0; flag <= 0;/释放总线控制权 state <= 4; end else begin state <= 3; end end 4 :/ if(!sda)/检测应答信号 begin state &

32、lt;= 5; end/ else/ begin/ state <= 0;/ end 5 : if (!scl) /scl=0 beginflag <= 1;/获得总线控制权sda_buffer <= 1;/拉高iic的数据线(为发送启动信号做准备)state <= 6; end 6 : if (scl) begin sda_buffer <= 0;/发送启动信号 state <= 7; memory <= 8'b1001_0001; /控制字 end 7 : if(scl = 0) && (cnt < 8)/发送八位控制

33、字 begin flag <= 1; /获得总线控制权 sda_buffer <= memory7; cnt <= cnt + 1; memory <= memory6:0,memory7; state <= 7; end else begin if (scl = 0) && (cnt = 8) begin cnt <= 0; flag <= 0; /释放总线控制权 state <= 8; end else begin state <= 7; end end 8 :/ if(!sda)/检测应答信号 begin state

34、<= 9; end/ else/ begin/ state <= 0;/ end 9 :if(scl = 1) && (cnt < 8)/接收数据 begin cnt <= cnt + 1; data_out <= data_out14:0,sda; state <= 9; end else begin if (scl = 0) && (cnt = 8) begin cnt <= 0; flag <= 1;/获得总线控制权 state <= 10; sda_buffer <= 0;/发送应答信号 end

35、 else state <= 9; end 10 : if(scl = 0) begin flag <= 0; state <= 11; end11 : if(scl = 1) && (cnt < 8)/接收数据 begin cnt <= cnt + 1; data_out <= data_out14:0,sda; state <= 11; end else begin if (scl = 0) && (cnt = 8) begin cnt <= 0; flag <= 1;/获得总线控制权 state <

36、;= 12; sda_buffer <= 1;/发送NOACK信号 end else state <= 11; end 12 : if (scl = 0) begin sda_buffer <= 0;/拉低iic的数据线(为发送停止信号做准备) state <= 13; end else state <= 12; 13 : if (scl = 1) /发送停止信号 begin sda_buffer <= 1; state <= 0; end else state <= 13; default : state <= 0 ; endcase end endmodule iic_tb.v文件代码timescale 1ns/1psmodule iic_tb;/系统输入reg clk;/外部输入时钟reg rst_n;/系统复位reg key_rd;/读信号(低电平有效)/系统输出wire scl;/iic的时钟线wire 15:0 da

温馨提示

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

评论

0/150

提交评论