1、 1 基于 FPGA 的 多功能数字钟 一、设计题目 基于 FPGA 的多功能数字钟 二、设计目的 1.掌握可编程逻辑器件的应用开发技术 设计输入、编译、仿真和器件编程; 2.熟悉一种 EDA 软件使用; 3.掌握 Verilog 设计方法; 4.掌握分模块分层次的设计方法; 5.用 Verilog 完成一个多功能数字钟设计 ; 6.学会 FPGA 的仿真。 三、设计 内容 设计一个多功能数字时钟,具有时分、秒计数显示、闹钟功能。能够利用按键实现对闹钟时间的设定并在当前显示时间到时后能够进行闹钟提示。能够利用按键实现“较时”、“较分”功能 ,随时对数码管的显示进行校正和校对。数字中系统主要由系
2、统时钟,三个功能按键( mode, turn, change), FPGA,数码管和蜂鸣器部分组成。 四、 及硬件描述语言 简介 简介 FPGA( Field Programmable Gate Array),即现场可编程门阵列,它是在 PAL、GAL、 CPLD 等可编程器件的基础上进一步发展的产物。它是作为专用集成电路( ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 目前以硬件描述语言( Verilog 或 VHDL)所完成的电路设计,可以经过简 单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC 设计验证的技术
3、主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如 AND、OR、 XOR、 NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的 FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器( Flip flop)或者其他更加完整的记忆块。 2 系统设计师可以根据需要通过可编辑的连接把 FPGA 内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。 一个出厂后的成品 FPGA 的逻辑块和连接可以按照设计者而改变,所以 FPGA 可以完成所需要的逻辑功能。 FPGA 一般来说比 ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也
4、有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的 FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的 FPGA 上完成的,然后将设计转移到一个类似于 ASIC 的芯片上。 硬件描述语言简 介 硬件描述语言 HDL( Hardware Description Language)是一种用形式化方法来描述数字电路和系统的语言。目前,电子系统向集成化、大规模和高速度等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法在业界得到迅猛发展, HDL 在这种形势下显示出了巨大的优势,展望将来 HDL 在硬件设
5、计领域的地位将与 C 和 C+在软件设计领域的地位一样,在大规模数字系统的设计中,它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法,而成为主要的硬件描述工具。 Verilog HDL 是一种硬 件描述语言 (hardware description language),为了制作数字电路而用来描述 ASICs 和 FPGA 的设计之用。 Verilog HDL 是目前应用最为广泛的硬件描述语言, 可以用来进行各种层次 的逻辑设计,也可以进行数字系统的逻辑综合,仿真验证和时序分析等, 适合算法级, 寄存器级,逻辑级,开关级、系统级和版图级等各个层次的设计和描述。 Verilog HDL 进行
6、设计最大的优点是其工艺无关性, 这使得工程师在功能设计,逻辑验证阶段可以不必过多考虑门级及工艺实现的具体细节 ,只需根据系统设计的要求 施加不同的约束条件,即可设计出实际电路。 Verilog HDL 是工业和学术界的硬件设计者所使用的两种主要的 HDL 之一,另一种是 VHDL。现在它们都已成为 IEEE 标准。两者各有特点,但 Verilog HDL 拥有更悠久的历史、更广泛的设计群体,资源也远比 VHDL 丰富,且非常容易学习掌握。 本设计 提出了以 Verilog HDL 语言为手段,设计了多功能数字钟。其代码具有良好的可读性和易理解性,源程序经 Altera 公司的 Quartus
7、和3 ModelSim软件完成综合、仿真。 此程序通过下载到 FPGA 芯片后,可应用于 实际的数字钟显示中。 五、总体设计原理 1、关于模式信号 mode 选择各个功能显示的构思: 考虑到使用 mode 按键产生 0、 1 信号在正常时间显示、调节时间功能、调节闹钟功能和跑表功能这四个功能之间的转换。所以 mode 信号的作用主要体现在控制模块 (1)和显示模块中,虽然计时模块中也用到 mode 信号,但是它只是 turn信号将秒信号清零的辅助作用,保证只有在 m=0(即普通时钟显示)下 turn 信号清零功能才起作用,在校时功能下只能是分、小时的切换和跑表下的暂停功能。 a、 在控制模块下
8、的作用: 在控制模块下,其实 mode 和 turn 信号的作用更像 2-4 译码器的功能,将change 数字上加信号按不同的 mode 和 turn 分成四个信号,分别是 count1(时间显示下的分信号 )、 counta(时间显示下的小时信号 )、 count2(闹铃显示下的分信号 )、countb(闹铃显示下的小时信号 )。 b、 在显示模块下的作用: 同在控制模块下的作用。只是将 turn 信号选出的小时和分钟在同一个 mode下一起送至数码管显示。 2、关于时间调整和闹铃时间调整中数字上加的原理: 对于这个问题,我们要考虑两种情况,首先是 时间调整的情况:因为在时间调整下,数字的
9、上加不仅受到 change 信号的作用(即人工调时),还受本身在 1Hz信号下计时而随时发生的累加。而闹铃时间调整不存在这种情况,因为闹铃下的时间数字发生上加只可能人工调节 (change 信号作用下 )的结果。 a、 时间调整下的上加: 由于在控制模块( 2)下又设置了快加的功能,所以有三部分信号对上加起作用,一是快加下的 numXclk,表示以原始时钟的速率上加,二是慢加下的 change具体到各模块、各位的 count1 或 counta,三是秒信号记到 9 向分信号的进位。 b、 闹铃时 间调整下的上加: 该部分原理同上,只是少了低位记到 9 向高位的进位。所以只有两部分组成,一是快加
10、下的 numXclk,表示以原始时钟的速率上加,二是慢加下的 change 具体4 到各模块、各位的 count2 或 countb。 图 1 多功能数字钟总体设计模块 六、各模块说明 1. 分频模块 由于 FPGA 内部提供的时钟信号频率大约为 50MHz,在这需要将它转化成1Hz 的标准时钟信号供数字钟的计时显示;在此采用了级联分频法。 代码如下: module fenpin(clk,clk_1Hz,clk_100Hz,clk_1k); output clk_1Hz,clk_100Hz,clk_1k; input clk; reg clk_1Hz=0,clk_3=0,clk_1=0,clk
11、_2=0,clk_1k=0; reg 6:0 cnt1=0,cnt2=0,cnt3=0,cnt4=0,cnt5=0; wire clk_100Hz; always (posedge clk) begin if ( cnt1 156/2-1) /156 分频 ,生成 1MHz 信号 begin 5 cnt1 = cnt1 + 1; end else begin cnt1 = 0; clk_1 = clk_1; end end always (posedge clk_1) if ( cnt2 156/2-1) /100 分频,生成 10000Hz 信号 begin cnt2 = cnt2 + 1;
12、 end else begin cnt2 = 0; clk_2 = clk_2; end always (posedge clk_2) if ( cnt5 10/2-1) /10 分频,生成 1kHz 标准信号 begin cnt5= cnt5 + 1; end else begin cnt5= 0; clk_1k= clk_1k; end always (posedge clk_2) 6 if ( cnt3 100/2-1) /100 分频,生成 100Hz 信号 begin cnt3 = cnt3 + 1; end else begin cnt3 = 0; clk_3 = clk_3; e
13、nd assign clk_100Hz=clk_3; always (posedge clk_3) if ( cnt4 100/2-1) /100 分频,生成 1Hz 标准信号 begin cnt4= cnt4 + 1; end else begin cnt4= 0; clk_1Hz= clk_1Hz; end endmodule 最终输出的是 1Hz,100Hz,1kHz 的标准时钟信号 clk_1Hz ,clk_100Hz,clk_1k。 2、 计时模块 原理: m 是模式按键,当 m=0 时,进入计时模式,在计时模式下可以进行时间调整。 num3, num4 产生加速调 整时间,当其值为
14、 1 时,可以快速调整时间,该调整时间的频率由 clk 提供。 counta, count1 是手动调节时间。 Turn 接按键,可以改变当前调节的是小时还是分钟,长按 turn 键还可以使秒钟信号清零。sec1,min1,hour1 输出的是计时的秒,分,时。 代码如下: module jishi(clk,clk_1Hz, 7 turn,/ turn: 接按键,在手动校时功能时,选择是调整小时,还是分钟;若长时间按住该键,还可使秒信号清零,用于精确调时 mode,count1,counta,sec1,min1,hour1,num3,num4); input clk,clk_1Hz,turn,
15、num3,num4; input mode; input count1,counta; output 7:0 sec1,min1; output 7:0 hour1; wire clk_1Hz,ct1,cta,turn,num3,num4; reg 7:0 sec1=0,min1=0; reg 7:0 hour1=0; reg 1:0 m; wire count1,counta; reg minclk,hclk; always (posedge mode) /mode 信号控制系统在三种功能间转换 begin if(m=4) m=0; else m=m+1; end /秒钟计时模块 / alw
16、ays (posedge clk_1Hz) if(sec1=8h59)|turn /按住“ turn”按键一段时间,秒信号可清零,该功能用于手动精确调时 if(!(turn/产生进位 end else begin if(sec13:0=4b1001) 8 begin sec13:0=4b0000; sec17:4=sec17:4+1; end else sec13:0=sec13:0+1; minclk=0; end /分钟计时模 ?/ assign m_clk=minclk|count1;/m_clk 产生进位或校正改变 assign ct1=(num3 /ct1 用于计时、校时中的分钟计数
17、 always (posedge ct1) begin if(min1=8h59) begin min1=0; hclk=1; end else begin if(min13:0=9) begin min13:0=0; min17:4=min17:4+1; end else min13:0=min13:0+1; hclk=0; end end /小时计时模块 / assign h_clk=hclk|counta;/h_clk 产生进位或校正改变 assign cta=(num4 /cta 用于计时、校时中的小时计数 always (posedge cta) if(hour1=8h23) hou
18、r1=0; else if(hour13:0=9) begin hour17:4=hour17:4+1; hour13:0=0; end else hour13:0=hour13:0+1; endmodule 3、 闹钟模块 原理: num1, num2 产生加速调整时间,当其值为 1 时,可以快速调整时间,该调整时间的频率由 clk 提供。 countb, count2 是手动调节闹钟时间。 amin,ahour9 是输出的闹钟的分钟和小时, LD_alert 指示当前是否开启闹钟。 代码如下: module Alarm(clk,amin,ahour,num1,num2,count2,cou
19、ntb,LD_alert); input clk,num1,num2,count2,countb; output 7:0 amin; output 7:0 ahour; output LD_alert; wire LD_alert; reg 7:0 amin=0; reg 7:0 ahour=0; assign ct2=(num1 /ct2 用于定时状态下调整分钟信号 assign LD_alert=(ahour|amin)?1:0;/指示是否进行了闹铃定时 always (posedge ct2) if(amin=8h59) amin=0; else if(amin3:0=9) begin
20、amin3:0=0; amin7:4=amin7:4+1; end else amin3:0=amin3:0+1; assign ctb=(num2 /ctb 用于定时状态调节小时信号 always (posedge ctb) if(ahour=8h23) ahour=0; else if(ahour3:0=9) begin ahour3:0=0; ahour7:4=ahour7:4+1; end else ahour3:0=ahour3:0+1; endmodule 4、 控制模块( 1) 原理: m是模式按键,当 m=0 时,指当前输出的是计时功能;当 m=1 时,指当前调整的是闹钟时间;
21、当 m=2 时,指当前调整的是计时时间;当 m=3 时,此时 turn 按键可用于跑表的暂停与开始。 change 接按键,手动调整时,每按一次,计数器加 1;如果长按,则连续快速加 1,用于快速调时和定时; turn 接按10 键,在手动校 时功能时,选择是调整小时,还是分钟;若长时间按住该键,还可使秒信号清零,用于精确调时。 count1,count2,counta,countb 分别是用来调节计时时间和闹钟时间。 LD_min,LD_hour,指示当前调节的是分钟还是小时。 代码如下: Module ctrol(change,turn,count1,count2,counta,count
22、b,pause,LD_min,LD_hour,mode); input change,mode,turn; output count1,count2,counta,countb,pause,LD_min,LD_hour; reg 1:0 m; reg fm=0,count1=0,count2=0,counta=0,countb=0,pause=0,LD_min=0,LD_hour=0; wire mode,turn,change; always (posedge mode) /mode 信号控制系统在三种功能间转换 begin if(m=4) m=0; else m=m+1; end always (posedge turn)/接按键,在手动校时功能时,选择是调整小 时,还是分钟; begin fm=fm; end always (m or fm or change) begin case(m) 3: begin /3:跑表功能; if(fm) pause=1; else pause=0; end