- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
一种基于FPGA的数字秒表设计方法
摘要:文中介绍了一种基于FPGA的数字秒表设计方法。采用VHDL硬件描述语言,运用ModelSim等EDA仿真工具。该设计具有外围电路少、集成度高、可靠性强等优点。最后经实验验证,该数字秒表计时准确,输入信号能准确控制秒表运行。系统所采用的自上而下的模块化设计方法,对于其他复杂的系统设计也有很强的借鉴意义。
关键词:FPGA;数字秒表;模块化设计;VHDL
数字集成电路作为当今信息时代的基石,不仅在信息处理、工业控制等生产领域得到普及应用,并且在人们的日常生活中也是随处可见,极大的改变了人们的生活方式。面对如此巨大的市场,要求数字集成电路的设计周期尽可能短、实验成本尽可能低,最好能在实验室直接验证设计的准确性和可行性,因而出现了现场可编程逻辑门阵列FPGA。对于芯片设计而言,FPCA的易用性不仅使得设计更加简单、快捷,并且节省了反复流片验证的巨额成本。对于某些小批量应用的场合,甚至可以直接利用FPGA实现,无需再去订制专门的数字芯片。
文中着重介绍了一种基于FPGA利用VHDL硬件描述浯言的数字秒表设计方法,在设计过程中使用基于VHDL的EDA工具ModelSim对各个模块仿真验证,并给出了完整的源程序和仿真结果。
1 总体功能结构设计
一个完整的数字秒表应具有计时、相应的控制以及计时结果显示功能,总体的功能结构如图1所示。黑色线框内是计数模块、使能转化模块和显示译码模块,左边是输入控制信号,右边是显示计时结果的数码显示管,用六位BCD七段数码管显示读数,显示格式如图2,计时范围为:1小时,精度为0.01s。
输入时钟信号由32MHz的石英晶振提供,考虑到设计指标要求秒表精度为0.01秒,计数脉冲的时钟输入就应该是频率为100Hz的脉冲,所以先要设计一个320000分频器,分频器的输出可作计数器的输入;其次计数模块设计应综合考虑秒表的计时范围(1小时)和显示输出(6位输出),6位输出中有两位是六进制输出,其余四位是十进制输出,所以可通过设计4个模10计数器和2个模6计数器来实现,其中较低位的进位输出就是高位的计数输入端。
控制模块应包括开始计时/停止计时、复位两个按钮,即电路设计经常用到的使能端和清零端,这两个控制端口直接接到计数器的清零和史能端即可实现复位、开始计时/停止计时;但是外围使能输入需要经过使能转换电路后,才可变为计数器可用的使能控制信号。因此在输入使能信号和计数器使能输入之间需设计一个信号转换模块。
显示计数结果的模块实现较为简单,只需将六位计数结果通过七段译码电路接到输出即可点亮数码管,无需时序控制,直接用组合逻辑电路就可以实现。数码管显示可以采用扫描显示,用一个频率1KHz的信号扫描一个多路选择器,实现对六位已经锁存的计数结果的扫描输出。
2 各功能模块设计
2.1 分频器模块
分频器的功能是提供标准时钟控制信号以精确控制计数器的开闭,提供的标准信号是32MHz,根据设计精度0.01s的要求,输出信号是100Hz,所该分频器实现的功能是320000分频,具体的VHDL源程序:
2.2 计数模块
该计数器要实现最大计数值为59分59秒99的计数,而且为了数码管显示方便,该模块必须通过计数器的级联来实现,即首先分别设计一个模6计数器和一个模10计数器,然后将他们级联,其中调用4次模10计数器、2次模6计数器,这样可以比直接设计模100的计数器和模60的计数器节省资源。级联时低位的计数进位输出接高位的计数输入端,如图3所示。再考虑到控制模块的要求,每个计数器有三个输入端:时钟、使能和清零,两个输出端:计数输出和进位输出,采用同步使能异步清零的设计方法,每个计数器的使能和清零端都与外围的使能和清零端相联。
[p]
该模块的源程序以及ModelSim仿真输出结果如下:
模10计数器的VHDL源程序与模6计数器类似,为节省篇幅,不再给出。
2.3 使能信号转换模块
数字秒表输入的开始和停止信号是单个脉冲信号,而计数器要持续计数所需的使能信号是持续的高电平,所以需要通过使能控制电路实现使能信号的转换。该模块的VHDL源程序以及ModelSim仿真输出结果如下:
该模块源程序:
2.4 译码显示模块
由上面的设计可知,计数器输出为二进制码,不能直接点亮数码管,要想将计数结果通过数码管显示必须再设计一个七段译码电路,以便将计数结果输出。通过分析可知该译码器是一个4输入,7输出元件,其真值表如表1所示:
[p]
根据以上真值表可写出译码电路VHDL源程序如下:
3 功能验证以及下载实现
完成以上各个子模块的设计后,该数字秒表的模块设计就基本完成了,剩下的工作就是通过一个顶层文件将各个子模块连接起来。在顶层文件中可以将以上各个子模块看作一个个黑匣子,只将其输入输出端对应相连就可以了。下面是该顶层文件的VHDL源程序:
由于各个子模块都已经经过验证无误,并且顶层文件中不涉及复杂的时序关系,相当于只是将各个模块用导线连接起来,只要各个端口的连接对应正确即可,所以不需写专门的test bench进行验证。完成以上设计后,即可进行逻辑综合,综合无误后进行管脚适配,生成.bit文件然后下载到实验板上测试。经过反复多次测试,以上设计完全满足了预期的设计指标,开始/停止按键和清零按键都能准确的控制秒表的运行,七段显示数码管也能够准确的显示计时结果。通过与标准秒表对比,该设计的计时误差在0.03s以内,而这其中也包括实验板上品振由于长期使用所带来的误差。
4 结束语
本文所介绍数字秒表设计方法,采用了当下最流行的EDA设计手段。在Xinlinx FPGA开发环境下,采用至上而下的模块化设计方法,使得系统开发速度快、成本低、系统性能大幅度提升。通过实验验证,本文设计的数字秒表计时准确、性能稳定,可以很容易嵌入其他复杂的数字系统,充当计时模块。
利用EDA设计工具,结合基于FPGA的可编程实验板,轻松实现电子芯片的设计,现场观察实验结果,大大缩短了产品的设计周期和调试周期,提高了设计的可靠性和成功率,体现了逻辑器件在数字设计中优越性。
射频工程师养成培训教程套装,助您快速成为一名优秀射频工程师...
闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掑鏅悷婊冪箻楠炴垿濮€閵堝懐鐤€濡炪倖妫佸Λ鍕償婵犲洦鈷戠憸鐗堝笒娴滀即鏌涢悩鍐叉诞鐎规洘鍨块獮姗€骞囨担鐟板厞婵$偑鍊栭崝鎴﹀垂閸︻厾鐭堟い鏇楀亾婵﹥妞藉Λ鍐ㄢ槈濞嗘ɑ顥i梻浣呵归敃銈夆€﹂悜鐣屽祦闁硅揪绠戠粈瀣亜閹烘垵鈧骞婂┑鍡╂富闁靛牆妫涙晶顒傜棯閺夎法孝闁宠绉电换婵嬪炊閵娿垺瀚藉┑鐐存尰閸╁啴宕戦幘瀵哥濞达絽鍟垮ú锕傚疾椤掑嫮鍙撻柛銉e妿閳藉鏌i幒鎴犱粵闁靛洤瀚伴獮鎺楀箣濠垫劒鎮i梻浣芥閸熶即宕伴弽顓炶摕闁哄洢鍨归柋鍥ㄧ節閸偄濮堥弫鍫ユ⒒娴e懙褰掝敄閸愵喖绀夌€广儱顦闂佸憡娲﹂崹浼村礃閳ь剟姊洪棃娑掑悍濠碘€虫搐閳绘捇濡堕崱娆戠槇闂佸啿鐨濋崑鎾绘煕閺囥劌澧版い锔垮嵆濮婃椽宕崟顓犲姽缂傚倸绉崇欢姘舵偘椤斿槈鐔煎礂閻撳孩鐎梻浣告啞濞诧箓宕㈣ぐ鎺戠劦妞ゆ巻鍋撻柨鏇ㄤ簻椤繐煤椤忓懎浠梺鍝勵槹鐎笛傜昂濠碉紕鍋戦崐鏍垂閻㈡潌鍥偨缁嬭銉ッ归敐鍛棌婵炵鍔戦弻宥堫檨闁告挾鍠栭悰顕€宕橀纰辨綂闂侀潧鐗嗛幊搴g玻濞戞瑧绡€闁汇垽娼у瓭闁诲孩鍑归崢濂稿煝閹炬椿鏁婇柛鎾楀拑绱抽梻浣呵归張顒勬嚌妤e啫鐒垫い鎺戝濡垹绱掗鑲╁缂佹鍠栭崺鈧い鎺戝閳ь兛绶氬浠嬵敇閻愭鍚呴梻浣瑰濞插秹宕戦幘鍓佺<闁绘瑢鍋撻柛銊ョ埣瀵濡搁埡鍌氫簽闂佺ǹ鏈粙鎴︻敂閿燂拷 | More...
闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掑鏅悷婊冪箻楠炴垿濮€閵堝懐鐤€濡炪倖妫佸Λ鍕償婵犲洦鈷戠憸鐗堝笒娴滀即鏌涢悩鍐叉诞鐎规洘鍨块獮姗€骞囨担鐟板厞婵$偑鍊栭崝鎴﹀垂閸︻厾鐭堟い鏇楀亾婵﹥妞藉Λ鍐ㄢ槈濞嗘ɑ顥i梻浣呵归敃銈夆€﹂悜鐣屽祦闁硅揪绠戠粈瀣亜閹烘垵鈧骞婂┑鍡╂富闁靛牆妫涙晶顒傜棯閺夎法孝闁宠绉电换婵嬪炊閵娿垺瀚藉┑鐐存尰閸╁啴宕戦幘瀵哥濞达絽鍟垮ú锕傚疾椤掑嫮鍙撻柛銉e妿閳藉鏌i幒鎴犱粵闁靛洤瀚伴獮鎺楀箣濠垫劒鎮i梻浣芥閸熶即宕伴弽顓炶摕闁哄洢鍨归柋鍥ㄧ節閸偄濮堥弫鍫ユ⒒娴e懙褰掝敄閸愵喖绀夌€广儱顦闂佸憡娲﹂崹浼村礃閳ь剟姊洪棃娑辨Ф闁稿寒鍣e畷鎴﹀箻鐠囨彃鍞ㄥ銈嗗姉閸犲孩绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柟闂寸绾惧鏌i幇顒佹儓闁搞劌鍊块弻娑㈩敃閿濆棛顦ョ紓浣哄Т缂嶅﹪寮诲澶婁紶闁告洦鍓欏▍锝夋⒑缁嬭儻顫﹂柛鏃€鍨垮濠氭晲婢跺﹦鐤€闂傚倸鐗婄粙鎴﹀煕閹烘垟鏀介柣鎰皺婢ф梻绱掗鐣屾噰鐎殿喖顭锋俊鎼佸煛閸屾矮绨介梻浣呵归張顒傜矙閹达富鏁傞柨鐕傛嫹闂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸ゅ嫰鏌涢幘鑼妽闁稿繑绮撻弻娑㈩敃閿濆棛顦ラ梺姹囧€楅崑鎾舵崲濠靛顥堟繛鎴濆船閸擃參姊洪柅鐐茶嫰閸樻悂鏌i幒鐐差洭闁瑰箍鍨归埞鎴犫偓锝庝簽閸婄偤姊洪懖鈹e綊鎮樺顑芥瀺闁瑰墽绮埛鎺懨归敐鍛暈闁哥喓鍋炵换娑氭嫚瑜忛悾鐢碘偓瑙勬礃缁矂鍩ユ径鎰潊闁抽敮鍋撻柟绋垮暣濮婃椽宕ㄦ繝鍐槱闂佺ǹ绻戠粙鎾诲箲閵忋倕骞㈡繛鎴炵懅閸橆亪姊洪崜鎻掍簼缂佽鍟村畷宕囨喆閸曗晙绨婚棅顐㈡处閹搁箖骞楅悩鐫酣宕惰闊剚銇勯姀鈩冪妞ゃ垺顨嗛幏鍛村礈闊厾澶�
闂傚倸鍊搁崐鎼佸磹瀹勬噴褰掑炊椤掑鏅悷婊冪箻楠炴垿濮€閵堝懐鐤€濡炪倖妫佸Λ鍕償婵犲洦鈷戠憸鐗堝笒娴滀即鏌涢悩鍐叉诞鐎规洘鍨块獮姗€骞囨担鐟板厞婵$偑鍊栭崝鎴﹀垂閸︻厾鐭堟い鏇楀亾婵﹥妞藉Λ鍐ㄢ槈濞嗘ɑ顥i梻浣呵归敃銈夋倶濠靛鍋╅梺鍨儑闂勫嫮绱掔€n亞浠㈢€规挸妫濆铏圭磼濡搫顫嶅銈嗘⒐閻楁洖宓勫┑鐐叉▕娴滄繈鎮¢悢鍏肩厽闁哄倹瀵ч幉鎼佹煟椤撶偠瀚版い顓″劵椤﹁櫕銇勯妸銉уⅵ鐎殿噮鍋婇、姘跺焵椤掑嫮宓侀柟鐑橆殔缁秹鏌嶈閸撶喎顕i崘娴嬪牚闁割偆鍠撻崢鐢告⒑鐠団€崇仭婵犮垺枪椤e潡姊绘担铏瑰笡闁规悂绠栧畷浼村箛閺夎锕傛煕閺囥劌鐏遍柡浣稿暞閵囧嫰骞囬埡浣轰患缂備胶濮惧畷鐢垫閹惧瓨濯撮柣銈庡灠閸橈繝姊虹粙璺ㄧ闁挎洏鍨归锝嗙節濮橆厽娅滄繝銏e煐钃遍柡鍜冪秮濮婅櫣绱掑Ο鍝勵潔缂備椒鐒﹂幐鎶界嵁閹版澘绀冩い鏃囆掗幏娲⒑閼姐倕鏋戞繝銏∶嵄缂備焦菧娴滄粓鏌熺€涙ḿ绠ユ俊顖楀亾闂備胶绮笟妤呭闯閿濆宓侀悗锝庡枟閺呮繈鏌嶈閸撴稓鍒掔拠娴嬫闁靛繆妾ч幏濠氭⒑閸撴彃浜為柛鐘虫崌閸╁﹪寮撮姀锛勫幈婵犵數濮撮崐鍧楀矗閸曨剚鍙忓┑鐘插鐢盯鏌熷畡鐗堝殗闁圭厧缍婇悰顔芥償閹惧厖澹曟繝鐢靛Т濞诧箓鎮″☉銏$厱婵炴垵宕弸銈囩磼閻橀潧浠遍柡灞炬礋瀹曢亶寮撮悩鎻掝瀴缂傚倷鑳剁划顖滄崲閸繄鏆﹂柛顐f礃閸ゅ鏌涢…鎴濅簼闁绘繐绠撳濠氬磼濞嗘埈妲梺瑙勭ゴ閳ь剝绉ú顏呮櫇闁稿本鑹鹃崑宥夋⒑娴兼瑧鍒板璺烘喘瀹曟垿骞橀幇浣瑰兊濡炪倖鎸鹃崑娑㈠箺閻㈠憡鈷戦柛婵嗗濠€浼存煟閳哄﹤鐏﹂柣娑卞枛铻e〒姘煎灡鐎靛矂鏌i悩鍙夌┛鐎殿喗鎸荤粩鐔煎即閵忊檧鎷绘繛杈剧到閹诧繝骞嗛崼銉︾厽妞ゆ挾鍎愬Ο鈧Δ鐘靛仜缁绘﹢寮幘缁樻櫢闁跨噦鎷�
闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗霉閿濆牊顏犵紒鈧繝鍌楁斀闁绘ɑ褰冮埀顒€顕槐鎾愁潩鏉堛劌鏋戦梺鍝勫暙閻楀嫰鍩€椤戣法绐旂€殿喕绮欓、姗€鎮欓懠鍨涘亾閸喒鏀介柨娑樺娴犙呯磼椤曞懎鐏︾€殿噮鍋婇幃鈺冪磼濡攱瀚奸梻鍌欑贰閸嬪棝宕戝☉銏″殣妞ゆ牗绋掑▍鐘炽亜閺傛娼熷ù婊勭矋閵囧嫰骞樼捄杞版勃闂佺ǹ顑冮崕鎶藉焵椤掑喚娼愭繛鍙夌矒楠炲﹪骞樼拠鑼弨婵犮垼娉涜墝闁哄閰i弻鐔兼焽閿曗偓閺嬫稓绱掗幓鎺撳仴婵﹤顭峰畷鎺戔枎閹存繂顬夐梻浣筋嚃閸犳牠鎮ラ悡搴f殾闁圭増婢橀崡鎶芥煟韫囨凹鍤欑紓宥咃躬楠炲啫饪伴崼鐔风檮婵犮垼娉涢惌鍫ュ船閻㈠憡鈷戦悹鍥ㄥ絻閸よ京绱撳鍛棦鐎规洑鍗冲浠嬵敃閵堝嫮鐟濋梻浣告惈鐞氼偊宕曢弻銉﹀亗婵炲棗绶疯ぐ鎺撳亗閹艰揪绲鹃幉鐓庘攽閻愭潙姣嗛柛銉e妿閸橀潧顪冮妶鍡橆梿鐎规洜鏁哥划锝夊籍閳ь剟骞堥妸锔剧瘈闁告侗鍣禒鈺呮⒑閸涘﹦澧柣妤冨Т椤曪綁骞橀钘変簻闂佸憡绺块崕杈╁緤閸喒鏀介柨娑樺娴滃ジ鏌涙繝鍐ㄧ伌鐎规洜顢婇妵鎰板箳閹惧瓨鐝栨俊鐐€曠换鎰版偋閸曨垰鐒垫い鎴f硶椤︼箓鏌嶇拠鏌ュ弰妤犵偞锚閻g兘宕堕懜鏁屟冣攽閿涘嫬浜奸柛濠冪墵楠炴劖銈i崘銊х崶闁瑰吋鐣崝宥夊磻閻旇褰掓偂鎼达絾鎲奸梺鎶芥敱閸ㄥ潡寮诲☉妯锋婵鐗婇弫楣冩煟鎼达紕浠涢柣鐔叉櫊瀵顓奸崼顐n€囬梻浣告啞閹搁箖宕版惔顭戞晪闁挎繂妫涚弧鈧┑顔斤供閸樿棄鈻嶉姀銈嗏拺閻犳亽鍔屽▍鎰版煙閸戙倖瀚�
婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繐霉閸忓吋缍戦柛銊ュ€婚幉鎼佹偋閸繄鐟查梺绋匡工閻栧ジ寮诲☉銏╂晝闁绘ɑ褰冩慨搴ㄦ⒑濮瑰洤鈧宕戦幘鑸靛床婵犻潧顑嗛ˉ鍫熺箾閹存繂鑸归柛鎾插嵆濮婃椽宕ㄦ繝鍛棟缂傚倸绉撮敃顏堟偘椤曗偓瀵粙濡搁敂鍓ら梻浣告啞閹稿棝宕ラ柨瀣仸缂佺粯绻傞埢鎾诲垂椤斿彞鍝楅梻渚€娼ч悧濠囧箖閸屾凹鍤曞┑鐘崇閸嬪嫰鏌i幋鐏活亪寮搁崒鐐粹拺闁告稑锕ユ径鍕煕鐎n亜顏い銈呭€垮濠氬磼濞嗘埈妲梺纭咁嚋缁绘繂鐣峰ú顏勭妞ゆ棁鍋愰敍娑㈡⒑閻熸澘鈷旂紒顕呭灦閹繝鎮㈤悡搴n啇濠电儑缍嗛崜娆撳焵椤戞儳鈧洖鐜婚崸妤€绠涢柣妤€鐗忛崢闈涱渻閵堝棙顥嗛柛瀣姍瀹曟椽鏁愰崶锝呬壕閻熸瑥瀚粈鍐╃箾閼碱剙鏋涢柣娑卞枟閹棃濡搁敃鈧惂鍕節閵忥絾纭鹃柤娲诲灦閻涱噣骞掑Δ浣叉嫽婵炶揪绲挎灙闁诡喗鍨圭槐鎺撴媴鐟欏嫬鍞夐悗娈垮枟瑜板啴銈导鏉戦唶婵犻潧娲╃欢銏$節閻㈤潧孝闁挎洏鍊濋幃褎绻濋崶銊ヤ簵闂佸搫娲ㄩ崰鍡樼濠婂牊鐓欓柡澶婄仢椤f娊鏌熼鍨汗缂佽鲸甯¢幃鈺冪驳绾應鍋撻崸妤佺厸閻忕偛澧介埥澶嬨亜椤愶絿绠炴い銏★耿閹晠宕橀崣澶屽酱闂傚倸鍊峰ù鍥敋閺嶎厼绐楁繛鎴緛缂嶆牕顭跨捄铏圭伇缂佺姵妫冮弻锝夊籍閸屾艾浠橀梺缁樺姇閿曪箓骞夌粙娆惧悑闁搞儮鏅欑粭澶愭⒑閼姐倕鏋涢柛瀣工閵嗘帗绻濆顓犲帾闂佸壊鍋呯换鍌炲汲濞嗗繆鏀介柨娑樺濞呮洜绱掓潏銊ユ诞妞ゃ垺鐟︾缓鐣岀矙閸喖寮峰┑掳鍊楁慨鐑藉磻濞戔懞鍥敍濠靛牅绨烽梻鍌欑閹测剝绗熷Δ鍛獥婵°倐鍋撻柍璇茬Ч婵偓闁靛牆妫岄幏娲煟閻樺厖鑸柛鏂胯嫰閳诲秹骞囬悧鍫㈠幍闂佸憡鍨崐鏍偓姘炬嫹