<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 數控振蕩器的FPGA設計

數控振蕩器的FPGA設計

作者: 時(shí)間:2008-01-18 來(lái)源:網(wǎng)絡(luò ) 收藏

  摘 要在數字信號處理中有著(zhù)廣泛的應用。本文研究并實(shí)現了基于的流水線(xiàn)型。仿真和驗證結果表明,該方法較之法精度高,且結構簡(jiǎn)單、耗費資源少,非常易于。

  引言

  由于具有頻率精度高、轉換時(shí)間短、頻譜純度高以及頻率易編程等特點(diǎn), (NCO)被廣泛應用于軟件無(wú)線(xiàn)電數字上、下變頻以及各種頻率和數字調制解調系統中。

  NCO傳統的實(shí)現方法主要有查表法、多項式展開(kāi)法或近似法,但這些方法在速度、精度、資源方面難以兼顧。而采用來(lái)實(shí)現超函數時(shí),則無(wú)需使用乘法器,它只需要一個(gè)最小的(LUT),利用簡(jiǎn)單的移位和相加運算,即可產(chǎn)生高精度的正余弦波形,尤其適合于FPGA的實(shí)現。

  數控振蕩器原理

  NCO的目標是產(chǎn)生頻率可變的正、余弦波樣本,(n=0,1,2...)。式中,fLO為本地振蕩頻率, fS為輸入信號的采樣頻率。

  如圖1 所示,NCO主要包括3個(gè)模塊:

  1. 對輸入頻率控制字M不斷累加, 得到以該頻率字為步進(jìn)的數字相位。

  2. 相位相加器將相位寄存器中的數字相位與相位控制字相加, 得到偏移后的當前相位。

  設系統的時(shí)鐘頻率為fc,頻率控制字為M,相位寄存器位數為N,則數控振蕩器輸出信號頻率為。根據Nyquist抽樣定理,fs最大值為1/2fc,而在實(shí)際設計中,一般不應大于時(shí)鐘頻率的1/4。其頻率分辨率為,根據此式,在系統時(shí)鐘頻率不變的情況下, 相位寄存器位數N越大, 產(chǎn)生信號的頻率分辨率越高。

  

  

  圖1 數字控制振蕩器結構圖

  3. 函數發(fā)生模塊,對當前相位進(jìn)行對應幅度轉換后, 可以輸出任意函數的波形。

  函數發(fā)生模塊最直接的實(shí)現方法是只讀存儲器(ROM LUT)法,將正、余弦波形的抽樣存放在ROM中,并通過(guò)一個(gè)DAC周期地進(jìn)行輸出,從而產(chǎn)生輸出波形。如輸出信號幅度位數為a,相位地址位數n所需查找表的大小為a×2n。結合上文結論可知,頻率分辨率越高,所需要的ROM越大,和n為指數增長(cháng)關(guān)系??梢?jiàn),ROM LUT法很難兼顧功耗、性能、成本三方面, 而的應用能夠很好地解決這一問(wèn)題。

  CORDIC算法原理

  CORDIC(坐標旋轉數字計算機)算法是Jack Volder于1959年提出的,主要用于計算三角函數,雙曲函數及其他的一些基本函數。J.Walther于1971年提出了統一的CORDIC形式。該算法的具體原理如下:如圖2所示,初始向量a(x0,y0) (注意y0=0)經(jīng)n次旋轉后得到向量b(xN,yN)qi。設第i次旋轉的角度為qi,根據J.Walther的推導得到迭代方程組:

  (1)

  且累積后最終結果為

  (2)

  通過(guò)選擇tan(qi)=±2-i可以得到,x和y的方程現在可以利用一個(gè)簡(jiǎn)單的管狀移位器和一個(gè)算術(shù)邏輯單元(ALU)來(lái)實(shí)現。此外,只需要使用一個(gè)相對簡(jiǎn)單的、事先計算好的反正切表,即可消除超函數的計算。

  

  

  圖2 CORDIC 算法原理示意圖

  同時(shí)還要判斷旋轉的方向,以滿(mǎn)足Z變量由初始值逐步趨于零,需要通過(guò)下式來(lái)引入和估計一個(gè)簡(jiǎn)單的符號變量d:di=sgn(zi)。 (3)

  經(jīng)過(guò)上面2步,得到如下迭代方程:

  (4)

  最后確定初始條件

  (5)

  則當N→ 時(shí),迭代后結果為:(xi,yi)→(cos(q),sin(q))。

  綜合以上推導可見(jiàn),只要選取合適的N,計算出相應的初始值(x0,y0),以及相對應的反正切值,就可以利用簡(jiǎn)單的移位加法操作和流水線(xiàn)結構實(shí)現上述的迭代方程式,計算出已知角度Z的正、余弦值,且這樣的電路結構非常易于。

  應用MATLAB進(jìn)行功能仿真和參數設計

  FPGA設計流程中,應先利用MATLAB進(jìn)行功能仿真,按照系統要求,以先驗的方式確定系統參數,測試系統性能是非常必要的,可以有效提高FPGA硬件設計的效率和電路質(zhì)量,避免不必要的重復勞動(dòng)。

  本系統采用40M的晶振,要求輸出9.7M的正、余弦波,輸出幅值為18位二進(jìn)制數。在實(shí)際系統中,由于有限的相位字長(cháng)和有限的量化電平,相位和量化誤差總是存在的,而且這些誤差會(huì )導致雜散噪聲出現在頻譜中期望的分量之間,這些靠近期望分量的雜散信號會(huì )降低數字合成器的無(wú)雜散動(dòng)態(tài)范圍(SFDR)。本系統要求輸出波形SFDR大于90dB。

  因此還需要確定兩個(gè)系統參數。第一個(gè)參數是CORDIC迭代次數N。顯然,迭代次數N 越大,精度越高,資源消耗也越多,所以要選取合適的N值。另一個(gè)參數是當前相位Z的范圍。在實(shí)現過(guò)程中可以利用三角函數的一些對稱(chēng)性質(zhì)對相位進(jìn)行象限轉換,將當前相位統一到更小的范圍內,例如1/2圓,1/4圓,甚至1/8圓,配合少量LUT,達到用較少迭代次數實(shí)現更高精度的目的,代價(jià)是電路的復雜度將會(huì )增加。

  通過(guò)將CORDIC、相位計算,以及相位截斷、量化字長(cháng)等的誤差等因素引入MATLAB仿真程序中,能夠準確仿真出實(shí)際數字電路的輸出波形。采用不同的參數,多次仿真后,確定選取迭代次數N=16,相位Z的范圍為(-90,90),是一個(gè)很好的平衡點(diǎn)。

  仿真結果如圖3所示,信號的頻譜在9.7M達到峰值,說(shuō)明生成的正弦波形其頻率為9.7M,且最大信號幅度的有效值與最大雜散分量有效值分貝差接近100dB,即SFDR>90dB??梢?jiàn),該結果完全符合NCO的系統設計要求,可以按照此設計參數進(jìn)入到下一步FPGA數字電路實(shí)現。

  

  

  圖3 基于CORDIC算法的NCO輸出正旋信號頻譜圖

  基于CORDIC的NCO的和驗證

  這一階段的設計過(guò)程采用Verilog HDL編程,用Xilinx公司的FPGA設計工具實(shí)現。具體電路設計可分為兩個(gè)部分。

  第一部分為CORDIC迭代前模塊,最終目的是輸出當前相位,主要功能是進(jìn)行相位累加、截斷,以及按照上文的設計參數轉換相位至(-90,90)之間,并給出相應的控制信號。圖4中左邊第一個(gè)模塊anglepro即完成了上述功能。系統采用了32位的,M值可由公式計算得到。CLK接FPGA外部40M時(shí)鐘,每來(lái)一個(gè)上升沿,以M為步進(jìn)進(jìn)行一次累加。在精度允許的條件下,對相位地址進(jìn)行截斷至18位,將此18位2進(jìn)制數看成是數的補碼形式,其范圍為(0,(217-1))∪(-217,-1),對應到圓周上可以看成是(0,p)∪(-p,0)。下面只需進(jìn)行相位的轉換工作,對相位地址的高兩位進(jìn)行異或運算,當結果為0時(shí),說(shuō)明當前相位已經(jīng)在設計區間(-90,90)之間;結果為1時(shí)則做簡(jiǎn)單的象限轉換,將第二象限折入第一象限,第三象限折入第四象限,并輸出控制信號t對最終輸出的COS幅值取負。

  

  

  圖4 Synplify Pro編譯綜合后RTL仿真圖(局部)

  第二部分為整個(gè)CORDIC算法的,根據仿真結果,系統采取了16級迭代,X迭代初始值可由公式(5)算出K=0.6073,量化為18位二進(jìn)制數后,得到幅值約為79600。同樣,中所需要的反正切角度值,也根據角度比例對應量化為18位二進(jìn)制相位參數。在本次設計中,并沒(méi)有將這些反正切角度量化值存入統一的LUT中,而是分別固化在每一級的迭代模塊中,簡(jiǎn)化了數字電路結構。

  圖4中cord_2是迭代過(guò)程中的一個(gè)典型迭代模塊,其他15個(gè)迭代模塊的核心結構與cord_2完全相同。如圖5所示,流水線(xiàn)結構中,每一個(gè)模塊(級)接受來(lái)自上一次迭代的Z角度值、X值、Y值,通過(guò)判斷Z的符號對X、Y、Z做移位加減操作,其迭代的核心部分只需要3個(gè)加減法器和2個(gè)移位器。在本次設計中,進(jìn)一步用更為簡(jiǎn)單的符號位擴展和對應賦值取代了移位器,使得電路結構更為簡(jiǎn)單。

  

  

  圖5 CORDIC流水線(xiàn)結構圖

  采用這樣的流水線(xiàn)結構,級級直接相連, 省去了中間的多位寄存器, 每一級移位長(cháng)度和反正切角度值的固化,也大大節省了FPGA實(shí)現時(shí)的寄存器數量。實(shí)際工作時(shí),只需要17個(gè)時(shí)鐘周期的建立時(shí)間,就可以輸出第一個(gè)正、余弦值,進(jìn)而連續輸出波形的離散數值。

  通過(guò)ModelSim仿真后,得到如圖6所示。

  

  

  圖6 modelsim

  為了驗證輸出波形是否正確,本文采用了將量化后幅值還原與理想值比較的方法。如,第一個(gè)幅值對應的實(shí)際余弦值為131068/(2^17)≈0.99997。同時(shí),算得理論相角步進(jìn)為87.3°,進(jìn)一步算出理想的正弦、余弦值。取其中幾組數據進(jìn)行比較,如表1、表2所示。

  通過(guò)對比,可以發(fā)現電路仿真后輸出值與理想值很接近,得到了預期的正、余弦離散波形,驗證了程序本身的正確性,也可以肯定,前文基于CORDIC的NCO功能仿真和參數設計已經(jīng)成功地在FPGA電路中實(shí)現。目前,該設計已成功應用在Xilinx Spartan XC3S500芯片上。

  結語(yǔ)

  采用CORDIC算法設計數控振蕩器可以生成高精度數控振蕩器而無(wú)需大容量的查找表, 節省了大量的ROM資源,降低了功耗,僅采用移位寄存器和加法器結合流水線(xiàn)結構就可實(shí)現迭代過(guò)程。在本次設計中,用符號位擴展和對應賦值取代了移位器,使得電路結構更為簡(jiǎn)單。CORDIC算法所能達到的精度與所選取的迭代次數和操作數位寬密切相關(guān),通過(guò)縮小迭代的角度范圍,利用三角函數的對稱(chēng)特性,配合少量LUT或邏輯電路,可以進(jìn)一步設計出更高精度的數控振蕩器?!?/P>

  



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>