波形發(fā)生器廣泛應(yīng)用于電子電路,、自動(dòng)控制和科學(xué)試驗(yàn)領(lǐng)域,是一種為電子測(cè)量工作提供符合嚴(yán)格技術(shù)要求的電信號(hào)設(shè)備,,和示波器、電壓表,、頻率計(jì)等儀器一樣是最普通,、最基本也是應(yīng)用最為廣泛的電子儀器之一,幾乎所有電參量的測(cè)量都要用到波形發(fā)生器,。隨著通信,、雷達(dá)的不斷發(fā)展,對(duì)信號(hào)源的頻率穩(wěn)定度,、頻譜純度,、頻率范圍和輸出頻率的個(gè)數(shù)以及信號(hào)波形的形狀也提出越來(lái)越多的要求。不僅要求能產(chǎn)生正弦波,、方波等標(biāo)準(zhǔn)波形,,還能根據(jù)需要產(chǎn)生任意波形,且操作方便,,輸出波形質(zhì)量好,,輸出頻率范圍寬,,輸出頻率穩(wěn)定度、準(zhǔn)確度及分辨率高,,頻率轉(zhuǎn)換速度快且頻率轉(zhuǎn)換時(shí)輸出波形相位連續(xù)等,。可見(jiàn),,研究制作高性能的任意波形發(fā)生器" title="任意波形發(fā)生器">任意波形發(fā)生器十分有必要,,而且意義重大。
1 任意波形發(fā)生器的FPGA" title="FPGA">FPGA實(shí)現(xiàn)
系統(tǒng)框架如圖1所示,,上位機(jī)產(chǎn)生任意波形數(shù)據(jù),,經(jīng)USB2.0控制器CY7C68013A與FPGA(現(xiàn)場(chǎng)可編程門陣列)相連。將數(shù)據(jù)下載到FPGA的RAM當(dāng)中,,再通過(guò)硬件電路依次從波形存儲(chǔ)器中讀取出來(lái),,經(jīng)D/A轉(zhuǎn)換及濾波后得到所需信號(hào)波形輸出。
關(guān)于DDS的基本原理與結(jié)構(gòu)在這里就不再加以闡述,,用FPGA按照DDS的基本原理和結(jié)構(gòu)設(shè)計(jì)和實(shí)現(xiàn)一個(gè)任意波形發(fā)生器,,所以DDS的幾個(gè)基本部分都是應(yīng)當(dāng)具備的。實(shí)現(xiàn)任意波形發(fā)生的關(guān)鍵在于把存放波形量化表的ROM換成了可以改寫的RAM,,這樣通過(guò)與RAM的接口可以改變存放在波形RAM中的數(shù)據(jù)從而實(shí)現(xiàn)任意波形發(fā)生,。這里主要介紹控制部分、相位累加器,、波形RAM幾個(gè)模塊來(lái)敘述任意波形發(fā)生器的實(shí)現(xiàn),。
1.1 控制部分
這個(gè)部分主要是要解決DDS模塊與單片機(jī)的接口問(wèn)題。在FPGA的實(shí)現(xiàn)中,,主要設(shè)計(jì)了2個(gè)模塊,,一個(gè)是輸入寄存器模塊,為了接收單片機(jī)寫入的頻率控制字,。另外一個(gè)是地址分配模塊,,這樣單片機(jī)就可以通過(guò)不同的地址來(lái)選通FPGA各個(gè)模塊工作。設(shè)計(jì)中DDS采用了32位的相位累加器,。這樣對(duì)于一個(gè)頻率控制字,,單片機(jī)要分4次分別寫入4個(gè)字節(jié);基于這樣的要求,,設(shè)計(jì)了輸入寄存器模塊如圖2,,這個(gè)部分主要是要解決DDS模塊與單片機(jī)的接口問(wèn)題。
din[7..0]是該模塊與單片機(jī)數(shù)據(jù)線的接口,,clr是低電平異步清零,,en是高電平使能,elk為數(shù)據(jù)寫入時(shí)鐘,,dout[31..O]是寄存器輸出的32位頻率控制字,。該模塊工作過(guò)程為:當(dāng)en為高電平,,clr也為高電平時(shí),elk的上升沿將輸入的8位數(shù)據(jù)鎖存進(jìn)該模塊中,,當(dāng)鎖存完4個(gè)字節(jié)的數(shù)據(jù)后,,自動(dòng)將該4個(gè)字節(jié)的數(shù)據(jù)按照先寫入的在高位的順序組合成一個(gè)32 bit的數(shù)據(jù)輸出到dout[31..0]。
該模塊的功能仿真圖如圖3所示,,看到當(dāng)clr=‘1’并且en=‘1’時(shí),,經(jīng)過(guò)4個(gè)時(shí)鐘,dout上將前4個(gè)時(shí)鐘的值‘00’,、‘01’,、‘02’、‘03’組成32位的‘00010203’數(shù)值輸出在dout上,。
關(guān)鍵字:FPGA 任意波形發(fā)生器
地址分配模塊采用一個(gè)3/8譯碼器來(lái)實(shí)現(xiàn)地址選通的功能,,如圖4所示。
由于累加器的清零是當(dāng)“clr”=1的時(shí)候,,所以在與門后加一個(gè)反相器,,而頻率寄存器清零的條件是“clr”=0,所以,,就可以直接與門后相連即可,。3/8譯碼器的使能端接VCC,G2AN和G2BN連起來(lái)接CS,,作為整個(gè)任意波形發(fā)生器模塊的片選信號(hào),,當(dāng)?shù)碗娖降臅r(shí)候選中,各模塊才開(kāi)始工作,。
地址鎖存模塊主要解決單片機(jī)P0口的分時(shí)復(fù)用問(wèn)題,。本設(shè)計(jì)選用的單片機(jī)為51系列單片機(jī),其PO口既作為數(shù)據(jù)口,,又作為地址總線的低8位,,因此在使用時(shí),需要將地址信號(hào)從分時(shí)復(fù)用的地址/數(shù)據(jù)總線中分離出來(lái),。本設(shè)計(jì)選用8D鎖存器7415373來(lái)作為地址鎖存器,。當(dāng)74LS373用作為地址鎖存器時(shí),,應(yīng)使OEN為低電平導(dǎo)通輸出,,此時(shí),鎖存使能端G為高電平時(shí),,輸出Q1~Q8狀態(tài)與輸入D1~D8狀態(tài)相同,;當(dāng)G發(fā)生負(fù)跳變時(shí),輸入端數(shù)據(jù)D1~D8鎖入Q1~Q8,。因此在使用74LS373時(shí),,51單片機(jī)的ALE信號(hào)可以直接與74LS373的G相連,。
1.2 相位累加器設(shè)計(jì)
相位累加器用于對(duì)輸入頻率控制字進(jìn)行累加運(yùn)算,輸入頻率控制字決定輸出信號(hào)的頻率和頻率分辨率,。因此相位累加器是整個(gè)DDS性能的關(guān)鍵部分,。傳統(tǒng)的相位累加器是用1個(gè)加法器加1個(gè)D觸發(fā)器組成,調(diào)用其中的1個(gè)宏模塊設(shè)置成32位數(shù)據(jù)相加,,再加另一個(gè)32位的宏模塊,,就可以組成相位累加器。它在QuartusII軟件中的最高編譯頻率只有262.12 MHz,,顯然不能滿足設(shè)計(jì)要求,。其時(shí)序仿真如圖5所示。
通過(guò)仿真,,當(dāng)直接采用32 bit累加器的時(shí)候系統(tǒng)時(shí)鐘最大只能達(dá)到大約25 MHz,,顯然是達(dá)不到要求的。從設(shè)計(jì)上看,,它實(shí)質(zhì)上是一個(gè)帶反饋的32位加法器,,把輸出數(shù)據(jù)作為另一路輸入數(shù)據(jù)和從單片機(jī)傳來(lái)的頻率控制連續(xù)相加,產(chǎn)生有規(guī)律的32位相位地址碼,。一般位數(shù)小的累加器可以通過(guò)FPGA中的進(jìn)位鏈得到快速高效的電路,,但是進(jìn)位鏈必須位于臨近的LE(邏輯單元)或LAB(邏輯陣列塊)中,長(zhǎng)的進(jìn)位鏈會(huì)減少供其他邏輯使用的布線資源,,同時(shí)過(guò)長(zhǎng)的進(jìn)位鏈也會(huì)制約系統(tǒng)頻率的提高,,所以進(jìn)位鏈不能太長(zhǎng)。因此,,在相位累加器的設(shè)計(jì)中,,要解決的難題是設(shè)法提高工作速度。為了解決速度難題,,需從兩個(gè)方面進(jìn)行改進(jìn),。
1.2.1 改進(jìn)的流水線結(jié)構(gòu)
在時(shí)序電路設(shè)計(jì)中為了提高速度,流水線結(jié)構(gòu)是一種常用的設(shè)計(jì)方法,。對(duì)于累加器來(lái)講,,流水線結(jié)構(gòu)就是把一個(gè)位數(shù)很長(zhǎng)的加法拆分成N個(gè)位數(shù)較短的加法,在N個(gè)時(shí)鐘周期內(nèi)做完然后輸出運(yùn)算結(jié)果,,N就是流水線的級(jí)數(shù),。采用流水結(jié)構(gòu)以后由于加法器的字長(zhǎng)變短了,對(duì)于FPGA來(lái)講加法器字長(zhǎng)變短對(duì)工作頻率的提高是相當(dāng)可觀的,。當(dāng)然,,流水結(jié)構(gòu)的使用并不能無(wú)限制地提高電路的工作速度。因此對(duì)于不同的器件來(lái)說(shuō),,采用多少級(jí)流水對(duì)性能的提升比較大這個(gè)要經(jīng)過(guò)仿真實(shí)驗(yàn)才能得到一個(gè)比較肯定的值,。
本文運(yùn)用流水線結(jié)構(gòu)對(duì)相位累加器進(jìn)行設(shè)計(jì),,當(dāng)m=8、n=4的情況下,,相位累加器的工作頻率是最高的,,達(dá)到了約70 MHz。但是為了進(jìn)一步提高工作頻率,,還需要結(jié)合下面的并行進(jìn)位方法,。
1.2.2 并行進(jìn)位加法器
DDS累加器電路的設(shè)計(jì)采用了流水線結(jié)構(gòu),由8級(jí)4位加法器完成對(duì)32位控制字的累加,。32位累加器的結(jié)果在送入相位幅度變化電路時(shí),,進(jìn)行了高位截?cái)啵蝗「?2位數(shù)據(jù)進(jìn)行查表,。因而,,在8級(jí)的流水線結(jié)構(gòu)中,前5級(jí)4位加法器實(shí)際上只貢獻(xiàn)了進(jìn)位,,在設(shè)計(jì)時(shí),,前4級(jí)加法器采用了超前進(jìn)位鏈,而高位加法器不僅要給出進(jìn)位值,,還要獲得加法的結(jié)果,,因此采用了QuartusII自帶的宏模塊結(jié)構(gòu)。通過(guò)每一位的Pi,、Gi和Ci-1值很容易求得該位進(jìn)位值Ci,。再與該位的和(Ai+Bi)相異或就得到最后的結(jié)果Si。即
采用上述結(jié)構(gòu),,極大地提高了累加器的工作速度,,其功能仿真圖如圖6所示,從圖中可以看出,,此4 bit超前進(jìn)位加法器完全滿足4位全加器的邏輯功能,。
關(guān)鍵字:FPGA 任意波形發(fā)生器
下面就將前5級(jí)采用超前進(jìn)位加法器的32位累加器和宏模塊中調(diào)用的4位全加器組成的32位相位累加器性能進(jìn)行比較。
普通流水線累加器的模塊是由4位D觸發(fā)器,,5位D觸發(fā)器和4位全加器作為基本元件,,采用原理圖輸入的方法設(shè)計(jì)FPGA的流水線累加器。該模塊的設(shè)計(jì)參照流水線累加器結(jié)構(gòu)進(jìn)行,,不同之處在于:由于相位累加器只用高位尋址,,所以低位上為了和高位結(jié)果同時(shí)輸出而做延時(shí)作用的D觸發(fā)器件均被去掉了。這樣做的結(jié)果是,,相位累加器輸出的低20位會(huì)因?yàn)樘崆拜敵龆靵y,,但是由于高12位的輸出一定是正確的,,這樣做既節(jié)省了資源,,對(duì)結(jié)果又沒(méi)有任何影響,。仿真結(jié)果證明假如不用流水線結(jié)構(gòu),32 bit相位累加器工作頻率最高達(dá)到約25 MHz,。消耗的資源是82個(gè)LEs,,而用了8級(jí)流水線結(jié)構(gòu)后,編譯工作頻率最高達(dá)到了約317.79 MHz,,資源消耗為186個(gè)LEs,。可見(jiàn)在資源上的消耗換來(lái)了在性能上的極大提高,。
流水線累加器的時(shí)序仿真如圖7所示:可以看出當(dāng)輸入數(shù)據(jù)確定后,,輸出結(jié)果要經(jīng)過(guò)8個(gè)時(shí)鐘周期的延時(shí)后輸出,這是因?yàn)椴捎昧?級(jí)流水結(jié)構(gòu),。采用多少級(jí)流水結(jié)構(gòu),,輸出就會(huì)延時(shí)多少個(gè)周期。同時(shí)也說(shuō)明,,對(duì)于輸入數(shù)據(jù)切換來(lái)說(shuō),,該系統(tǒng)會(huì)有8個(gè)時(shí)鐘周期的延時(shí),這是累加器采用流水線結(jié)構(gòu)所不可避免的后果,。事實(shí)上目前許多DDS專用芯片由于也采用流水線結(jié)構(gòu),,所以本身也存在這樣的問(wèn)題。由于8個(gè)時(shí)鐘周期的延時(shí)與系統(tǒng)時(shí)鐘相比,,實(shí)際上還是很小的,,在一般的應(yīng)用場(chǎng)合下也是可以接受的。由于輸出的低20位未用,,被省略了,,只用了輸出的高12位,所以仿真波形中只有高12位的輸出結(jié)果,。從輸出結(jié)果來(lái)看,,高12位的輸出值是沒(méi)有錯(cuò)誤的,與設(shè)計(jì)思想吻合,。
下面介紹超進(jìn)位流水線累加器的構(gòu)成,,比較流水線累加器內(nèi)部結(jié)構(gòu)圖和超前進(jìn)位加法器的32位相位累加器的結(jié)構(gòu)圖,可以看出兩個(gè)圖的區(qū)別,,經(jīng)過(guò)編譯以后的報(bào)告如圖8所示,,可以看出經(jīng)過(guò)改進(jìn)后,編譯的最大工作頻率提高到了336.7 MHz,。比單純的流水線累加器提高了將近20 MHz,。
圖9是其時(shí)序仿真圖,從圖上可以看出,其值完全和功能仿真一致,。
關(guān)鍵字:FPGA 任意波形發(fā)生器
1.3 雙口RAM設(shè)計(jì)
在設(shè)計(jì)波形存取電路時(shí),,首先應(yīng)確定波形RAM的深度和字長(zhǎng)。波形RAM的深度和字長(zhǎng)與很多因素有關(guān)系,。存儲(chǔ)器內(nèi)部存儲(chǔ)的是一個(gè)或N個(gè)整周期的標(biāo)準(zhǔn)波形數(shù)據(jù),,存儲(chǔ)器容量越大,存儲(chǔ)的被采樣波形點(diǎn)數(shù)就越多,,采樣效果就越好,。存儲(chǔ)器的讀取速度是產(chǎn)生高頻波形的重要保證,讀取速度必須滿足相位累加器的累加速度,,這樣才能保證直接數(shù)字合成過(guò)程的正常進(jìn)行,。同時(shí),為了保證整個(gè)速度的同步性,,選用一種同步RAM也是很必要的,。
首先要確定波形RAM的深度和字長(zhǎng),由于任意波形發(fā)生器設(shè)計(jì)中選擇的DAC的字長(zhǎng)是12位,,很明顯波形RAM的字長(zhǎng)也應(yīng)該是12位,;由于選擇的地址線位數(shù)為12位(即相位累加器輸出的高12位),尋址空間為4 K(4 096)個(gè)單元,,即RAM存儲(chǔ)空間應(yīng)為4 096x12 bit=49 152 bits,,由于本設(shè)計(jì)所選擇的FPGA內(nèi)部RAM最大可配置為119 808 bits,完全可以滿足49 152 bits的RAM空間設(shè)計(jì),。所以波形RAM設(shè)計(jì)為字長(zhǎng)12位,,地址線12位。針對(duì)任意波形發(fā)生器與普通DDS的不同,,波形RAM的設(shè)計(jì)主要要求RAM具有讀寫兩個(gè)端口,,這樣可以通過(guò)兩套地址系統(tǒng),方便地進(jìn)行RAM內(nèi)容更新,,即對(duì)RAM的寫操作,;波形幅度量化數(shù)據(jù)的輸出,即對(duì)RAM的讀操作,。結(jié)合ALTERA公司FPGA的特點(diǎn),,選擇了EP2C5F256C6這個(gè)芯片內(nèi)部的雙口RAM來(lái)實(shí)現(xiàn)這個(gè)功能,如圖10所示,。
芯片內(nèi)部的雙口RAM具有讀地址和寫地址兩組地址線,,數(shù)據(jù)線也分成了讀數(shù)據(jù)線和寫數(shù)據(jù)線兩組。這樣波形RAM的設(shè)計(jì)就非常簡(jiǎn)單了,,將寫數(shù)據(jù)線,、寫地址線和單片機(jī)的數(shù)據(jù)線、地址線相連,用單片機(jī)更新RAM中的數(shù)據(jù),;將讀地址線和讀數(shù)據(jù)線分別與相位累加器的輸出和DAC的數(shù)據(jù)輸入相連,,讀數(shù)據(jù)線上即輸出了波形幅度量化數(shù)據(jù)。
2 結(jié)束語(yǔ)
本文詳細(xì)闡述了產(chǎn)生任意波形數(shù)據(jù)和基于FPGA的硬件設(shè)計(jì)部分,,以QuartusⅡ8.O軟件平臺(tái)作為開(kāi)發(fā)工具,選用CycloneII" title="CycloneII">CycloneII系列的EP2C5-F256C6 FPGA芯片實(shí)現(xiàn)DDS結(jié)構(gòu)中的數(shù)字部分,,其中相位累加器是DDS的核心部件,,重點(diǎn)闡述了相位累加器部分的設(shè)計(jì),采用8級(jí)流水線結(jié)構(gòu)借助前5級(jí)的超前進(jìn)位模塊,,編譯的最高工作頻率,,由317.97 MHz提高到336.7 MHz,采用此種設(shè)計(jì)方法,,節(jié)約了成本,,縮短了開(kāi)發(fā)周期,具有可行性,。