FPGA24小时计时器课程设计_第1页
FPGA24小时计时器课程设计_第2页
FPGA24小时计时器课程设计_第3页
FPGA24小时计时器课程设计_第4页
FPGA24小时计时器课程设计_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

任务分析根据设计要求,我把功能分割为几大功能模块:顶层模块、分频模块、按键模块、时间模块、闹钟模块、显示模块。各模块相互配合,模块示意图如图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之间连接起来,构成特定功能的电路。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变量的逻辑函数。CLCLBCLBCLBCLBCLBBCLBCLBCLBCLBCLBCLBCLBCLBBCLBCLBCLB可编程开关矩输入输出模块互连资源图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、地线或者不接通,用以改善输出波形和负载能力。可编程互连资源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晶振50Mhzinputrst_n;outputen_1s;outputen_1ms;reg[31:0]jishu_1s;reg[15:0]jishu_1ms;parametercnt_1s=49999999;parametercnt_1ms=49999;always@(posedgeclkornegedgerst_n)beginif(!rst_n) jishu_1s<=32'b0; elseif(jishu_1s<cnt_1s) jishu_1s<=jishu_1s+1'b1; elsejishu_1s<=32'b0; endalways@(posedgeclkornegedgerst_n)beginif(!rst_n) jishu_1ms<=16'b0; elseif(jishu_1ms<cnt_1ms) jishu_1ms<=jishu_1ms+1'b1; elsejishu_1ms<=16'b0; endassignen_1s=(jishu_1s==cnt_1s)?1'b1:1'b0;//1sassignen_1ms=(jishu_1ms==cnt_1ms)?1'b1:1'b0;//1msendmodule3.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);inputclk;inputrst_n;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)beginif(!rst_n) beginreg0_key<=1'b1;reg1_key<=1'b1;endelse beginreg0_key<=key1;reg1_key<=reg0_key;//根据非阻塞赋值的原理,reg1_key存储的值是reg0_key上一个时钟的值endend//脉冲边沿检测法,当寄存器key1由1变为0时,key1_an的值变为高,维持一个时钟周期wirekey1_an;assignkey1_an=reg1_key&(~reg0_key);always@(posedgeclkornegedgerst_n)beginif(!rst_n) begin reg2_key<=1'b1; reg3_key<=1'b1;endelse begin reg2_key<=key2;reg3_key<=reg2_key;endendreg[19:0]cnt_key1;//计数寄存器always@(posedgeclkornegedgerst_n)beginif(!rst_n)cnt_key1<=20'd0;//异步复位elseif(key1_an)cnt_key1<=20'd0;//led1_an=1,按键确认按下,cnt_key1从0开始计数elsecnt_key1<=cnt_key1+1'b1;end//以下为消抖程序regreg_low;regreg1_low;always@(posedgeclkornegedgerst_n)beginif(!rst_n)beginreg_low<=1'b1;endelseif(cnt_key1==20'hfffff)//时钟50mhz的话大约计时是20msbeginreg_low<=key1;//led_an=1,按键确认按下,cnt_key从0开始计数,这时候还有消抖动,计数20ms后抖动滤除了此时再锁存一下key1的值 end//这时key1的值就稳定了endalways@(posedgeclkornegedgerst_n)beginif(!rst_n)reg1_low<=1'b1;elsereg1_low<=reg_low;endassignkey1_low=reg1_low&(~reg_low);//当寄存器reg_low由1变为0时,key_low的值变为高,维持一个时钟周期//以一个按键为例,省略其余两个按键endmodule3.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);inputclk;inputrst_n;inputen_1s;inputkey1_low;inputkey2_low;inputkey3_low;output[5:0]shi;output[5:0]fen;output[5:0]miao;output[5:0]nao_shi;output[5:0]nao_fen;output[5:0]nao_miao;outputreg[1:0]moshi;//0时显示时间1时显示闹钟reg[5:0]shi;reg[5:0]fen;reg[5:0]miao;reg[5:0]nao_shi;reg[5:0]nao_fen;reg[5:0]nao_miao;always@(posedgeclkornegedgerst_n)//key3按键选择模式beginif(!rst_n) beginmoshi<=1'b0; end elseif(key3_low) begin moshi<=moshi+1'b1; endend always@(posedgeclkornegedgerst_n)beginif(!rst_n) begin shi<=6'b000001;//1 fen<=6'b011000;//24 miao<=6'b0;//0 nao_shi<=6'b000001;//1 nao_fen<=6'b011110;//30 nao_miao<=6'b010100;//20 end elseif(en_1s) begin miao=miao+1'b1; if(miao==60) begin miao=0; fen=fen+1'b1; if(fen==60) begin fen=0; shi=shi+1'b1; if(shi==24) shi=0; end end end elseif(!moshi&&key1_low)//时间模式下按加键 begin fen=fen+1'b1; if(fen==60) begin fen=0; shi=shi+1'b1; if(shi==24) shi=0; end end elseif(!moshi&&key2_low)//时间模式下按减键 beginfen=fen-1'b1; if(fen==0) begin shi=shi-1'b1; fen=59; end end elseif(moshi&&key1_low)//时间模式下按加键 begin nao_fen=nao_fen+1'b1; if(nao_fen==60) begin nao_fen=0; nao_shi=nao_shi+1'b1; if(shi==24) shi=0; end end elseif(moshi&&key2_low)//闹钟模式下按减键 beginnao_fen=nao_fen-1'b1; if(nao_fen==0) begin nao_shi=nao_shi-1'b1; nao_fen=59; end endelse begin shi<=shi; fen<=fen; miao<=miao; nao_shi<=nao_shi; nao_fen<=nao_fen; nao_miao<=nao_miao; endendendmodule3.3.2时间模块仿真时间模块的RTL视图如图8所示,可以看出输出端shi、fen、miao、nao_shi、nao_fen、mao_miao与输入端Key1_low和Key2_low、Key3_low、en_1s、rst_n的逻辑关系。图8时间模块的RTL视图仿真了时钟,仿真波形图如图9、图10所示,仿真图满足设计的要求。分计数和时计数模块的设计原理与秒模块的类似。图9秒时钟仿真波形图10计时模块仿真3.4显示模块显示模块的作用是:在8位数码管上显示时间模块输出的时间和闹钟信号,通过按键可以切换显示时间和闹钟。具体原理是采用动态扫描的方法,动态扫描电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且输出数码管的片选信号和位选信号。所谓动态扫描显示方式是在显示某一位LED显示块的数据的时候,让其它位不显示,然后在显示下一位的数据,同时关闭其他显示块。这样做可以使每一个显示块显示与自己相对应的数据。只要保证每一位显示的时间间隔不要太大,利用人眼的视觉暂留的现象,就可以造成各位数据同时显示的假象。一般每一位的显示时间为1~10ms。3.4.1显示模块源代码显示模块的部分源代码如下:(以显示秒为例)modulexianshi(clk,rst_n,en_1ms,shi,fen,miao,led_bit,dataout,moshi,nao_shi,nao_fen,nao_miao);inputclk;inputrst_n;inputen_1ms;input[5:0]shi;input[5:0]fen;input[5:0]miao;input[5:0]nao_shi;input[5:0]nao_fen;input[5:0]nao_miao;input[1:0]moshi;output[2:0]led_bit;//位选output[7:0]dataout;//段选//数码管显示0~9对应段选输出parameternum0=8'b11000000,num1=8'b11111001,num2=8'b10100100,num3=8'b10110000,num4=8'b10011001,num5=8'b10010010,num6=8'b10000010,num7=8'b11111000,num8=8'b10000000,num9=8'b10010000;reg[3:0]shi1,shi2,fen1,fen2,miao1,miao2;reg[3:0]nao_shi1,nao_shi2,nao_fen1,nao_fen2,nao_miao1,nao_miao2;reg[2:0]led_bit;//位选reg[7:0]dataout;//段选reg[2:0]state;//状态寄存器always@(posedgeclkornegedgerst_n)if(!rst_n)begin state<=3'b0; endelseif(en_1ms)begin state<=state+1'b1; shi1=shi/10; shi2=shi%10; fen1=fen/10; fen2=fen%10; miao1=miao/10; miao2=miao%10; nao_shi1=nao_shi/10; nao_shi2=nao_shi%10; nao_fen1=nao_fen/10; nao_fen2=nao_fen%10; nao_miao1=nao_miao/10; nao_miao2=nao_miao%10; if(state==3'b000) begin led_bit=3'b101; if(!moshi) begin case(miao2) 0:dataout<=num0;1:dataout<=num1;2:dataout<=num2;3:dataout<=num3;4:dataout<=num4;5:dataout<=num5;6:dataout<=num6;7:dataout<=num7;8:dataout<=num8;9:dataout<=num9; default:dataout<=num0; endcase end elseif(moshi) begin case(nao_miao2) 0:dataout<=num0;1:dataout<=num1;2:dataout<=num2;3:dataout<=num3;4:dataout<=num4;5:dataout<=num5;6:dataout<=num6;7:dataout<=num7;8:dataout<=num8;9:dataout<=num9; default:dataout<=num0; endcase end endelseif(state==3'b001) begin led_bit=3'b100; if(!moshi) begin case(miao1) 0:dataout<=num0;1:dataout<=num1;2:dataout<=num2;3:dataout<=num3;4:dataout<=num4;5:dataout<=num5; default:dataout<=num0; endcase end if(moshi) begin case(nao_miao1) 0:dataout<=num0;1:dataout<=num1;2:dataout<=num2;3:dataout<=num3;4:dataout<=num4;5:dataout<=num5; default:dataout<=num0; endcase end endend//以显示秒为例,时与分的省略Endmodule3.4.1显示模块仿真显示模块的RTL视图如图11所示,可以看出输出端控制数码管的8位段选和3为位选与输入端时间信号和闹钟信号的逻辑关系。图11显示模块的RTL视图3.5闹钟模块闹钟模块的作用是:当时间与闹钟时间相同时,闹钟模块根据分频模块得出的en_1ms驱动蜂鸣器发出声响。3.5.1闹钟模块源代码闹钟模块的源代码如下:modulenaozhong(clk,en_1ms,beep,shi,fen,miao,nao_shi,nao_fen,nao_miao); inputclk,en_1ms; //clk作为时钟信号,en_1ms作为发声信号 input[5:0]shi;input[5:0]fen;input[5:0]miao; input[5:0]nao_shi;input[5:0]nao_fen;input[5:0]nao_miao; outputregbeep; //作为发声输出信号接扬声器 regbep;initial begin beep<=1; bep<=0; endalways@(posedgeclk) begin if(nao_shi==shi&&nao_fen==fen &&nao_miao<miao) bep<=1'b1; elsebep<=0; endalways@(bep) begin if(bep==1'b1) begin beep<=en_1ms; end elsebeep<=1; endendmodule3.5.2闹钟模块仿真闹钟模块的RTL视图如图12所示,可以看出当输出端时间信号大于等于闹钟信号时,蜂鸣器开始工作。图12闹钟模块的RTL视图3.6顶层模块顶层模块的作用是:例化各模块,建立分频模块、时间模块、按键模块、显示模块、闹钟模块的联系。3.6.1顶层模块源代码顶层模块的源代码如下:moduleshuzizhong(clk,rst_n,key1,key2,key3,led_bit,dataout,beep);inputclk;inputrst_n;inputkey1;//加inputkey2;//减inputkey3;//模式按键output[2:0]led_bit;output[7:0]dataout;outputbeep;wireen_1s;wireen_1ms;wire[5:0]shi;wire[5:0]fen;wire[5:0]miao;wire[5:0]nao_shi;wire[5:0]nao_fen;wire[5:0]nao_miao;wirekey1_low,key2_low,key3_low;wire[1:0]moshi;fenpinfenpin_int(.clk(clk),.rst_n(rst_n), .en_1s(en_1s), .en_1ms(en_1ms) ); anjiananjian_int(.clk(clk),.rst_n(rst_n), .key1(key1), .key2(key2), .key3(key3), .key1_low(key1_low), .key2_low(key2_low), .key3_low(key3_low) ); shijianshijian_int(.clk(clk),.rst_n(rst_n), .en_1s(en_1s), .key1_low(key1_low), .key2_low(key2_low), .key3_low(key3_low), .shi(shi), .fen(fen), .miao(miao), .nao_shi(nao_shi), .nao_fen(nao_fen), .nao_miao(nao_miao), .moshi(moshi) );xianshixianshi_int(.clk(clk),.rst_n(rst_n), .en_1ms(en_1ms), .moshi(mos

温馨提示

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

评论

0/150

提交评论