FPGA24小时计时器Word文档格式.docx
《FPGA24小时计时器Word文档格式.docx》由会员分享,可在线阅读,更多相关《FPGA24小时计时器Word文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
2
编写程序,实现功能要求
3天
3
撰写报告
1天
4
答辩
合计
7天
指导教师签名:
年月日
系主任(或责任教师)签名:
目录
摘要I
AbstractII
1任务分析1
2FPGA简介2
2.1FPGA简述2
2.2FPGA工作原理2
2.3FPGA的基本结构2
3主要模块设计5
3.1分频模块5
3.1.1分频模块源代码5
3.1.2分频模块仿真6
3.2按键模块7
3.2.1按键模块源代码8
3.2.2按键模块仿真10
3.3时间模块10
3.3.1时间模块源代码10
3.3.2时间模块仿真13
3.4显示模块14
3.4.1显示模块源代码14
3.4.1显示模块仿真17
3.5闹钟模块18
3.5.1闹钟模块源代码18
3.5.2闹钟模块仿真18
3.6顶层模块19
3.6.1顶层模块源代码19
3.6.2顶层模块仿真21
4小结与体会22
参考文献23
摘要
FPGA是英文FieldProgrammableGateArray的缩写,即现场可编程门阵列,是在PAL、GAL、EPLD等可编程器件基础上进一步发展的产物。
作为专用集成电路(ASIC)领域中的一种半定制电路产品,该产品既解决了定制电路的不足,又避免了原有可编程器件门电路资源有限的缺点。
随着工艺尺寸的逐渐减小,现场可编程门阵列FPGA与专用集成电路ASIC之间的性能差异正在逐渐减小。
相比较ASIC而言,由于FPGA的动态可重配置特性极大降低了电路设计公司在产品设计过程中的设计风险与设计成本,缩短了产品上市的时间,减少了用户升级系统所带来的硬件花费。
因此,越来越多的电路设计公司开始逐渐使用FPGA作为产品研发与测试的硬件平台。
本课程设计是基于QuartusII软件,采用verilog语言对FPGA数字钟进行设计仿真,通过使用CYCLONEII系列的EP2C8Q208C8的FPGA开发板进行验证调试。
关键字:
FPGA数字钟QuartusIIverilog语言
Abstract
FPGAistheEnglishFieldProgrammableGateArrayabbreviation,namelythefieldprogrammablegatearray,isaproductoftheprogrammabledevicebasedonthefurtherdevelopmentofthePAL,GAL,EPLDetc..Asaspecialintegratedcircuit(ASIC)isasemi-customcircuitinthefieldofproduct,theproductcansolvethelackofcustomcircuit,butalsoavoidtheoriginalprogrammablegatecircuitresourceslimited.Asfeaturesizedecreases,theperformancedifferencesbetweentheprogrammablegatearrayFPGAandapplicationspecificintegratedcircuitASICisgraduallydecrease.ComparedwithASIC,becausetheFPGAdynamicreconfigurablecharacteristicsgreatlyreducesthecircuitdesignintheproductdesignprocessdesignriskandcostofdesign,shortenproducttimetomarket,reducetheusercostofhardware,thesystemupgrade.Therefore,circuitdesign,moreandmoregraduallybegantouseFPGAasaproductdevelopmentandtestingofthehardwareplatform.
ThecoursedesignisbasedonQuartusIIsoftware,usingVeriloglanguagetosimulatetheFPGAdigitalclock,verifiedthroughdebuggingFPGAdevelopmentboardusingCYCLONEIIseriesEP2C8Q208C8.
Keywords:
FPGAQuartusIIVeriloglanguagedigitalclock
1任务分析
根据设计要求,我把功能分割为几大功能模块:
顶层模块、分频模块、按键模块、时间模块、闹钟模块、显示模块。
各模块相互配合,模块示意图如图1所示。
图1FPGA数字钟整体设计框图
本次课程设计主要对FPGA多功能数字钟的实现展开,各模块的基本功能是顶层模块,建立各模块关系;
分频模块获取所需时钟;
按键模块建立所需按键,进行消抖处理等;
时间模块进行时间处理,并结合按键,可对时间进行调整;
闹钟模块进行蜂鸣器设置;
显示模块进行数码管显示。
我使用是FPGA是CYCLONEII系列的EP2C8Q208C8-FPGA开发板。
我使用的是QuartusII9.0版本,采用的是verilog语言。
2FPGA简介
2.1FPGA简述
FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
2.2FPGA工作原理
FPGA采用了逻辑单元阵列LCA(LogicCellArray)这样一个概念,内部包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输出输入模块IOB(InputOutputBlock)和内部连线(Interconnect)三个部分。
现场可编程门阵列(FPGA)是可编程器件,与传统逻辑电路和门阵列(如PAL,GAL及CPLD器件)相比,FPGA具有不同的结构。
FPGA利用小型查找表(16×
1RAM)来实现组合逻辑,每个查找表连接到一个D触发器的输入端,触发器再来驱动其他逻辑电路或驱动I/O,由此构成了既可实现组合逻辑功能又可实现时序逻辑功能的基本逻辑单元模块,这些模块间利用金属连线互相连接或连接到I/O模块。
FPGA的逻辑是通过向内部静态存储单元加载编程数据来实现的,存储在存储器单元中的值决定了逻辑单元的逻辑功能以及各模块之间或模块与I/O间的联接方式,并最终决定了FPGA所能实现的功能,FPGA允许无限次的编程。
2.3FPGA的基本结构
FPGA具有掩膜可编程门阵列的通用结构,它由逻辑功能块排成阵列,并由可编程的互连资源连接这些逻辑功能块来实现不同的设计。
FPGA一般由3种可编程电路和一个用于存放编程数据的静态存储器SRAM组成。
这3种可编程电路是:
可编程逻辑模块(CLB--ConfigurableLogicBlock)、输入/输出模块(IOB--I/OBlock)和互连资源(IR—InterconnectResource)。
可编程逻辑模块CLB是实现逻辑功能的基本单元,它们通常规则的排列成一个阵列,散布于整个芯片;
可编程输入/输出模块(IOB)主要完成芯片上的逻辑与外部封装脚的接口,它通常排列在芯片的四周;
可编程互连资源包括各种长度的连接线段和一些可编程连接开关,它们将各个CLB之间或CLB、IOB之间以及IOB之间连接起来,构成特定功能的电路。
1.CLB是FPGA的主要组成部分。
图2是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变量的逻辑函数。
图2CLB基本结构
CLB中有许多不同规格的数据选择器(四选一、二选一等),通过对CLB内部数据选择器的编程,逻辑函数发生器G、F和H的输出可以连接到CLB输出端X或Y,并用来选择触发器的激励输入信号、时钟有效边沿、时钟使能信号以及输出信号。
这些数据选择器的地址控制信号均由编程信息提供,从而实现所需的电路结构。
CLB中的逻辑函数发生器F和G均为查找表结构,其工作原理类似于ROM。
F和G的输入等效于ROM的地址码,通过查找ROM中的地址表可以得到相应的组合逻辑函数输出。
另一方面,逻辑函数发生器F和G还可以作为器件内高速RAM或小的可读写存储器使用,它由信号变换电路控制。
2.输入/输出模块IOB。
IOB提供了器件引脚和内部逻辑阵列之间的连接。
它主要由输入触发器、输入缓冲器和输出触发/锁存器、输出缓冲器组成。
每个IOB控制一个引脚,它们可被配置为输入、输出或双向I/O功能。
当IOB控制的引脚被定义为输入时,通过该引脚的输入信号先送入输入缓冲器。
缓冲器的输出分成两路:
一路可以直接送到MUX,另一路经延时几纳秒(或者不延时)送到输入通路D触发器,再送到数据选择器。
通过编程给数据选择器不同的控制信息,确定送至CLB阵列的I1和I2是来自输入缓冲器,还是来自触发器。
当IOB控制的引脚被定义为输出时,CLB阵列的输出信号OUT也可以有两条传输途径:
一条是直接经MUX送至输出缓冲器,另一条是先存入输出通路D触发器,再送至输出缓冲器。
IOB输出端配有两只MOS管,它们的栅极均可编程,使MOS管导通或截止,分别经上拉电阻接通Vcc、地线或者不接通,用以改善输出波形和负载能力。
3.可编程互连资源IR。
可编程互连资源IR可以将FPGA内部的CLB和CLB之间、CLB和IOB之间连接起来,构成各种具有复杂功能的系统。
IR主要由许多金属线段构成,这些金属线段带有可编程开关,通过自动布线实现各种电路的连接。
3主要模块设计
3.1分频模块
分频模块的主要作用是从FPGA开发板自带的50MHz晶振中分出时间模块需要的1Hz秒时钟信号,作为秒钟的时间。
同时可以分出闹钟模块的蜂鸣器所需的1Khz时钟。
晶体振荡器是构成数字式时钟的核心,振荡器的稳定度及频率的精度决定了数字钟计时的准确程度,它保证了时钟的走时准确及稳定。
石英晶体的选频特性非常好,只有某一频率点的信号可以通过它,其它频率段的信号均会被它所衰减,而且,振荡信号的频率与振荡电路中的R、C元件的数值无关。
因此,这种振荡电路输出的是准确度极高的信号。
然后再利用分频电路,将其输出信号转变为秒信号,其组成框图如图3。
图3秒信号产生电路框图
3.1.1分频模块源代码
分频模块源代码如下:
modulefenpin(clk,rst_n,en_1s,en_1ms);
//产生1s,1ms的分频
inputclk;
//FPGA晶振50Mhz
inputrst_n;
outputen_1s;
outputen_1ms;
reg[31:
0]jishu_1s;
reg[15:
0]jishu_1ms;
parametercnt_1s=49999999;
parametercnt_1ms=49999;
always@(posedgeclkornegedgerst_n)
begin
if(!
rst_n)
jishu_1s<
=32'
b0;
elseif(jishu_1s<
cnt_1s)
=jishu_1s+1'
b1;
else
end
jishu_1ms<
=16'
elseif(jishu_1ms<
cnt_1ms)
=jishu_1ms+1'
assignen_1s=(jishu_1s==cnt_1s)?
1'
b1:
//1s
assignen_1ms=(jishu_1ms==cnt_1ms)?
//1ms
endmodule
3.1.2分频模块仿真
分频模块的RTL视图如图4所示,可以看出输出端en_1ms与en_1s与输入端clk和rst_n的逻辑关系。
图4分频模块的RTL视图
1ms时钟信号的输出,如图5所示,相邻脉冲之间相隔1ms。
图51ms时钟信号的仿真
1s时钟信号的输出,如图6所示,相邻脉冲之间相隔1s。
图61s时钟信号的仿真
3.2按键模块
本设计的按键模块主要作用是校时作用,可以调整时间与闹钟时间,同时作为时间模式与闹钟模式的切换。
本模块用于当有按键按下时,采用软件消抖的办法去除按键抖动。
模块的实现方法是先判断是否有按键按下,如有按键按下则延时一段时间,待抖动过去之后再读行线状态,如果仍有低电平行线,则确定有按键按下,然后产生一个有按键按下的信号。
该模块有一个时钟输入端口,输入时钟信号是分频出来的50MHZ的时钟;
有一个输入端口与行线相连,用于输入行线状态;
一个输出端口,用于输出有按键按下的信号。
3.2.1按键模块源代码
按键模块的部分源代码如下(以一个按键为例):
module//按键控制部分
anjian(clk,rst_n,key1,key2,key1_low,key2_low,key3,key3_low);
inputkey1;
//分加
inputkey2;
//分减
inputkey3;
//界面选择
outputkey1_low;
//按键按下消抖后的标志位
outputkey2_low;
outputkey3_low;
regreg0_key;
//key1消抖
regreg1_key;
regreg2_key;
//key2消抖
regreg3_key;
regreg4_key;
//key3消抖
regreg5_key;
always@(posedgeclkornegedgerst_n)
begin
reg0_key<
=1'
reg1_key<
end
else
=key1;
=reg0_key;
//根据非阻塞赋值的原理,reg1_key存储的值是reg0_key上一个时钟的值
//脉冲边沿检测法,当寄存器key1由1变为0时,key1_an的值变为高,维持一个时钟周期
wirekey1_an;
assignkey1_an=reg1_key&
(~reg0_key);
always@(posedgeclkornegedgerst_n)
reg2_key<
reg3_key<
=key2;
reg3_key<
=reg2_key;
reg[19:
0]cnt_key1;
//计数寄存器
always@(posedgeclkornegedgerst_n)
if(!
rst_n)
cnt_key1<
=20'
d0;
//异步复位
elseif(key1_an)
=20'
//led1_an=1,按键确认按下,cnt_key1从0开始计数
=cnt_key1+1'
//以下为消抖程序
regreg_low;
regreg1_low;
reg_low<
elseif(cnt_key1==20'
hfffff)//时钟50mhz的话大约计时是20ms
//led_an=1,按键确认按下,cnt_key从0开始计数,这时候还有消抖动,计数20ms后抖动滤除了此时再锁存一下key1的值
end//这时key1的值就稳定了
reg1_low<
=reg_low;
assignkey1_low=reg1_low&
(~reg_low);
//当寄存器reg_low由1变为0时,key_low的值变为高,维持一个时钟周期
//以一个按键为例,省略其余两个按键
endmodule
3.2.2按键模块仿真
按键模块的RTL视图如图7所示,可以看出输出端Key1_low、Key2_low、Key3_low与输入端Key1和Key2、Key3、clk、rst_n的逻辑关系。
图7按键模块的RTL视图
3.3时间模块
时间模块的作用是:
利用分频模块产生的精确的秒时钟信号,给时钟秒位计时,设置好时分秒的进位;
利用按键模块的控制,给时钟校时,给闹钟设置时间。
3.3.1时间模块源代码
按键模块的部分源代码如下:
//时、分、秒
moduleshijian(clk,rst_n,en_1s,key1_low,key2_low,key3_low,shi,fen,miao,nao_shi,nao_fen,nao_miao,moshi);
inputen_1s;
inputkey1_low;
inputkey2_low;
inputkey3_low;
output[5:
0]shi;
0]fen;
0]miao;
0]nao_shi;
0]nao_fen;
0]nao_miao;
outputreg[1:
0]moshi;
//0时显示时间1时显示闹钟
reg[5:
always@(posedgeclkornegedgerst_n)//key3按键选择模式
beginmoshi<
=1'
elseif(key3_low)
moshi<
=moshi+1'
end
shi<
=6'
b000001;
//1
fen<
b011000;
//24
miao<
//0
nao_shi<
nao_fen<
b011110;
//30
nao_miao<
b010100;
//20
elseif(en_1s)
miao=miao+1'
if(miao==60)
begin
miao=0;
fen=fen+1'
if(fen==60)
begin
fen=0;
shi=shi+1'
if(shi==24)
shi=0;
end
end
elseif(!
moshi&
&
key1_low)//时间模式下按加键
fen=fen+1'
shi=shi+1'
key2_low)//时间模式下按减键
fen=fen-1'
if(fen==0)
shi=