??? 摘?要: 介紹了在FPGA芯片上實(shí)現(xiàn)數(shù)字頻率計(jì)" title="數(shù)字頻率計(jì)">數(shù)字頻率計(jì)的原理,。對(duì)各種硬件除法進(jìn)行了比較,,提出了高速串行" title="高速串行">高速串行BCD碼除法的硬件算法,,并將其應(yīng)用在頻率計(jì)設(shè)計(jì)中。
??? 關(guān)鍵詞: 頻率測(cè)量? 周期測(cè)量? FPGA? VHDL? 狀態(tài)機(jī)
?
??? 數(shù)字頻率計(jì)是計(jì)算機(jī),、通訊設(shè)備、音頻視頻等科研生產(chǎn)領(lǐng)域不可缺少的測(cè)量?jī)x器,。采用VDHL編程設(shè)計(jì)實(shí)現(xiàn)的數(shù)字頻率計(jì),,除被測(cè)信號(hào)的整形部分、鍵輸入部分和數(shù)碼顯示部分以外,,其余全部在一片F(xiàn)PGA芯片上實(shí)現(xiàn),,整個(gè)系統(tǒng)非常精簡(jiǎn),而且具有靈活的現(xiàn)場(chǎng)可更改性,。在不更改硬件電路的基礎(chǔ)上,,對(duì)系統(tǒng)進(jìn)行各種改進(jìn)還可以進(jìn)一步提高系統(tǒng)的性能。該數(shù)字頻率計(jì)具有高速,、精確,、可靠、抗干擾性強(qiáng)和現(xiàn)場(chǎng)可編程等優(yōu)點(diǎn),。
??? 在設(shè)計(jì)中,,所有頻段均采用直接測(cè)頻法對(duì)信號(hào)頻率進(jìn)行測(cè)量,克服了逼近式換擋速度慢的缺點(diǎn),;采用了門控" title="門控">門控信號(hào)和被測(cè)信號(hào)對(duì)計(jì)數(shù)器的使能端進(jìn)行雙重控制,,提高了測(cè)量的精確度;在運(yùn)算單元采用了高速串行BCD碼除法,,不僅提高了運(yùn)算速度,,而且減小了資源消耗。
1 系統(tǒng)結(jié)構(gòu)及基本設(shè)計(jì)原理
??? 以一個(gè)8位十進(jìn)制,、測(cè)量范圍為1Hz~100MHz的數(shù)字頻率計(jì)為例,,采用100MHz的標(biāo)準(zhǔn)頻率信號(hào),說明設(shè)計(jì)的基本原理及實(shí)現(xiàn),。設(shè)計(jì)的數(shù)字頻率計(jì)由測(cè)量頻率模塊,、計(jì)算模塊和譯碼模塊組成,如圖1所示。測(cè)頻模塊采用兩個(gè)十進(jìn)制計(jì)數(shù)器分別測(cè)出門控時(shí)間內(nèi)的標(biāo)準(zhǔn)信號(hào)和被測(cè)信號(hào)的周期數(shù)Ns和Nx,。計(jì)算模塊則根據(jù)公式Fx/Nx=Fs/Ns算出Fx,,通過譯碼即可得到被測(cè)信號(hào)頻率的7段數(shù)碼顯示。
?
??? 數(shù)字頻率計(jì)的設(shè)計(jì)原理實(shí)際上是測(cè)量單位時(shí)間內(nèi)的周期數(shù),。這種方法免去了實(shí)測(cè)以前的預(yù)測(cè),,同時(shí)節(jié)省了劃分頻段的時(shí)間,克服了原來高頻段采用測(cè)頻模式而低頻段采用測(cè)周期模式的測(cè)量方法存在換擋速度慢的缺點(diǎn),。
??? 為克服低頻段測(cè)量的不準(zhǔn)確問題,,采用門控信號(hào)和被測(cè)信號(hào)對(duì)計(jì)數(shù)器的使能信號(hào)進(jìn)行雙重控制,大大提高了準(zhǔn)確度,,如圖2所示,。
?
??? 當(dāng)門控信號(hào)為1時(shí),使能信號(hào)并不為1,,只有被測(cè)信號(hào)的上升沿到來時(shí),,使能端才開始發(fā)送有效信號(hào),兩個(gè)計(jì)數(shù)器同時(shí)開始計(jì)數(shù),。當(dāng)門控信號(hào)變?yōu)?時(shí),,使能信號(hào)并不是立即改變,而是當(dāng)被測(cè)信號(hào)的下一個(gè)上升沿到來時(shí)才變?yōu)?,,計(jì)數(shù)器停止計(jì)數(shù),。因此測(cè)量的誤差最多為一個(gè)標(biāo)準(zhǔn)時(shí)鐘周期" title="時(shí)鐘周期">時(shí)鐘周期。當(dāng)采用100MHz的信號(hào)作為標(biāo)準(zhǔn)信號(hào)時(shí),,誤差最大為0.01μs,。
2 高速串行BCD碼除法運(yùn)算原理
??? 利用FPGA實(shí)現(xiàn)二進(jìn)制除法運(yùn)算,一種方法是采用逼近法,,這種方法速度低,、準(zhǔn)確性不高。另一種方法是采取被除數(shù)與除數(shù)的倒數(shù)相乘的方法,,即將除數(shù)作為寄存器的地址,,其倒數(shù)的小數(shù)部分作為寄存器的內(nèi)容,通過一次寄存器尋址來計(jì)算除數(shù)的倒數(shù),。這種方法在一個(gè)時(shí)鐘周期內(nèi)即可完成一個(gè)完整的除法運(yùn)算,,雖然速度較高,但對(duì)于多字節(jié)除法運(yùn)算,,不僅程序復(fù)雜,,而且占用資源較多。根據(jù)頻率計(jì)的實(shí)際情況,,本設(shè)計(jì)采用串行除法運(yùn)算,,利用多個(gè)時(shí)鐘周期完成一個(gè)完整的除法運(yùn)算,,從而兼顧了頻率計(jì)對(duì)速度和資源兩方面的要求。
2.1 多位串行BCD碼減法原理
??? 在數(shù)字串行除法運(yùn)算中,,減法運(yùn)算是必不可少的部分,。數(shù)字串行BCD碼的減法運(yùn)算是將P位的BCD碼分為P個(gè)寬為4的二進(jìn)制數(shù),然后從低位開始相減,,在P個(gè)時(shí)鐘周期內(nèi)完成減法操作,。如果輸入的操作數(shù)位數(shù)為8,,那么串行BCD碼減法器可以在8個(gè)時(shí)鐘周期內(nèi)完成8位BCD碼減法運(yùn)算,。
??? 數(shù)字串行減法的控制也比較簡(jiǎn)單,1位BCD碼減法運(yùn)算完成,,進(jìn)行移位操作,,并且移位次數(shù)加1,然后通過采用start信號(hào)指示新計(jì)算周期,。當(dāng)移位次數(shù)為n時(shí),,輸出移位寄存器完成串/并轉(zhuǎn)換,輸出結(jié)果,。設(shè)計(jì)者可以根據(jù)實(shí)際情況,,通過選擇不同的n,提高設(shè)計(jì)的靈活性,。本設(shè)計(jì)選擇n=8,。
??? 該設(shè)計(jì)在提高速度的同時(shí),節(jié)省了資源,。實(shí)驗(yàn)證明,,采用100MHz的工作頻率" title="工作頻率">工作頻率,實(shí)現(xiàn)一個(gè)8位BCD碼串行減法運(yùn)算,,耗用的資源卻小于實(shí)現(xiàn)2位BCD碼并行減法運(yùn)算所耗用的資源,。
2.2? 多位串行BCD碼除法原理
??? 本設(shè)計(jì)采用循環(huán)式除法運(yùn)算,循環(huán)原理可以用下面的公式表示[1]:
??? ω[j+1]=rω[j]-dqj+1
式中,ω[j]為第j步的余數(shù),,ω[0]為被除數(shù),;d為除數(shù);qj+1為第j+1步所得的商,;r為與移位步長(zhǎng)有關(guān)的常數(shù),,在此取為16。
??? 除法運(yùn)算循環(huán)圖表如圖3所示,。
?
??? 循環(huán)步驟如下:
?? ?·將ω[j]左移四位,,構(gòu)成rω[j]。
??? ·通過多次BCD碼減法運(yùn)算,,求得部分商 qj+1,,得到部分余數(shù)。
??? ·部分余數(shù)、部分商移位,,準(zhǔn)備下次循環(huán),。
??? 高速串行BCD碼除法是建立在BCD碼減法運(yùn)算基礎(chǔ)上的循環(huán)運(yùn)算。用被除數(shù)減除數(shù)得到部分余數(shù)的BCD碼,,如果夠減,,則使商加1;否則,,余數(shù)和商同時(shí)左移四位,,并記錄移位的次數(shù)m,根據(jù)對(duì)有效位數(shù)的不同要求,,可以對(duì)m進(jìn)行賦值,,如果要求保留8位有效數(shù)字,則m=8,。
??? 在這種循環(huán)除法運(yùn)算中,,減少循環(huán)的次數(shù)是提高運(yùn)算速度比較有效的方法。在一般循環(huán)式除法運(yùn)算中,,是從低位開始進(jìn)行循環(huán)相減,,循環(huán)次數(shù)等于商。如果是8位除法運(yùn)行,,則得到一個(gè)8位的商,,要進(jìn)行8位次的BCD碼減法循環(huán),例如:56895230/8=7111903.8,,要進(jìn)行7111903.8次循環(huán),,計(jì)算的速度可想而知,。
??? 在本設(shè)計(jì)中借鑒了一般十進(jìn)制除法的運(yùn)算方法,,從高位開始相減,,大大減少了循環(huán)次數(shù),。下面以一個(gè)例子說明它的原理:
??? ·將被除數(shù)和除數(shù)移位,,使其第一位BCD碼不為0000,,并記錄移位的次數(shù)p(例如:56895230/80000000,,p=8),。
??? ·比較最高位的大小,,如果除數(shù)的最高位大于被除數(shù)的最高位,,則將除數(shù)右移4位,同時(shí)將p減1(即:56895230/08000000,且p=7),。
??? ·得到的數(shù)p為小數(shù)點(diǎn)的位置(p=7說明小數(shù)點(diǎn)的位置在第七位數(shù)后),。
??? ·循環(huán)相減。當(dāng)部分余數(shù)小于08000000,,再將部分余數(shù)左移四位,,繼續(xù)進(jìn)行相減,。循環(huán)m次后即可得到m個(gè)有效數(shù)字的結(jié)果,然后根據(jù)p可以確定小數(shù)點(diǎn)的位置,。
??? 使用這種方法計(jì)算一個(gè)8位數(shù)的除法運(yùn)算,,循環(huán)減法次數(shù)最大為80次,每次循環(huán)使用時(shí)間為8個(gè)時(shí)鐘周期,。如果工作頻率為100MHz,,則最長(zhǎng)的運(yùn)算時(shí)間為6.4μs,運(yùn)算速度大大提高,。
3 設(shè)計(jì)實(shí)現(xiàn)
??? 采用VHDL語(yǔ)言設(shè)計(jì)一個(gè)復(fù)雜的電路系統(tǒng),,運(yùn)用自頂向下的設(shè)計(jì)思想[2],將系統(tǒng)按功能逐層分割的層次化設(shè)計(jì)方法進(jìn)行設(shè)計(jì),。在頂層對(duì)內(nèi)部各功能塊的連接關(guān)系和對(duì)外的接口關(guān)系進(jìn)行了描述,,而功能塊的邏輯功能和具體實(shí)現(xiàn)形式則由下一層模塊來描述,。根據(jù)頻率計(jì)的系統(tǒng)原理框圖(圖1),,運(yùn)用自頂向下的設(shè)計(jì)思想,設(shè)計(jì)的系統(tǒng)頂層電路圖如圖4所示,。各功能模塊采用VHDL語(yǔ)言來描述,。
?
??? 在計(jì)數(shù)模塊中,通過譯碼完成的信號(hào)COMP和標(biāo)準(zhǔn)信號(hào)計(jì)數(shù)器的溢出信號(hào)ov2對(duì)門控信號(hào)CL進(jìn)行控制,??梢愿鶕?jù)不同的情況選擇門控信號(hào)的時(shí)間范圍,使設(shè)計(jì)具有一定的靈活性,。采用門控信號(hào)CL和被測(cè)信號(hào)BSN對(duì)兩個(gè)8位十進(jìn)制計(jì)數(shù)器進(jìn)行同步控制[3],。根據(jù)D觸發(fā)器的邊沿觸發(fā)的特點(diǎn),可以將輸入的門控信號(hào)CL作為D觸發(fā)器的輸入信號(hào),,而將被測(cè)信號(hào)BSN作為D觸發(fā)器的脈沖控制信號(hào),,使觸發(fā)器的輸出端只有在被測(cè)信號(hào)BSN上升沿時(shí)才發(fā)生變化,實(shí)現(xiàn)了對(duì)使能信號(hào)的雙重控制,。
??? 本設(shè)計(jì)比較重要的一部分是運(yùn)算單元,。由于在運(yùn)算單元中采用的是串行運(yùn)算,因此其工作頻率必須足夠高,。在FPGA中實(shí)現(xiàn)時(shí),,如何提高串行BCD碼除法運(yùn)算的速度是比較關(guān)鍵的問題。
??? BCD碼減法運(yùn)算采用行波進(jìn)位方法,,因此必須盡量減小進(jìn)位邏輯上的延遲,。ACEX 1K系列的每個(gè)LE中都提供了一個(gè)專用的進(jìn)位鏈和級(jí)聯(lián)鏈,充分利用這些資源可以提高多位串行BCD碼減法的性能,。根據(jù)ACEX1K系列周期約束,,其延時(shí)為:
??? Tclk=Tco+B+Tsu-(E-C)
??? 式中,,Tco為clock-output的延時(shí),Tsu為建立時(shí)間,,兩個(gè)時(shí)間均可達(dá)到1~2ns,;B表示數(shù)據(jù)延時(shí),為0.6ns;(E-C) 表示時(shí)鐘傾斜[4],。因此,,總時(shí)鐘延時(shí)為4.6ns,即工作頻率可以達(dá)到200MHz以上,。本文采用100MHz的工作頻率,,提高了運(yùn)算速度。為了減小延時(shí),、提高工作效率,,在對(duì)布局布線進(jìn)行精確控制以后,把BCD碼減法運(yùn)算做成模塊,,在除法運(yùn)算過程反復(fù)調(diào)用,,達(dá)到了模塊復(fù)用效果,大大提高了資源的利用率,。
??? 在整個(gè)BCD碼除法運(yùn)算單元,,首先通過輸入數(shù)據(jù)決定信號(hào)是否超出測(cè)量范圍。
??? ·當(dāng)ov1為1時(shí),,該信號(hào)的頻率大于1Hz,;
??? ·當(dāng)NS
??? ·當(dāng)NS>NX,,該信號(hào)頻率在測(cè)量范圍內(nèi),。
?? ?根據(jù)輸入的NS和NX計(jì)算輸入信號(hào)的頻率。
??? 除法運(yùn)算通過雙狀態(tài)機(jī)的設(shè)計(jì)控制一個(gè)BCD碼減法運(yùn)算,。所有狀態(tài)用同一時(shí)鐘進(jìn)行控制,,實(shí)現(xiàn)了系統(tǒng)的同步設(shè)計(jì),消除了異步邏輯中存在的種種險(xiǎn)象,。各個(gè)狀態(tài)之間的關(guān)系如圖5所示,。當(dāng)計(jì)數(shù)模塊完成計(jì)數(shù)時(shí),則將數(shù)輸入除法模塊,,開始移位以確定輸入的值,;然后發(fā)clrs信號(hào)到BCD碼減法運(yùn)算單元開始運(yùn)算,循環(huán)相減,。當(dāng)循環(huán)結(jié)束時(shí),,發(fā)回一個(gè)FINS信號(hào),,部分余數(shù)開始移位,進(jìn)行下一輪的循環(huán),。最終輸出FOUT,,即運(yùn)算單元結(jié)束。
?
??? 本頻率計(jì)設(shè)計(jì)采用8位的十進(jìn)制計(jì)數(shù)器,,隨后應(yīng)用狀態(tài)機(jī)實(shí)現(xiàn)了高速串行BCD碼除法運(yùn)算,,計(jì)算出頻率值。對(duì)BCD碼減法模塊的復(fù)用,,減小了資源的利用,。
??? 當(dāng)今VLSI的發(fā)展日新月異,F(xiàn)PGA的容量和速度成倍地增長(zhǎng),,而價(jià)格卻逐年下降,,這將使得基于FPGA設(shè)計(jì)的數(shù)字頻率計(jì)優(yōu)勢(shì)更加明顯。相信這一技術(shù)必將得到更加廣泛的應(yīng)用,。
參考文獻(xiàn)
1 Behrooz Parhami.Computer Arithmetic-Algorithms and hardware designs. New York: Oxford University Press, 2000
2 James R.Armstrong F.Gail Gray .VHDL設(shè)計(jì),、表示和綜合.北京:機(jī)械工業(yè)出版社,2003.3
3 候伯亨,顧 新.VHDL硬件描述語(yǔ)言與數(shù)字邏輯電路設(shè)計(jì).西安:西安電子科技大學(xué)出版社,,1999.1
4 ACEX 1K Programmable Logic Device Family Data Sheet.www.altera.com