FPGA的通用外设电路设计.docx
《FPGA的通用外设电路设计.docx》由会员分享,可在线阅读,更多相关《FPGA的通用外设电路设计.docx(31页珍藏版)》请在冰豆网上搜索。
FPGA的通用外设电路设计
封面
作者:
PanHongliang
仅供个人学习
毕业设计(论文)
题目:
基于FPGA的通用外设电路设计
英文题目:
DesignofUniversalPeripheralCircuitBasedonFPGA
学生姓名文韬
专业电子科学与技术
学号05063215
指导教师黄乡生
二零零九年六月
摘要
FPGA器件作为可编程逻辑主流硬件,近年来,应用越来越广泛,在现代科学技术中占有举足轻重的作用和地位。
其外设电路作为芯片与外界输入方式之一,是十分具有研究价值的。
FPGA器件不断增加新的模块,功能越来越强大,基于FPGA的外设电路也顺应形势,不断升级。
本设计综合行列式键盘、LED显示器、时钟一体,应用VerilogHDL语言实现下述功能:
计时功能,包括时分秒的计时;校时功能:
对时分秒手动调整以校准时间;键盘功能:
应用4*4行列式键盘,可实现0-9数字的直接输入;LED动态扫描显示和闪烁,移位,灭零等功能,突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过AlteraQuartusⅡ8.0完成综合、仿真。
本设计实现以上FPGA各功能,可作为EDA技术发展的价值体现。
此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中。
关键字:
行列式键盘、LED显示器、时钟、VerilogHDL。
ABSTRACT
FPGAprogrammablelogicdevices,asthemainstreamofhardware,inrecentyears,moreandmoreextensiveapplicationsinmodernscienceandtechnologyplaysavitalroleandstatus.Itsperipheralcircuitchipwiththeoutsideworldasoneofinputisveryvaluableinresearch.FPGAdevicesareconstantlyaddingnewmodules,morepowerful,FPGA-basedresponsetotheperipheralcircuitisalsothesituationescalated.
Thedeterminantofthedesignofanintegratedkeyboard,LEDdisplay,integratedclock,applicationVerilogHDLlanguagetoachievethefollowingfunctions:
timefunctions,includingthetimewhenminutesandseconds。
schoolfunctions:
everyminuteoftimetomanuallyadjustthecalibrationtime。
keyboardfunctions:
applicationof4*4determinantkeyboard,numbers0-9canbedirectlyimported。
LEDdynamicscanningdisplayandblinking,shift,suchasanti-zerofunction,highlightsthehardwaredescriptionlanguageasagoodreadability,easytounderstandtheadvantagesofportability,andAlteraQuartusⅡ8.0throughthecompletionofsynthesis,simulation.FPGADesignandImplementationoftheabovevariousfunctions,canbeusedasthevalueofEDAtechnologyembodied.
ThisprocessbydownloadingtotheFPGAchipcanbeusedinpracticaldigitalclockdisplay.
Keywords:
determinantkeyboard,LEDdisplay,clock,VerilogHDL.
引言
计算机技术和微电子工艺的发展,使得现代数字系统的设计和应用进入了新的阶段。
电子设计自动化(EDA)技术在数字系统设计中起的作用越来越重要,新的工具和新的设计方案不断推出,可编程逻辑器件不断增加新的模块,功能越来越强,硬件设计语言也顺应形式,推出新的标准,更加好用,更加便捷。
本设计主要以FPGA器件、EDA软件工具、VerilogHDL硬件描述语言三方面内容作为主线,综合行列式键盘,LED显示器件,以及时钟模块于一体,实现三个主要模块的联动,输入部分为4*4行列式键盘,具备0-9十个数字键、修改/确认键、左右移动键,输出数据为6位二进制代码,输出部分为六位7段LED数码管,可实现时分秒显示,时钟灭零显示,修改闪烁以及小数点秒闪烁功能。
而顶层文件时钟模块则将输入输出部分联结起来,实现时钟发生,显示缓存,数据修改,移位,灭零等功能。
另时钟产生模块采用FPGA硬件内置66MHz分频,产生250Hz,5Hz,1Hz信号供时钟模块,输入输出模块使用。
本设计完全采用VerilogHDL语言完成,此程序通过下载到FPGA芯片后,可应用于实际的数字钟显示中。
第一章系统硬件及设计软件介绍
1.1开发板介绍
本设计需要的硬件资源主要有:
1、六位七段数码管
2、4*4行列式键盘
经过仔细筛选,最终选定联华众科FPGA开发板FA130。
联华众科FPGA开发板FA130核心器件为AlteraCyclone系列的EP1C3,配置芯片为EPCS1,FA130上可以运行SOPCBuilder制作的简单的工程。
FA130具有丰富的板载资源,由于板载有51单片机,FA130还可以作为51单片机的学习开发板。
FA130实现了3.3V系统与5V系统对接功能,具体是通过74LVXC3245(或简称3245)实现的。
FA130随板资料中包括丰富的开发实例和制作开发实例的详细步骤说明,以及QuartusII环境下的设计输入,综合,仿真等内容,另外还包括SOPC建立和开发方面内容,如NiosII的建立和NiosII环境下C/C++程序开发等。
FA130的EDA开发实例包括VHDL和Verilog两个版本,FA130的51单片机开发实例包括汇编和C语言两个版本。
同时FA130还包括详细的使用手册和丰富的配套资料,非常适合FPGA,VHDL,Verilog开发学习者使用。
另外FA130随板DVDROM中还包括VS.NET的开发实例,在学习FPGA开发、51单片机开发的同时还可以学习到VS.NET开发环境中C#程序的开发,VS.NET和C#也是WINCE.NET系统上主要的开发环境和编程语言。
图1-1FA130开发板
联华众科FPGA开发板FA130具有丰富的板载资源。
核心器件包括FPGA芯片AlteraEP1C3T100和PLCC封装的单片机STC89LE52。
EP1C3可用I/O分4组全部以插针的形式引出,供外部扩展时使用。
FPGA配置芯片为EPCS1,EPCS1为FLASH类型存储器,存储空间为1M位(1,046,496bits),EPCS1可以工作在5V或3.3V,在本开发板EPCS1与FPGA的IO相同工作电压为3.3V。
时钟资源包括频率为66M有源晶振和1个外接有源晶振插座,外接有源晶振插座可直接安装用户自己希望的任何频率有源晶振。
复位电路由一个复位按键和一片复位芯片组成,复位芯片为IMP812T,IMP812T输出高电平有效的复位脉冲,脉冲宽度为140ms。
IMP812T的复位门限(ResetThreshold)为3.08V,输出的复位信号同时提供给FPGA芯片和单片机使用,FA130上EP1C3和51单片机89LE52均工作在3.3V电源电压。
显示资源包括6位共阴七段数码管,8位LED(绿色),1片1602LCD显示屏。
键盘资源包括4*4按键阵列,4个独立按键,其中4个独立按键可以作为单片机的中断源使用。
电源部分包括1片LM1085-5.0,1片AS2830-3.3和1片AS2830-1.5,LM1085-5.0提供5V直流电源作为AS2830-3.3,AS2830-1.5输入电源和LCD1602供电电源。
AS2830-3.3提供3.3V直流电源,作为FPGA的IO电源和开发板上其他设备电源。
AS2830-1.5提供1.5V直流电源,作为FPGA的核心供电电源。
存储资源包括1片24C02和1片93C46,24C02连接在I2C总线上,是存储空间为256字节串行E2PROM,24C02的设备地址也可以由板上的3位拨码开关设置。
93C46为SPI接口的串行E2PROM,93C46存储空间为128字节。
其他资源还包括8位拨码开关,连接到EP1C3上。
1.2设计软件介绍
本设计使用Altera公司的QuartusII软件,版本为8.0。
AlteraQuartusII设计软件是业界唯一提供FPGA和固定功能HardCopy器件统一设计流程的设计工具。
工程师使用同样的低价位工具对StratixFPGA进行功能验证和原型设计,又可以设计HardCopyStratix器件用于批量成品。
系统设计者现在能够用QuartusII软件评估HardCopyStratix器件的性能和功耗,相应地进行最大吞吐量设计。
Altera的QuartusII可编程逻辑软件属于第四代PLD开发平台。
该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。
Quartus平台与Cadence、ExemplarLogic、MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。
改进了软件的LogicLock模块设计功能,增添了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。
第二章系统方案设计
设计要求:
1、行列式键盘电路包括:
时钟产生电路,扫描电路、按键标志产生电路和键盘译码器;
2、LED显示电路设计包括:
时钟发生器、扫描信号发生器、显示缓存器、七段译码器、小数点产生模块和闪烁模块;
3、键盘与LED显示电路配合,完成数据修改,移位,灭零和小数点移动等功能。
2.1总设计方案
根据课题要求,本设计主要由三个模块完成,
1)输入:
行列式键盘,具备0-9十个数字键及数据修改/确认,左移位键,右移位键三个功能键。
2)输出:
六位7段数码管。
3)主程序:
实现时钟产生,键位识别,数据修改,移位等功能。
4)应以上三个模块要求,设计分频模块,产生符合要求的方波。
如图2-1所示:
图2-1系统设计方案图
2.2分频器设计方案
本设计采用FPGA硬件设计,其内置时钟频率为66MHz,而三个模块需要的是频率较低的信号,应通过寄存器计数来实现分频,考虑到高低频率差异太大,所以拆分成为两个寄存器来实现,这样可以得到250Hz信号,然后再使用两个寄存器可分别得到5Hz,1Hz两个信号。
如图2-2所示。
图2-2分频示意图
2.3行列式键盘设计方案
行列式键盘的工作方式是读取行列线的状态,查看是否有按键按下。
键盘部分提供一种扫描的工作方式,能对键盘不断扫描、自动消抖、自动识别按下的键,并给出编码,能对双键或n个键同时按下的情况实行保护。
本设计需要实现数据修改,移位,所以除了0-9数字键盘以外,还至少需要左右移位键及修改/确认三个功能键,如图2-3所示。
图2-3键盘示意图
键盘需要响应迅速,所以采用了250Hz信号,输入由X1,X2,X3,X4;Y1,Y2,Y3,Y4八根纵横交错的连接线组成,当某根X连接线和Y连接线同时为低电平时有效,例如当X3,Y2为低电平时,识别为“0”键,将输出相应信号供主程序识别。
如图2-4所示。
图2-4键盘电路原理
2.4六位7段LED显示设计方案
在译码器设计时,常用发光二极管的状态验证设计是否满足要求。
这种方式是很直观的,但在计数器设计时,这样的验证方式就显得很不直观,尤其当计数器的位数增加时(如百进制计数),太多的发光管将使结果的独处非常困难。
此时应采用数码管显示,但是当用七段数码显示器显示的位数较多时(如显示8位)BCD码十进制数),为了节省硬件开支,常用动态显示方法,即对各LED数码管循环扫描。
分时使用显示器驱动电路。
1)驱动方式:
直接驱动方式,直接对数码管相应的字段给出驱动电平,以显示字形,其真值表如表2-1所示:
表2-1LED真值表
a
b
c
d
e
f
g
输出
1
1
1
1
1
1
0
0
0
1
1
0
0
0
0
1
1
1
0
1
1
0
1
2
1
1
1
1
0
0
1
3
0
1
1
0
0
1
1
4
1
0
1
1
0
1
1
5
1
0
1
1
1
1
1
6
1
1
1
0
0
0
0
7
1
1
1
1
1
1
1
8
1
1
1
1
0
1
1
9
2)动态扫描显示
动态扫描的FPGA实现可以采用将所有数码管的相同字段并联,由FPGA芯片的输出信号a,b,c,d,e,f,g直接驱动相应字段,由软件编程产生片选信号MS1,MS2,…,MS6循环选中6个数码管。
数码管显示的字形由表2-2决定。
3)相关知识
共阴数码管如右图2-5所示:
每一条线分别对应一个管脚,当管脚为‘1’时,这条线为亮,当管脚设置为‘0’时,这条线不亮。
例如:
设置a的管脚为‘1’,那么0这条线就会亮;设置g的管脚为‘1’,那么6这条线就会亮。
要让数码管显示数字0,那么我们可以设置{a,b,c,d,e,f,g}为“1111110”。
图2-5数码管示意图
2.5顶层模块设计方案
此模块为系统核心模块,大部分的功能都由此模块完成。
1)时钟模块
设计思路:
定义一个长度为24位的时钟显示缓存寄存器,每4位用BCD码来分别显示时分秒的个位,十位,每当1秒周期则秒个位加一,当秒个位为9时则清零,秒十位加一,当秒为59时清零,分加一,同理当分为59,秒为59时,分、秒清零,时加一,同理当时为23,分为59,秒为59时,时分秒清零。
完成时钟的设计。
2)键盘译码模块
设计思路:
定义1位寄存器sel,每当检测到sel信号则自加1,当sel为1时进入修改状态,为0则为时钟状态。
3)数据移位模块
设计思路:
定义3位寄存器flag,当flag不为0时,每当检测到“←”信号时,flag自减1,当flag不为5时,每当检测到“→”信号,flag自加1。
4)数据修改模块
设计思路:
当sel为1时,进入修改状态,检测flag的值,flag的值分别对应各将被修改的数据,如图2-6。
图2-6数据修改信号
检测键盘输入信号,若有0-9数字信号输入则将对应数字赋值给相应时钟显示缓存寄存器。
5)闪烁模块
设计思路:
当sel为1时,引入5Hz信号clkss,当clkss为1时,flag所对应数据输出信号为缓存数据,为0时对应数据电平将为高阻态不显示,这样可实现被修改数据会以5Hz的频率闪烁显示。
6)显示输出模块
设计思路:
将时钟显示缓存寄存器的数据赋值给输出管脚。
第三章系统程序设计
3.1分频器程序设计
在现代电子系统中,数字系统所占的比例越来越大。
系统发展的趋势是数字化和集成化,而CPLD/FPGA作为可编程ASIC(专用集成电路)器件,它将在数字逻辑系统中发挥越来越重要的作用。
在数字逻辑电路设计中,分频器是一种基本电路。
通常用来对某个给定频率进行分频,以得到所需的频率。
整数分频器的实现非常简单,可采用标准的计数器,也可以采用可编程逻辑器件设计实现。
本设计采用标准计数器来实现。
根据设计思路,本模块将66MHz信号分频成为250Hz,5Hz,1Hz三个输出信号,流程图如图3-1所示。
程序每当检测到内置时钟上升沿,计数寄存器1自加1,如果寄存器1等于999,则寄存器1置0,寄存器2自加1,如果寄存器2等于131,则clksy取反,寄存器3,寄存器4均自加1,寄存器2清零,Fs=fx/ns=50M/[(999+1)*(131+1)]=500,可得clksy每秒钟取反500次,即可得clksy=250Hz,图3-1分频程序流程图同理寄存器3和寄存器4每1/500秒自加1。
如果寄存器3等于249,则寄存器3清零,clk取反,根据以上结果可得clk每秒取反2次,即可得clk=1Hz。
如果寄存器3等于49,则寄存器4清零,clkss取反,根据以上结果可得clkss每秒取反10次,即可得clkss=5Hz。
根据以上思路,VerilogHDL程序如下:
moduleclkfs(clk,clkss,clksy,clk66MHz)。
inputclk66MHz。
outputclk,clkss,clksy。
regclk,clkss,clksy。
reg[9:
0]count1。
reg[6:
0]count2。
reg[7:
0]count3。
reg[5:
0]count4。
regcin1,cin2。
always@(posedgeclk66MHz)
if(count1[9:
0]==10'd999)
begincount1[9:
0]=10'd0。
cin1=1'd1。
//产生进位信号1
end
else
begincount1[9:
0]=count1[9:
0]+10'd1。
cin1=1'd0。
//进位信号1清零
end
always@(posedgeclk66MHz)
if(count2[7:
0]==8'd131)
begincount2[7:
0]=8'd0。
clksy=~clksy。
//clksy=250Hz
cin2=1'd1。
//产生进位信号2
end
else
begincount2[7:
0]=count2[7:
0]+cin1。
//若进位信号1为1则加1,为0则不变
cin2=1'd0。
//进位信号2清零
end
always@(posedgeclk66MHz)
if(count3[7:
0]==8'd249)
begincount3[7:
0]=8'd0。
clk=~clk。
//clk=1Hz
end
elsecount3[7:
0]=count3[7:
0]+cin2。
//若进位信号2为1则加1,为0则不变
always@(posedgeclk66MHz)
if(count4[5:
0]==6'd49)
begincount4[5:
0]=6'd0。
clkss=~clkss。
//clkss=5Hz
end
elsecount4[5:
0]=count4[5:
0]+cin2。
endmodule
3.2行列式键盘程序设计
相对if语句只有两个分支而言,else语句是一种多分支语句,故case语句多用于条件译码电路,本设计的行列式键盘模块采用case语句键盘译码。
利用250Hz信号扫描X轴和Y轴电位信号,当某根X连接线和Y连接线同时为低电平时有效。
键盘去抖功能:
按键在闭合和断开时,触点会存在抖动现象,本设计采用250Hz低频信号,触发判定为clk信号上升沿和下降沿,也就是在40ms时间内会有两次判定,如果两次判定均为同一键位,则输出键值,否则输出为0,可以消除触点抖动的负面作用。
示意图如下:
图3-2去抖示意图
图示为两次按键,第一次按键时间极短,可视为一次抖动,第二次为正常按键(时间较长,可以是多个CLK周期,图示只列出1个周期),现分析如下:
图示1处:
读取key1为低;图示2处:
读取key2为高;结果:
key为0,判定无按键。
图示1处:
读取key1为低;图示2处:
读取key2为低;结果:
key为对应键位值,判定有按键。
程序如下:
modulekeypad(clksy,x,y,key)。
//clksy=64hz
inputclksy。
input[3:
0]x,y。
//4*4key,lowactive
output[5:
0]key。
reg[5:
0]key1,key2。
always@(posedgeclksy)//第一次判定
begin
case({~y[3:
0],~x[3:
0]})
8'b00010001:
key1[5:
0]=6'd1。
8'b00010010:
key1[5:
0]=6'd2。
8'b00010100:
key1[5:
0]=6'd3。
8'b00011000:
key1[5:
0]=6'd4。
8'b00100001:
key1[5:
0]=6'd5。
8'b00100010:
key1[5:
0]=6'd6。
8'b00100100:
key1[5:
0]=6'd7。
8'b00101000:
key1[5:
0]=6'd8。
8'b01000001:
key1[5:
0]=6'd9。
8'b01000010:
key1[5:
0]=6'd10。
8'b01000100:
key1[5:
0]=6'd16。
8'b01001000:
key1[5:
0]=6'd32。
8'b10001000:
key1[5:
0]=6'd48。
default:
key1[5:
0]=6'd0。
//输出结果寄存在key1
endcase
end
always@(negedgeclksy)//第二次判定
begin
case({~y[3:
0],~x[3:
0]})
8'b00010001:
key2[5:
0]=6'd1。
//键位1
8'b00010010:
key2[5:
0]=6'd2。
//键位2
8'b00010100:
key2[5:
0]=6'd3。
//键位3
8'b00011000:
key2[5:
0]=6'd4。
//键位4
8'b00100001:
key2[5:
0]=6'd5。
//键位5
8'b00100010:
key2[5:
0]=6'd6。
//键位6
8'b00100100:
key2[5:
0]=6'd7。
//键位7
8'b00101000:
key2[5:
0]=6'd8。
//键位8
8'b01000001:
key2[5:
0]=6'd9。
//键位9
8'b01000010:
key2[5:
0]=6'd10。
//键位0
8'b01000100:
key2[5:
0]=6'd16。
//键位←
8'b01001000:
key2[5:
0]=6'd32。
//键位→
8'b10001000:
key2[5:
0]=6'd48。
//键位sel
default:
key2[5:
0]=6'd0。
//输出结果寄存在key2
en