FPGA课程设计报告解读

上传人:小** 文档编号:50495888 上传时间:2022-01-20 格式:DOC 页数:31 大小:663.50KB
返回 下载 相关 举报
FPGA课程设计报告解读_第1页
第1页 / 共31页
FPGA课程设计报告解读_第2页
第2页 / 共31页
FPGA课程设计报告解读_第3页
第3页 / 共31页
点击查看更多>>
资源描述
华北水利水电大学North Chi na Un iversity 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温度显示模块84.4系统整合9五. 仿真波形及说明 10六设计小组的分工及安排 10七.收获和体会11八参考文献12附录:12摘要:设计了一种基于FPGA和LM75A的温度测量系统。采用数字温度传感器LM75A佥测环境温度,并利用LM75A自带的IIC总线接口传输数据,通过数码管 将温度实时显示出来关键字:FPGA ; LM75A ; IIC总线引言:目前温度测量主要通过单片机来实现控制 但单片机是基于顺序语言的, 其描述过程繁琐,信号采集频率受单片机时钟频率的限制,难于实现高速的温 度测量且不易在线修改由于传感器多数采用的是分立元件,如热敏电阻、热电 偶等,精度很低,远远不能满足实际使用所需要的高精度测温要求笔者采用集成温度传感器,使传统传感器和集成电路融为一体,极大地提高了传感器的 性能,具有测温精度高、复现性好、线性优良、体积小、热容量小、稳定性好、 输出电信号大等优点更重要的是采用现场可编程门阵列(FPGA)实现温度测量 比采用单片机大大改善了设计效果,可实现高速的温度测量文中阐述了 FPGA 的实现方法及如何利用FPGA器件实现多路温度测量.由于FPGA具有集成度高, 高速、高效率,内部有嵌入式阵列块等特点,易于实现FIFO和ROM可使整个 温度测量系统主要由硬件实现1一设计任务1.1设计要求:利用VerilogHDL设计I2C控制模块,并在MagicSOPC实验箱上实现。 该控制模块,可以通过I2C总线协议,实现总线数据传输,实现温度传感器LM75A 的基本操作,并将温度数值扫描显示到数码管上。1.2设计目的:1. 了解串行总线2. 熟悉I2C协议3. 学习LM75A接口控制器编写4. Sin gialtap在线监测工具使用1.3. I2C总线简介I2C 总线是一种由PHILIPS公司推出的两线式串行总线,用于IC(IntegratedCircuit)器件之间的互连。它通过 SDA串行数据线)及SCL(串行时钟线)两根线在连到该总线上的器件之间传送信息,并根据地址识别每个器 件。每个器件有一个唯一的地址,而且都可以作为一个发送器或接收器使用(由 器件的功能决定)。I2C总线最主要的优点是其简单性和有效性。由于接口直接 在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管 脚的数量,降低了互联成本。I2C总线的另一个优点是,它支持多主控制 (multimasteri ng),其中任何能够进行发送和接收的设备都可以成为主设备,而当其从总线上接收信息时,又成为接收器(也叫从设备)。一个主控器能够控制 信号的传输和时钟频率。在任何时间点上只能有一个主控器。4连接多个I2C总线设备的可能性意味着超过一个以上主机可以同时尝试初始化传输数据,此时会产生仲裁过程进行总线使用权的裁决。SDA和SCL均为双向线路,都通过一 个上拉电阻连接到电源电压的正端,当总线空闲时这两条线路都是高电平。连接 到总线的器件是通过线与的功能互连的,因此输出级应设计为漏极开路或集电 极开路。I2C总线上数据的传输速率在标准模式下可达1OOkbit/s,在快速模式下可达400kbit/s,在高速模式下可达 3.4Mbit/s 。 11.4 LM75A 简介LM75A 数字温度传感器是一种内置带隙温度传感器,应用工-模数转换技术提供过热检测输出的温度监测器。LM75A内部包含多个数据寄存器:(1)配置寄存器(Conf):用来存储器件的配置,如:器件工作模式、OS工作模式、 OS极性和OS故障队列;(2) 温度寄存器(Temp):用来存储读取的数字温度; (3)设定点寄存器(Tos&Thyst):用来存储可编程的过热关断和滞后限制。器 件通过2线的串行I2C总线接口与控制器通信。LM75A包含一个开漏输出(OS), 当温度超过编程限制的值时该输出有效。LM75A有3个可选的逻辑地址管脚,使得同一总线上可同时连接8个器件而不发生地址冲突。LM75AOS输出有2种 可选的工作模式:OS比较器模式和OS中断模式。OS输出可选择高电平或低电 平有效。温度寄存器可存放一个11位的二进制补码,从而实现0.125 C的精度。 在缺省模式下,OS工作在比较器模式,温度阈值为80C,滞后75To 2 二系统设计详述 2.1系统总体方案设计FPGA不像单片机那样逐条执行程序,而是以并行运算为主,以硬件描述语 言来完成电路设计。因此,基于 FPGA勺温度测量系统具有运行速度更快,支持 大量数据的高速处理等优点。应用 Verilog HDL ( hardware description Ianguage )语言编写的程序写入FPGAf,能形成实际电路。FPGA勺内部程序是 并行操作,所以硬件电路不会存在程序逐条执行的问题,且FPGA硬件的数据处理速度非常快,可达到ns级别,因而本系统比单片机系统能更迅速、实时地监 测信号的变化和及时更新数据。5本文将Altera公司生产的 FPGA芯片EP2C35F672C作为处理器。此芯片有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的测温系统总体分为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, AO, OS, SCL (串行时钟线),SDA (串行双向数据线)VCC, GND其内部集成了 很多器件,有IIC总线接口、逻辑控制接口、带隙温度传感器、11位模拟转数字转换器以及各种寄存器等。存储器件的某些配置的寄存器(Conf)、存储数字温度的寄存器(Temp也都包含在内。LM75A测温最大范围为-55+125 C,测 温精度0.125 C。SCL和 SDA勾成IIC串行总线,可以实现多个器件之间的 主从式通信;OS为过热关断输出接口,外部可连接检测器或中断线,当温度超 过设定温度值时该输出有效;VCC,GND别接系统电源和地;A0A2是用户自定 义地址位,通过对A0, A1和A2的逻辑定义,可以使8个LM75A接在同一总线而 不会有地址冲突。由于系统只采用了一个测温器件测量温度,所以电路中A0, A1, A2接地,逻辑地址为0。温度寄存器(Temp是一个由高8位字节和一个低8位 字节组成的只读寄存器,其中仅有高11位被存放到Temp数据,其余低5位为08。Temp数据的分辨率为0.125 C,当读到Temp寄存器时,所有16位数据 都提供给总线。若Temp数据的最高有效位为逻辑 0,则表示温度是正值,温度 值C )=+(Temp数据)*0.125 C;若Temp数据的最低有效位为逻辑1,则表示温 度是负值,温度值(C )=-(-Temp数据+1)*0.125 C。在进行温度采集前,FPGA 必须先对LM75A器件初始化,包括对LM75A的地址选择,滞后寄存器、配置寄存 器等的数据写入等。初始化完成之后,从 LM75A器件的Temp中读取当前温度。2LM75A的功能框图如下:Vot图4功能框图LM75A的管脚描述如下:SDA 1O8 VecSCL 27 AOOS 36 AlGND 4(5_ A2图5 LM75A的管脚描述图管脚编号助记符描述1SDA数7io 1 L i-c.Bii双向数抵线.开漏输出。SCL数字输入“ i2c Jf.fr时钟输入。3OS过热关断输fh开漏输Hl。4GND地再连接到系统地*5A2数于输入,用户定义的地址位墓6Al数了输入亠用户定义的地址位1.AO数卞输入用户定义的地址位九8Vcc电源。表1 LM75A的管脚描述表LM75A内部温度寄存器工作原理如下:Tsmp MS字节Temp LS字节MSBLSBMSBLSBB6B5B4B3B2BlBOB7B&B5B4B3B2BlBOTemp据(11 位未使用MSBLSBDIOD9DSD?D6D5DJD3D2DIDOXXXXX抿据i丨位的Temp数揭来计算Tenip值的方法:1. 若口皿讥温壹值(口 二数据)XCII25T ;2. 苦D】X I遍度蘑(忙)=数据的二瞪蚌昭】皿12TC”表2温度寄存器工作原理四.Verilog代码设计VHDL AHDLFPGA的设计输入方法有原理图和硬件描述语言(包括VerilogHDL等)2种。传统设计方法一般是采用直观、容易理解的原理图输入。 但是此方法移植性不好,当所选芯片升级之后,所有设计的原理图都需改动。现 在工程师常用的设计方法是用硬件描述语言完成所需设计,其特点主要表现为自顶向下设计。3相比于原理图设计方法,自顶向下设计方法主要有以下优点:1)从功能描述到物理实现完全符合设计者的设计思路。2)设计可以重复利用,能应用在不同的产品设计中。3)容易修改设计。设计者可以在门消耗以及时序 2方面对FPGA的结构进行 比较,从而选择最佳的设计方案。4)设计周期短,效率高。采用自顶向下设计方法的效率可以达到传统原理图设计方法的24倍。鉴于自顶向下设计方法的诸多特点, 本系统软件部分采用 自顶向下模块化设计思想进行设计,主要包括IIC通信模块、温度显示模块等。4.1 IIC通信模块FPGA和LM75A两者之间的通信严格按照IIC总线管理定义的规则。在LM75A 检测温度时,须先对LM75A初始化,即对其配置寄存器写入控制字进行工作模式 的设定。写配置寄存器时序如图 6所示。SCLIQ弭严髭厂7 d :)LrirjmjumrLrLrLrT卑白掃叶”处宇阪I主机石应畧图6读温度寄存器时序通信开始前,IIC总线一定要有空间或者不忙,这就要求总线上的器件 必须释放SDA和SCL线。主机启动起始信号 S后,开始对配置寄存器写入要选 择的器件地址,硬件电路图中的 A0, A1, A2与地相接,因此器件的逻辑地址是“000”,再将“ 00000001”写入寄存器地址指针,等待器件响应一个系统时钟 周期后,再进行工作模式的写入。完成上述步骤后,LM75A开始工作,若在正常工作模式下,每隔100 ms进行一次转换(模数转换),转换的结果存放在Temp寄存器中。FPGA卖取Temp寄存器中的数据,对其处理后,就能得到温度数据。 FPGA卖取Temp寄存器中的数据也需严格按照IIC总线管理定义的规则。读取温 度数据的时序图如图7所示。由于系统时钟为50 MHz为了方便分频,选择用800kHz的频率作为LM75A的时钟频率,即SCL时钟频率为800kHz。由时序图8可知,62个时钟周期即可 完成一次读操作;该计数器控制SDA相对于SCL的相位关系,此时SDA勺时钟频 率为 400kHz。SDA-jmrLTLrLrLrTJi/TXj u /T*VT5CTiYyiF y_jVuViAruiiVill畑吝I 2_3_ 45 fi ALrLTLrLrLrVLrLrLrLr _I10#图7读温度寄存器时序4.2状态机的设计状态编号状态0起始/复位状态 1发送启动信号2发送控制字3接收应答信号4发送指针地址5接收应答信号6重新启动7发送读控制字8接收应答信号g读取高区位信号 10废送应答 11读取低g位数据 12发送非应答信号 13停止表3状态机状态表4.3温度显示模块系统采用6位八段共阳数码管显示温度。为使6位数码管动态显示温度,可采用动态扫描的方法依次点亮数码管,当扫描速度达到某个范围时,可利用人眼 视觉暂留的特点,使人感觉4位数码管是在同一时间显示。动态扫描的频率最好 大于50 Hz,每个数码管显示的时间要适中,不能过长或过短,时间过长则会出 现闪烁的情况,时间过短发光二极管电流的导通时间也短,会导致数码管亮度变暗。一般扫描时间控制在12 ms左右。FPGA产生的扫描时间程序如下。/产生数码管扫描的计数器,扫描时间为0.1msalways (posedge sys_clk or n egedge sys_rst_ n)begi nif ( sys_rst_ n =1b0)sca n_cnt = 16bO;elsesca n_cnt = sca n_cnt + 16b1;end其中,scan_cnt为16位寄存器,存储计数值,记一次数的时间为1 mssyc_clk是系统时钟信号,sys_ret_n是系统复位信号,c1c4为数码管位选信 号,seg_a seg_h分别接数码管的发光二极管,其中seg_h控制小数点。Im75_temp是FPGA从器件LM75A采集到的11位温度数据经过计算后的数据, 其 算法是:lm75_temp = (buff10:0*125)/10;/存储在缓存器buff中的11位数据经计算后,赋值给lm75_temp寄存器。由于lm75_temp里面寄存的为二进制数据,所 以需先转成为BCD码,才能输出显示。4.4系统整合在用Verilog HDL编程中,系统软件部分采用模块化设计。上文的 IIC通信 模块和温度显示模块为系统独立模块,故需编写顶层模块(命名为 top )将2个 模块整合起来。top模块能定义各个管脚接口,从而使系统与外界进行通信。top 模块通过顶层调用方法将iic ( FPGA和LM75A!信模块)和led (数码管扫描显 示模块)组合成为一个完整的系统。将完整的程序下载到 FPGA芯片,系统即可 测量环境温度。11Duiris.oikflyfiller.kBii Wetled.leddata hri5.0iwIZ.DIseoI? 01)eg|7 O|=d3图9顶层方案图五仿真波形及说明Ukoi junHjimtrLIhirnnjyiJTnjI 自1m - Debit二陛竺OXO? 1【IMCTIILH3 bniLsL K1CI1匸阪 iTi i jTTTTTTrrm!tzznTTE-T3DOC:06mU1 : IiL. JOKOKW1 J 丁 HWUMCil.LJ12图10仿真波形仿真结果分析:Clk为外部输入时钟,为50MHZ初始值为1, ;rst_n为系统复位,初值为0; key_rd为读信号,低电平有效;scl为iic的时钟线;读sda为iic的数据 线;count为一个8位计数器,每计数31,clk_sys翻转一次,即分频产生800K 的系统时钟;,当clk_sys或rst_n为下降沿时,若总线忙,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为高阻态。之后发送非应答信号,scl 为高电平时,sda由低变为高电平,即为停止。六设计小组的分工及安排设计小组成员:范亚君胡花欣段郁丹设计工作主要涉及查阅资料、原理分析、代码编写、仿真模拟、修正纠错、设 计报告等内容 设计分工及安排:1. 1月4号至5号到图书馆及网上查阅相关资料.2. 根据硬件特性分析原理.三人分别进行初步编写,然后互相修改各运行模块和测试模块;其中范亚君负责iic.v文件的编写,胡花欣负责iic_tb.v 和top_tb.v 测试文件的编写,段郁丹负责top.v、led.v和key_filter.v文件的编写。3. 在Quartus II 13.0中进行仿真模拟,验证其与预想结果是否一致,并进行仿真 分析,做相关细节修改.4. 仿真结果检验正确后,共同书写设计报告书.七收获和体会本文设计实现了一种基于 FPGA和LM75A勺测温系统。用FPGA勺I/O弓I脚来 模拟I2C总线实现主控制器,可以降低研制成本、节约空间和降低电路的复杂 性,在实际应用中有重大意义。其设计简单、功耗低、操作方便、响应快、测量 精度高。该系统可用于室内温度测量、室外动植物生长环境温度测量等测温场所, 该测温系统还可扩展利用8个LM75A数字温度传感器测温,从而实现多点大范围 测温。通过这次课程设计,我们对FPGA的整个开发过程有了更加深入的了解,并有了实际动手操作的经验,让我更好的掌握了相关知识。通过FPGA器件,我们可以方便、快速开发出很多复杂的数字电路以供实际需要,通过编写代码省去了许多硬件连接,增强了系统的可靠性。在设计过程中,我们经常需要修改、完善 系统的功能,这也只是改变代码并下载到芯片中就行了,省去了很多时间。本次课程设计是3人一组完成,这也锻炼了我们之间合作的能力,这是十分必要的, 因此今后在工作中必须要加强与他人的合作。由于verilog理论课程是在上一个学期学习的,经过一个暑假,很多知识点都有遗忘,这给我们完成课程设计带来 了一定困难,好在老师对我们精心指导,学校也提供实验室给我们实验,在我们 的共同合作下,我们终于克服困难,完成了课程设计。八.参考文献1 褚振勇,翁木云 FPGA设计及应用M.西安:西安电子科技大学出版社 2002.2 LM75A数字温度传感器使用手册3 杨新鹏.基于LM75A的多点温度监控系统设计J.工业仪表与自动化装置, 2013.4 谭会生,张昌凡.EDA技术及应用M. 2 版.西安:西安电子科技大学出 版社,2004. 夏宇闻.Verilog 数字系统设计教程 第3版北京航空航天大学出版社附录:1. VerilogHDL 程序清单程序清单名称文件名iic模块源码iic. viic模块测试文件v顶层模块源码top. v顶层模块测试文件top_tb. v数码管显示模块源码led. v按键消抖模块源码key_fliter v表3程序清单2. VerilogHDL语言源代码和测试代码iic.v 文件代码II外部输入时钟II系统复位II读信号(低电平有效)IIiic 的数据线IIiic 的时钟线II输出数据外部输入时钟系统复位读信号(低电平有效)IIiic 的时钟线module iic( clk, rst_n, key_rd, scl, sda, data_out);II系统输入in put clk; II in put rst_n; II in put key_rd;IIII系统输出output reg scl;inout sda; /iic的数据线reg sda_buffer;reg flag;/写入数据的中间寄存器/控制系统是否占有总线控制权输出数据output reg 15:0 data_out;assig n sda = (flag) ? sda_buffer : 1bz; 制权/为低电平时,/reg 7:0 cou nt;计数器reg clk_sys; 系统时钟/ 分频产生当flag为高电平时,系统拥有总线控并发送sda_buffer中的数据。当flag释放总线。800Khz 时钟 clk_sys15always (posedge clk or n egedge rst_n) beginif (!rst_n)beginclk_sys = 1b0; cou nt = 8d0;end分频成为近800K的时钟elseif (cou nt 31)/ count = count + 1;elsebegincou nt = 8d0;clk_sys = clk_sys;endend/reg 5:0 state;/状态寄存器/ 输出 sclalways (n egedge clk_sys or n egedge rst_n) beginif (!rst_n)beginscl 0)/ scl = scl;elsescl = 1b1;/ endend/当总线忙的时候,scl为近400K的时钟空闲时,scl为高reg 3:0 cnt;发送或者接收数据的个数reg 7:0 memory;/发送或者接受数据的中间寄存器always (posedge clk_sys or n egedge rst_n) beginif (!rst_n)begindata_out = 16d0;flag = 1b1;/sda_buffer = 1b1; / state = 0;ent = 0;复位时,系统获得总线的控制权 向iic的数据线上发送高电平memory = 8d0;endelsecase(state)0 : if(scl)beginif(!key_rd)有按键按下beginsda_buffer = 1b0;state = 1;memory = 8b1001_0000;/endelsestate = 0;endelsestate = 0;/发送启动信号准备控制字1 : if(scl = 0) & (cnt 8)/发送八位控制字beginsda_buffer = memory7; cnt = cnt + 1;memory = memory6:0,memory7;17state = 1;endelsebegin释放总线控制权指针寄存器temp地址if (scl = 0) & (ent = 8) begin ent = 0;flag = 0;/ state = 2;endelsebegin state = 1;endend2 :/if(!sda)检测应答信号beginstate = 3;memory = 8b0000_0000;end/else/begin/state = 0;/end3 : if(scl = 0) & (cnt 8) /发送指针地址beginflag = 1;/获得总线控制权sda_buffer = memory7;cnt = cnt + 1;memory = memory6:0,memory7;state = 3;endelsebeginif (scl = 0) & (cnt = 8)begincnt = 0;flag = 0;/释放总线控制权state = 4;endelsebeginstate = 3;endend4 :检测应答信号/if(!sda)beginstate = 5;end/else/begin/state = 0;/end: if (!scl) scl=O19#beginflag = 1;/获得总线控制权送启动信号做准备)sda_buffer = 1;/拉高iic 的数据线(为发state = 6;end#6 : if (scl)#begin sda_buffer = 0;/ 发送启动信号 state = 7;memory = 8b1001_0001; / 控制字 end7 : if(scl = 0) & (cnt 8)/发送八位控制字beginflag = 1; /获得总线控制权sda_buffer = memory7;cnt = cnt + 1;memory = memory6:0,memory7;state = 7;endelsebeginif (scl = 0) & (cnt = 8)begincnt = 0;flag = 0; /释放总线控制权state = 8;endelsebeginstate = 7;endend8 :/if(!sda)/beginstate = 9; end检测应答信号/else/begin/state = 0;/end接收数据获得总线控制权发送应答信号9 :if(scl = 1) & (ent 8)/beginent = ent + 1;data_out = data_out14:0,sda; state = 9;endelsebeginif (sel = 0) & (ent = 8)beginent = 0;flag = 1;/state = 10;sda_buffer = 0;/endelsestate = 9;end10 : if(sel = 0)beginflag = 0; state = 11;end: if(sel = 1) & (e nt 8)/接收数据20beginent = ent + 1;data_out = data_out14:0,sda; state = 11;endelsebeginif (sel = 0) & (ent = 8)beginent = 0;flag = 1; / state = 12;sda_buffer = 1;/endelsestate = 11;end12 : if (sel = 0)beginsda_buffer = 0;/信号做准备)state = 13;endelsestate = 12;获得总线控制权发送NOAC信号拉低iie的数据线(为发送停止13 : if (sel = 1) /beginsda_buffer = 1; state = 0;endelsestate = 13;default : state = 0 ;endeaseend发送停止信号en dmoduleiie_tb.v文件代码timeseale 1n s/1psmodule iie_tb;22/系统输入reg elk;/ 外部输入时钟reg rst_n; 系统复位reg key_rd;读信号(低电平有效)/系统输出wire sel;/iie 的时钟线wire 15:0 data_out;输出数据wire sda; /iic的数据线iic iic(clk(clk),/外部输入时钟rst_n (rst_ n), / key_rd(key_rd), / sel(sel), sda(sda),系统复位读信号(低电平有效)/iie的时钟/iie的数据线.data_out(data_out)/输出数据);in itial begi nelk = 1;rst_n = 0;key_rd = 1;#1000.1 rst_n = 1;#10000key_rd = 0;/读信号有效#40000 key_rd = 1;/读写号释放end always #10 elk=elk; /50M 的时钟en dmoduletop.v文件代码module top(elk, rst_n, key_i n, sel,sda,sel,/外部输入时钟/系统复位/读信号(低电平有效)/iie的数据线/iie的时钟线seg);in put elk; / 外部输入时钟 in put rst_n; /系统复位in put key_i n;读信号(低电平有效)/系统输出output scl;iic的时钟线in out sda; /iic的数据线output 2:0 sel;output 7:0 seg;wire key_out;wire 15:0 data_out;key_filter key_filter(.clk (clk),.rst_ n (rst_n),.key_in(key_i n),.key_out(key_out);iic iic(.clk(clk),II外部输入时钟.rst_n(rst_n),II系统复位.key_rd(key_out),II读信号(低电平有效).scl(scl),IIiic的数据线.sda(sda),IIiic的时钟线.data_out (data_out) II输出数据.clk(clk),.rst_n(rst_n),.data_in(data_out),.sel(sel), II位选.seg(seg) II段选都是低电平点亮);led led();en dmoduletop_tb.v文件代码module top_tb;reg clk;/外部输入时钟reg rst_n;/系统复位reg key_i n; II 读信号(低电平有效) wire scl;I/iic的数据线wire sda;I/iic的时钟线wire 2:0 sei;wire 7:0 seg;in itial begi nclk = 1;rst_n = 0;key_in = 1;#1000.1 rst_n = 1;#10000key_in = 0;/读信号有效#40000 key_in = 1;/ 读写号释放 endalways #10 clk=clk; /50M 的时钟top top(.clk(clk),/外部输入时钟.rst_n(rst_ n)./系统复位.key_in (key_i n),/读信号(低电平有效).scl(scl),/iic 的数据线.sda(sda),/iic 的时钟线.sel(sel),.seg(seg);en dmodulekey_filter.v文件代码timescale 1n s/1psmodule key_filter(clk, rst_n, key_ in, key_out);parameter MASK_TIME = 1_00; /20ms/20 ns=106in put clk;in put rst_n;in put key_ in; output reg key_out;localparam s0 = 1b0;localparam s1 = 1b1;reg temp;reg 31:0 count;reg state;always (posedge elk, n egedge rst_n) beginif (!rst_n)begincount = 0;key_out = 1;temp = 1; state = sO;endelsecase (state)s0 :if (key_in = temp)state = s0;elsebegintemp = key_i n; state = s1;ends1if (key_in = temp)if (cou nt MASK_TIME) begincount = count + 1; state = s1;endelse beginkey_out = temp; count = 0;state = s0;endelsebegincount = 0; temp = key_i n; state = s1;endendcase enden dmoduleled.v文件代码module led(in putwireclk,in putwirerst_n,in putwire15:0data_i n.outputreg2:0sel, /位选outputreg7:0seg /段选都是低电平点亮);reg 3:0 seg_data;reg clk_sys;reg 31:0 count;/ 分频产生10Khz时钟clk_sysalways (posedge clk or n egedge rst_n) beginif (!rst_n)beginclk_sys = 1b0;cou nt = 8d0;endelseif (count 2500-1)/分频成为近10K的时钟count = count + 1;elsebegincou nt = 8d0;clk_sys = clk_sys;endend/数码管扫描always (posedge clk_sys or n egedge rst_n)beginif(!rst_ n)sel =3b011)sel = 0;elsesel = sel + 1;endalways (*)beginif(!rst_ n)27elseseg_data = 0;28case(sel)0:seg_data = data_i n15:12; D10D71:seg_data = data_i n 11:8; D6D3剩下的四位不用管剩下的四位不用管2:seg_data = data_i n7:4; D2D0 x3:seg_data = data_ in 3:0; /xxxxdefault : seg_data = 0;endcaseendalways (*)beginif(!rst_ n)seg = 8hff;elsebegincase(seg_data)0: seg = 8hcO;1: seg = 8hf9;2: seg = 8ha4;3: seg = 8hbO;4: seg = 8h99;5: seg = 8h92;6: seg = 8h82;7: seg = 8hf8;8: seg = 8h80;9: seg = 8h90;10: seg = 8h88;11: seg = 8h83;12: seg = 8hc6;13: seg = 8ha1;14: seg = 8h86;15: seg = 8h8e;default : seg = 8h8e;/ffendcaseendenden dmodule#
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!