1、EDA设计基础实验课程论文摘 要数字时钟广泛用于各种场合,比如各种比赛的定时计数等,等都需要用到数字时钟。但是大多数的这些场合都需要很精确的定时计数,而不是一般的定时计数器,因此本设计就是为了这个原因而设计的设计的高精度的数字时钟。本设计中利用50MHz的晶振为FPGA提供时钟。对其再设计时进行了分频得到。在本设计是在Quartus II环境下完成的,目标板是cycloneII EP2C8Q208的FPGA核心板,显示部分采用七段数码管现实,所用到的是Verilog HDL 语言进行行为级的描述。关键词:数字跑表 Quartus II ,Verilog HDL,cyclongIIEP2C8Q2
2、08 22Abstract The design for a multi-functional digital clock, with a year, month, day, hours, minutes and seconds count display to a 24-hour cycle count; have proof functions and the whole point timekeeping function.The use of EDA design technology, hardware-description language VHDL description lo
3、gic means for the system design documents, in MaxplusII tools environment, a top-down design, by the various modules together build a FPGA-based digital clock. The main system chips used EP2C8Q8208, make up of the clock module, control module, time module, data decoding module, display and broadcast
4、 module. After compiling the design and simulation procedures, the programmable logic device to download verification, the system can complete the year, month, day and the hours, minutes and seconds respectively, using keys to modify, cleared , start and stop the digital clock.Keywords: digital cloc
5、k; hardware description language; Verilog HDL目 录摘 要IAbstractII第一章 绪论11.1 概述11.2 FPGA发展现状11.3 本文研究的意义21.4 课题研究的内容2第二章 字时钟的基本理论32.1 主程序结构和流程32.2 设计原理42.2.1 原理图介绍42.2.2 Atium Designer6.9介绍42.2.3 Verilog HDL介绍52.2.4 分析计算6第三章 数字时钟的软件设计63.1 开发软件介绍63.2代码生成BDF图6第四章 单元电路设计84.1 分频代码设计84.2 毫秒代码设计84.3 秒代码设计94.4
6、 分代码设计94.5 复位代码设计104.6键盘代码设计104.7 数码管显示代码设计104.7.1 数码管位码设计104.7.2数码管段码设计11结论12参考文献13附录114附录219致谢21第一章 绪论1.1 概述FPGA(FieldProgrammable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电电路SIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合与布局,
7、快速的烧录至FPGA 上进行测试,是现代 IC 设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flipflop)或者其他更加完整的记忆块。 FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通
8、的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。另外一种方法是用CPLD(复杂可编程逻辑器件备)。 1.2 FPGA的发展现状事实上90年代后期FPGA市场就已经过一番激烈整合,许多业者不是退出PLD(可程序化逻辑装置)市场,就是出售其PLD业务部门,或将PLD业务部门分立成独立公司,或进行购并等。 时至今日,FPGA市场的主要业者仅剩数家,包括Altera、Xilinx(赛灵思,过去称为:智霖科技)、Actel、Atmel、Lattice、QuickLogic等,不过2007年11月QuickLogic也确定淡出FPGA市场,并转进发展CSSP(CustomerSpecifi
9、cStandardProduct)。 但FPGA领域依然有新兴业者出现,例如AchronixSemiconductor、MathStar等。且除了单纯数字逻辑性质的可程序逻辑装置外,混讯、模拟性质的可程序逻辑装置也展露头角,例CypressSemiconductorPSoC(ProgrammableSystem-on-Chip)即具有可组态性的混讯电路,或如Actel公司也提出可程序化的混讯芯片:Fusion,或者也有业者提出所谓的现场可程序化模拟数组(FieldProgrammableAnalogArray;FPAA)等,相信这些都能为可程序化芯片带来更多的发展动能。FPGA(现场可编程逻辑
10、器件)产品的应用领域已经从原来的通信扩展到消费电子、汽车电子、工业控制、测试测量等广泛的领域。而应用的变化也使FPGA产品近几年的演进趋势越来越明显:一方面,FPGA供应商致力于采用当前最先进的工艺来提升产品的性能,降低产品的成本;另一方面,越来越多的通用IP(知识产权)或客户定制IP被引入FPGA中,以满足客户产品快速上市的要求。此外,FPGA企业都在大力降低产品的功耗,满足业界越来越苛刻的低功耗需求。1.3 本文研究的意义 技术的发展 当今电子产品正向功能多元化,体积最小化,功耗最低化的方向发展。它与传统的电子产品在设计上的显著区别师大量使用大规模可编程逻辑器件使产品的性能提高体积缩小功耗
11、降低.同时广泛运用现代计算机技术提高产品的自动化程度和竞争力缩短研发周期。EDA技术正是为了适应现代电子技术的要求美国ALTERA公司的可编程逻辑器件采用全新的结构和先进的技术,加上MaxplusII(或最新的QUARTUS)开发环境更具有高性能开发周期短等特点,十分方便进行电子产品的开发和设计。 EDA技术技术以大规模可编程逻辑器件为设计载体以硬件描述语言为系统逻辑描述主要表达方式以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具通过有关的开发软件自动完成用软件的方式设计的电子系统到硬件系统的逻辑编译逻辑化简逻辑分割逻辑映射编程下载等工作。最终形成集成电子系统或专用集成芯片的一
12、门新技术。 本设计利用VHDL硬件描述语言结合可编程逻辑器件进行的并通过数码管动态显计时结果。数字钟可以由各种技术实现如单片机等.利用可编程逻辑器件具有其他方式没有的特点它具有易学方便新颖有趣直观设计与实验项目成功率高理论与实践结合紧密体积小容量大I/O口丰富易编程和加密等特点并且它还具有开放的界面丰富的设计库模块化的工具以及LPM定制等优良性能应用非常方便。因此本设计采用可编程逻辑器件实现。 1.1.2 课题研究的必要性 现在是一个知识爆炸的新时代。新产品、新技术层出不穷电子技术的发展更是日新月异。可以毫不夸张的说电子技术的应用无处不在电子技术正在不断地改变我们的生活改变着我们的世界。在这快
13、速发展的年代时间对人们来说是越来越宝贵在快节奏的生活时人们往往忘记了时间一旦遇到重要的事情而忘记了时间这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人。数字化的钟表给人们带来了极大的方便。近些年随着科技的发展和社会的进步,人们对数字钟的要求也越来越高传统的时钟已不能满足人们的需求。1.4 课题研究的内容 本设计通过FPGA目标板实现数字跑表的功能,FPGA芯片为cyclong II 系列EP2C8Q208 ,外接50M晶振,采用七段数码管显示,在本设计中才用共阳的数码管。因为采用的是50MHz晶振,因此分频是是整数分频,因此能提供精确的始终。还有按键控制,此设计还有一个特点就是
14、只有管脚定以后就能在相应的FPGA板子上面跑起来,而很多在网上下载的代码总是缺少部分程序,不能直接在板子上面运行。第二章 数字时钟的基本理论2.1 主程序结构和流程本设计通过FPGA目标板实现数字跑表的功能,FPGA芯片为cyclong II 系列EP2C8Q208 ,外接50M晶振,采用七段数码管显示,在本设计中才用共阳的数码管。因为采用的是50MHz晶振,因此分频是是整数分频,因此能提供精确的始终。还有按键控制,此设计还有一个特点就是只有管脚定以后就能在相应的FPGA板子上面跑起来,而很多在网上下载的代码总是缺少部分程序,不能直接在板子上面运行。2.2 设计原理2.2.1 原理图介绍此图为
15、本次设计的分装图,从图中可以看出输入输出引脚,方便与管脚的定义,只需要将所对应的引脚与目标板连接,然后将后面所附带的代码复制到软件中就可以实现数字跑表的功能,此设计中用到的元件有电阻,共阳数码管,因此在在下载程序之前一定确保数码管极性相同,否在会出现乱码。开关,三极管,还有FPGA芯片,在这次设计中用到的是EP2C8Q8208,芯片。其中的FPGA的芯片只画出了用到的几个引脚其他的没有画出来。其中的三极管起到电流放大的作用。数码管为七段共阴极数码管。2.2.2 Atium Designer6.9介绍虽然现在网上已经有了很多关于AltiumDesigner的文章了但是在此我还是详谈一些自己在实际
16、应用中遇到是一些常见的问题此软件较protel99se相比更加人性化,与鼠标的联系更加紧密,如按住滚轮移动鼠标进行缩放(比网上提供的pageup、pagedown更加方便)、按住右键可以挪动图纸、ctrl+鼠标左键拖动连线会跟着延长等。这些与protel99se中纯键盘操作相比有了更大的便捷性。Altiumdesigner中3D效果比DXP2004和protel99效果好很多,制作封装库文件时可以同时画好3D,非常方便。三地效果(快捷键为3)的支持使我们更加明了所画板的实物状态,根据对三地效果板的观察,可以让我们及时调整一些摆放不当的元器件。全局修改在画板过程中是必须掌握的一个关键技能,我们在
17、这里举例说明一下这个问题,让大家能有一个清晰的认识,如将电阻单击右键选择findsimilarobjects,将会弹出一个对话框在partcomment中找到samecurrentfootprint一项,在其对应的选项框中选择same,再在对话框左下角的位置上选上selectmatching,最后点击ok按钮。 2.2.3 Verilog HDL介绍Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Ve
18、rilog HDL和VHDL是目前世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。Verilog HDL就是在用途最广泛的C语言的基础上发展起来的一种硬件描述语言,它是由GDA(Gateway Design Automation)公司的PhilMoorby在1983年末首创的,最初只设计了一个仿真与验证工具,之后又陆续开发了相关的故障模拟与时序分析工具。1985年Moorby推出它的第三个商用仿真器Verilog-XL,获得了巨大的成
19、功,从而使得Verilog HDL迅速得到推广应用。1989年CADENCE公司收购了GDA公司,使得VerilogHDL成为了该公司的独家专利。1990年CADENCE公司公开发表了Verilog HDL,并成立LVI组织以促进Verilog HDL成为IEEE标准,即IEEE Standard 1364-1995. Verilog HDL的最大特点就是易学易用,如果有C语言的编程经验,可以在一个较短的时间内很快的学习和掌握,因而可以把Verilog HDL内容安排在与ASIC设计等相关课程内部进行讲授,由于HDL语言本身是专门面向硬件与系统设计的,这样的安排可以使学习者同时获得设计实际电路
20、的经验。与之相比,VHDL的学习要困难一些。但Verilog HDL较自由的语法,也容易造成初学者犯一些错误,这一点要注意。2.2.4 分析计算在本设计中采用的是50MHz的时钟,因此最低位的是十毫秒位,在设计中设计了一个19位的计数器,用来对时钟进行计数,当时钟记到500000时为10个毫秒,因此最低位进一,然后计数器清零,而最低位变为一,这样当有九个时钟来时,又向前进位继续计数,依次进位这样就可以实现数字时钟的计数器。第3章 数字时钟软件设计3.1开发软件介绍 Quartus® II是最高级和复杂的,用于system-on-a-programmable-chip (SOPC)的设计环
21、境。 QuartusII design 提供完善的 timing closure 和 LogicLock 基于块的设计流程。QuartusII design是唯一一个包括以timing closure 和 基于块的设计流为基本特征的programmable logic device (PLD)的软件。 Quartus II 设计软件改进了性能、提升了功能性、解决了潜在的设计延迟等,在工业领域率先提供FPGA与mask-programmed devices开发的统一工作流程。Altera Quartus II 作为一种可编程逻辑的设计环境, 由于其强大的设计能力和直观易用的接口,越来越受到数字系
22、统设计者的欢迎。Altera Quartus II (3.0和更高版本)设计软件是业界唯一提供FPGA和固定功能HardCopy器件统一设计流程的设计工具。工程师使用同样的低价位工具对 Stratix FPGA进行功能验证和原型设计,又可以设计HardCopy Stratix器件用于批量成品。系统设计者现在能够用Quartus II软件评估HardCopy Stratix器件的性能和功耗,相应地进行最大吞吐量设计。Altera的Quartus II可编程逻辑软件属于第四代PLD开发平台。该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。Quartus平台与Cad
23、ence、ExemplarLogic、 MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。改进了软件的LogicLock模块设计功能,增添 了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。5.0版以上支持双核CPU的嵌入。目前最高版本为11.1 Altera 公司每出一个新版本都会缩短其编译速度。因为它的编译速度实在是很慢。3.2 代码生成BDF图 图为本次设计的分装图,从图中可以看出输入输出引脚,方便与管脚的定义,只需要将所对应的引脚与目标板连接,然后将后面所附带的代码复制到软件中就可以实现数字跑表的功能,此设计中用到的元件
24、有电阻,共阳数码管,因此在在下载程序之前一定确保数码管极性相同,否在会出现乱码。开关,三极管,还有FPGA芯片,在这次设计中用到的是EP2C8Q8208,芯片。第四章 单元电路设计4.1 分频电路设计代码always (posedge clk or negedge rst_n)begin if(!rst_n) begin cnt_div= 19b0; cn1=0; end else if(cnt_div=19h7A120)begin cnt_div=19b0; cn1=1; end else begin cnt_div=cnt+1b1; cn1=0; end end4.2 毫秒电路实现代码al
25、ways (posedge cn1 or negedge rst_n)begin if(!rst_n)beginsll=4d0;shl=4d0;cn2=0;endelse if(!pause)begin if(sll=4d9)begin sll=4d0; if(shl=4d9)begin cn2=1; shl=4d0; end else shl=shl+1b1; end else begin sll=sll+1b1; cn2=0; end end end4.3秒电路设计代码always (posedge cn2 or negedge rst_n)begin if(!rst_n)beginsl=
26、3d0;sh=3d0;cn3=0;endelse if(sl=4d5)begin sl=4d0; if(sh=4d5)begin cn3=1; sh=4d0; end else sh=sh+1b1; end else begin sl=sl+1b1; cn3=0; end end4.4 分钟实现代码always (posedge cn3 or negedge rst_n)begin if(!rst_n)beginsml=4d0;smh=4d0;endelse if(sml=4d5)begin sml=4d0; if(smh=3d5)begin smh=3d0; end else smh=smh
27、+1b1; end else begin sml=sml+1b1; endend4.5 复位电路代码设计always (posedge clk or negedge rst_n)begin if(!rst_n) cnt_scan=0;else cnt_scan=cnt_scan +1b1;endalways (posedge clk or negedge rst_n) if(!rst_n) cnt = 20d0; else if(key_an) cnt = 20d0; else cnt = cnt + 1b1;always (posedge clk or negedge rst_n) if(!
28、rst_n) low_sw_r = 3b111; else low_sw_r = low_sw;wire 2:0 led_ctrl;assign led_ctrl = low_sw_r2:0 & (low_sw2:0);4.6 键盘代码设计always (posedge clk or negedge rst_n) if(!rst_n) key_rst = 3b111; else key_rst =sw1_n,sw2_n,sw3_n; /-相当于是延时-reg 2:0 key_rst_r;always (posedge clk or negedge rst_n) if(!rst_n) key_r
29、st_r = 3b111; else key_rst_r = key_rst; wire 2:0 key_an = key_rst_r & (key_rst);4.7 数码管显示代码设计4.7.1 位码显示设计always (sm_bit)begin case(sm_bit) 8b1111_1110: dataout_buf=smh;8b1111_1101: dataout_buf=sml;8b1111_1011: dataout_buf=sh;8b1111_0111: dataout_buf=sl;8b1110_1111: dataout_buf=shl;8b1101_1111: datao
30、ut_buf=sll;8b1011_1111: dataout_buf=3ha;8b0111_1111: dataout_buf=3ha;default: dataout_buf=0; endcase end4.7.2段码显示设计always (dataout_buf)begin case(dataout_buf) 4h0: sm_seg= 7hc0; 4h1 : sm_seg= 7hf9; 4h2 : sm_seg= 7ha4; 4h3 : sm_seg= 7hb0; 4h4 : sm_seg= 7h99; 4h5 : sm_seg= 7h92; 4h7 : sm_seg= 7hf8; 4h
31、8 : sm_seg= 7h80; 4h6 : sm_seg= 7h82; 4h9 : sm_seg= 7h90; 4ha :sm_seg= 7h00;endcaseend结论我觉得对我来说,最大的收获可能就是编写程序。 我们写的程序一定要有可读性,因此这就要求我们养成良好加备注的习惯,更加便于交流和保存,还有就是以前总感觉语言学完了就会了,可是真正的遇到一个项目的时候,感觉无从下手,根本不知道该怎么编程序,看做好的实力吧,两三百条的代码,根本没办法看下去,因为他的设计思路跟我们的思路不一样,因此只有自己慢慢的一点点的编程序,在这里我还要说的一点就是我自己觉得不管你的编程水平有多高,我们都得编
32、个模块验证一个,有错赶紧解决,不然等到代码边到了两三百条,眼看着代码也编完了,可是运行时错误百出,根本没办法改动,自己也失去了在此改动的信心,总觉得额可能自己的当时的思路就有问题,从而放弃了改动。也许这些错误都是编的时候的小错误,如果当时就养成编一个模块验证一个模块的话就不会出现这种情况了,自己编的程序肯定能按照自己的意愿来运行,本人就是没有一个一个的验证,从而等到全部代码完毕的时候才发现,错误竟然好几十条,根本没办法改动,这里改一处,那里又出现一处,改着改着自己也失去了信心,后来我就是编一段代码就验证一次,从而将这些代码全部的编写完毕,最后全编译的时候也没出现问题。 同时也体会到了原来看似简
33、单的设计,甚至感觉很简答的东西,当自己动手去做的时候才发现,原来并不是自己想象中的那么简单,自己认为正确的代码编译的时候就已经出现了错误,等自己调试好了,问题又出现了,在硬件上它不工作,或者不按照自己想的那么工作,因此,我们必须的细心地同时要对自己的设计的每一个细节都要有清楚的认识和理解,而不是似是而非的想法做,这样很容易走入误区,还没办法发现错误,因此在设计前一定要对自己的设计有很清楚的认识。参考文献1Verilog HDL数字设计教程 贺敬凯编著 西安电子科技大学出版社 2010 2Verilog HDL综合实用教程 J. Bhasker著 清华大学出版社 2004 3Verilog HD
34、L数字系统设计及实践 刘睿强, 童贞理, 尹洪剑编著 电子工业出版社 2011 4Verilog HDL与数字ASIC设计基础 罗杰主编 华中科技大学出版社 2008 5Verilog HDL程序设计与实践 云创工作室编著 人民邮电出版社 2009 6Verilog HDL硬件描述语言 杜建国编著 国防工业出版社 2004 附录一 程序代码module pb(clk,rst_n,sm_seg,sm_bit,sw1_n,sw2_n,sw3_n);input clk; /时钟输入端口input rst_n; /复位多口input sw1_n,sw2_n,sw3_n; /按键output 7:0 s
35、m_seg; /数码管段码output 7:0 sm_bit; /数码管位码/output pause,stop,start; /暂停 停止 开始三个按键/reg pause,stop,start;reg 7:0 sm_bit; /数码管位码寄存器reg 7:0 sm_seg; /数码管段码寄存器reg 15:0 cnt_scan; /分频计数器reg 3:0 dataout_buf; /按键寄存器reg 18:0 cnt_div; /分频计数器reg cn1,cn2,cn3; /进位标志reg 3:0 shl,sll,sh,sl,smh,sml; /分秒毫秒高位和低位/-分频计数器-alwa
36、ys (posedge clk or negedge rst_n)begin if(!rst_n) begin cnt_div= 19b0; cn1=0; end else if(cnt_div=19h7A120)begin cnt_div=19b0; cn1=1; end else begin cnt_div=cnt+1b1; cn1=0; endend/-毫秒计数器-always (posedge cn1 or negedge rst_n)begin if(!rst_n)beginsll=4d0;shl=4d0;cn2=0;endelse if(!pause)begin if(sll=4d
37、9)begin sll=4d0; if(shl=4d9)begin cn2=1; shl=4d0; end else shl=shl+1b1; end else begin sll=sll+1b1; cn2=0; endendend/-秒计数器-always (posedge cn2 or negedge rst_n)begin if(!rst_n)beginsl=3d0;sh=3d0;cn3=0;endelse if(sl=4d5)begin sl=4d0; if(sh=4d5)begin cn3=1; sh=4d0; end else sh=sh+1b1; end else begin s
38、l=sl+1b1; cn3=0; endend/-分钟计数器-always (posedge cn3 or negedge rst_n)begin if(!rst_n)beginsml=4d0;smh=4d0;endelse if(sml=4d5)begin sml=4d0; if(smh=3d5)begin smh=3d0; end else smh=smh+1b1; end else begin sml=sml+1b1; endend/-复位清计数器-always (posedge clk or negedge rst_n)begin if(!rst_n) cnt_scan=0;else
39、cnt_scan=cnt_scan +1b1;end/-数码管位码显示-always (cnt_scan)begincase(cnt_scan15:13) 3b000: sm_bit=8b1111_1110;3b001: sm_bit=8b1111_1101;3b010: sm_bit=8b1111_1011;3b011: sm_bit=8b1111_0111;3b100: sm_bit=8b1110_1111;3b101: sm_bit=8b1101_1111;3b110: sm_bit=8b1011_1111;3b111: sm_bit=8b0111_1111;default : sm_b
40、it=8b1111_1110; endcaseend/-数码管位码显示-always (sm_bit)begin case(sm_bit) 8b1111_1110: dataout_buf=smh;8b1111_1101: dataout_buf=sml;8b1111_1011: dataout_buf=sh;8b1111_0111: dataout_buf=sl;8b1110_1111: dataout_buf=shl;8b1101_1111: dataout_buf=sll;8b1011_1111: dataout_buf=3ha;8b0111_1111: dataout_buf=3ha;default: dataout_buf=0; endcase end/-数码管段码显示-always (dataout_buf)begin case(dataout_buf) 4h0: sm_seg= 7hc0; 4h1 : sm_seg= 7hf9; 4h2 : s