基于Nios的DDS高精度信號源實現

相關專題: 芯片

摘要:直接數字頻率合成器DDS具有極高的分辨率、頻率轉換速度快、相位噪聲低等優(yōu)點。以ALTERA公司的CPU軟核Nios為基礎,利用Quartus II軟件和Sopc Builder,采用兩級DDS和動態(tài)分頻法,提高了信號源的精度。采用雙口ROM可以很方便的同時輸出兩路具有一定相位差的信號,而且頻率幅度可調。另外著重介紹了怎樣用Matlab產生波形幅度數據以及最后的仿真驗證。

1 引言

在實際的通信過程中,系統(tǒng)對頻率的精度和穩(wěn)定度都有較高的要求.而且常常需要用到多種不同頻率和相位的信號。傳統(tǒng)的波形發(fā)生器都是由模擬的電路實現,受到硬件電路的限制,不僅產生的波形少,精度低,而且體積大。靈活性差。DDS(Direct DigitalFrequncy Synthesis,直接數字頻率合成)的出現為我們提供了一種新選擇。DDS是從相位概念出發(fā)直接合成所需要波形的一種新的頻率合成技術。由于其具有頻率轉換快、分辨率高、頻率合成范圍寬、相位噪聲低且相位可控制的優(yōu)點,因此,DDS技術常用于產生頻率快、轉換速度快、分辨率高、相位可控的信號。目前.市場上已出現許多DDS專用芯片.但是專用芯片有很多局限性,比如控制方式固定,同時只能輸出一路信號.而且價格普遍偏高。利用fpga的高速、高性能和可重構性可實現各種比較復雜的調頻、調相和調幅功能。

本文介紹設計的DDS信號源應用ALTERA公司的FPGA器件、Quartus II開發(fā)環(huán)境和NIOS軟核等相關的開發(fā)工具,采用VHDL語言及SOPC設計思想。采用兩級DDS技術設計波形發(fā)生器,并且可以同時輸出多路不同相位的信號,滿足我們實際的需求。

2 DDS原理

基本DDS的結構框圖如圖1所示。主要由相位累加器、相位調制器、ROM查找表、D/A以及低通濾波器組成。

圖1 DDS結構圖

頻率字和相位字分別控制輸出信號的頻率和相位。DDS的核心是N位的相位累加器。在時鐘脈沖控制下,相位累加器不斷對頻率控制字K進行累加,將累加器的輸出作為讀波形存儲器ROM的地址,讀出波形數據,然后再進行調幅、數模轉換、濾波從而得到光滑的波形信號。在整個過程中相位累加器進行的是線性累加,當累加滿時便產生溢出,一個周期完成。相位累加器這個產生溢出的頻率就是DDS的輸出頻率。設頻率控制字為K,相位累加器為N位,時鐘頻率為fs。所以合成輸出的信號頻率fout 是:

fout=(K/2N)fs

當K=1時有最小頻率分辨率:Δf=fs/2N

3 設計方案

3.1提高精度實現

在我們的實際應用中往往對頻率較小的信號精度要求較高,而對高頻率信號的精度則沒有那么高的要求。傳統(tǒng)的方法就是增加相位累加器的位數N.但N一旦設計好便不可更改,這樣便導致了產生的信號精度不能隨頻率的降低而升高。根據以上的分析在N不變的情況下要提高精度則只有降低時鐘fs(很顯然這時的輸出頻率較低)。下面介紹兩種降低fs的方法:

第一,動態(tài)分頻法。設計的信號發(fā)生器不但要能產生低頻信號同時也能產生高頻信號,所以用固定的分頻辦法降低fs不能達到要求,這就要求我們采用動態(tài)分頻法。在需要產生較高頻率信號的時候選擇小的分頻比.而在合成低頻率信號的時候選擇大的分頻比。根據預先給定的不同的輸出信號頻率選擇相應的分頻比,保證了產生信號的寬頻帶。

第二,采用兩級DDS。第一級合成DDS1產生一定頻率的方波并將此方波送給第二次合成DDS2作為時鐘輸入。其中DDS1的K1可調,保證輸出不同的頻率,DDS2的K2=1,保證了輸出的精度。本次設計采用此方法。

3.2多路輸出設計

無論是用專用芯片還是其他設計的DDS產品,同時都只能輸出一路信號,而在我們的實際應用中往往同時需要多路相位不同的信號,借助ALTERA公司的Cyclone系列器件.可以很方便的生成雙口的ROM,這樣使得我們可以同時對ROM的不同單元尋址,從而產生不同相位的信號,調節(jié)相位控制器,可以很方便的改變兩路信號的相位差。這樣設計的DDS框圖如圖2:

圖2多路輸出DDS框圖

3.3基于Nios的DDS實現

系統(tǒng)的開發(fā)包括硬件和軟件兩部分,硬件部分采用ALTERA公司性價比較高的Cyclone系列FPGA,使用SoPC Builder生成Nios嵌入式處理器。由于本設計中要求信號幅度、相位和頻率都可調節(jié),并且能通過LCD實時的顯示,利用SoPC Builder生成可裁剪的Nios CPU軟核,并添加一些外圍設備接口,如作為控制輸入的鍵盤接口:實時顯示用的LCD接口;DDS控制接口等。系統(tǒng)硬件框圖如圖3。

圖3 系統(tǒng)總框圖

在Cyclone的FPGA中帶了一個PLL.這樣我們便能很好的控制系統(tǒng)時鐘和DDS的時鐘.靈活地選擇晶振信號源。另外幅度調制采用一個乘法器,運用硬件電路搭建,充分使用內部的LE資源,而且方便、靈活,能達到速度要求。

系統(tǒng)的軟件設計主要是鍵盤掃描程序的編寫、LCD顯示的控制接口和對DDS的控制.采用C語言編寫。而DDS單元則用VHDL硬件描述語言。PLL模塊直接使用MegaWizard Plug-in Manager功能同時產生兩路不同的時鐘輸出.一路給DDS,另一路給Nios軟核。

由于DDS的結構,產生的波形由ROM查找表的數據決定,所以改變查找表中的數據便得到不同的信號輸出,這樣可以很方便的產生正弦、余弦、方波,三角波、鋸齒波等。在這次設計中,要產生正弦和余弦信號沒必要改變查找表的數據,只需要調整相位即可,這就是多路輸出不同相位信號最大的優(yōu)點。

4 Matlab與Quartus接口設計

設計中需要大量的計算,特別是ROM查找表初始化數據的產生,可以借助matlab強大的計算能力。最后的仿真數據也可以用matlab畫圖直觀的觀察。

4.1相位幅度變換

由于Cyclone系列的FPGA具有豐富的memory資源,本方案中選用4K的RAM Block構成查找表。在實際的設計中.當我們產生方波的時候則可以直接采用數學計算,沒必要構建查找表,從而節(jié)約了資源。而產生正弦或余弦信號時,考慮到正弦信號1/4波形對稱的性質.只需要存儲π/2的正弦采樣點,利用數學計算便可以產生2π弧度的正弦波形。這樣大大的縮小了ROM.節(jié)約了資源。ROM的初始化數據文件為.mif文件。生成該文件可以借助matlab數學工具,先在matlab里生成正弦信號的采樣點數據表格,還需要自己添加程序,下面舉例說明。

先編寫一段m文件程序,這里以產生216X12正弦波π/2幅度值為例。即在π/2的幅度范圍內采樣65536個點.每個點的值用12位二進制數表示。在matlab里編寫的m文件, 保存的文件名為sin_data.mif。

x=0:1:65535;

y=round(2047*sin(pi*x/131072)) +2048; %pi*x/131072的范圍為0~/2%改變131072即可改變正弦信號的長度。2048則決定了數據寬度。

fid=fopen('sin_data.mif','W' );

fprinf(fid,'%d:%d;\n' ,x,y);

fclose(fid);

plot(x,y);

grid on

在sin_data.mif中數據的存放格式為:

相位:幅度值;

但是這樣的數據表格在Qualtus 4.2里還不能直接調用,需要我們自己編程,加上數據類型申明,其格式如下:

DEPTH =65536;% Memory depth and width are required%

WIDTH = 12; % Enter a decimal number %

ADDRESS_RADIX=DEC; % Address and value radixes are required%

DATA_RADIX =DEC;% Enter BIN,DEC,HEX,OCT,or UNS;unless%

% otherwise specified,radixes=HEX %

--Specify values for addresses, which can be single address

or range

CONTENT

BEGIN

0:2048;

1:2048:

2:2048;

64613:4094;

64614:4095;

END;

4.2 幅度數據的matlab仿真

經過Quartus的綜合、波形仿真后,可以得到.vwf波形文件。然后選擇File菜單下的Save Current Report Section As,保存類型選擇為.tbl。這樣便可以得到輸出波形的數字幅度序列數據。就可以借助Matlab工具方便的觀察波形。.tbl文件的數據存儲格式如下:

時間>邊沿標志 相位=幅度值;

其中時間單位默認為ns,邊沿標志只有一位,其中1表示上升沿,0表示下降沿,地址和幅度值君采用十六進制數表示。用Matlab進行畫圖時需要我們自己編寫m文件程序。我們需要從表格中提取數據,而識別幅度數據的標志就是“=”,所以判斷“=”的位置便可將數據提取出來。但在文件前面的說明中有兩個“=”,這是我們不需要的,所以編程的時候應該濾除。在這里假設.tbl文件保存路徑為:C:\altera\benben\sin.sim.tbl。m文件如下:

fid=fopen('C:\altera\henben\sin.sim.tbl,'r');

yy=fscanf(fid,'%s')

fclose(fid);

aa=fid(yy=='='); %找出“=”的下標

i=0:

for j=1:length(aa)

if yy(aa(j)-1)<='F' %濾除說明中的“=”

i=i+l;

data_hex(i,1)=yy(aa(j)+1);data_hex(i,2)=yy(aa(i)+2);data_hex(i,3)=yy(aa(j))+3);

%取出幅度數據值.數據為十六進制數

end

end

data_dec=hex2dec(data_hex);%將十六進制數轉為十進制數

plot(data_dec);

grid on

5 結論

該設計利用Ahera公司的Cyclone FPGA,借助Nios軟核設計的信號產生器,采用兩級DDS串聯(lián).提高了信號的精度,另外提出了提高精度的動態(tài)分頻法。針對實際需求,采用雙口ROM方便的實現了多路不同相位信號的輸出 另外介紹了Matlab與Quartus的接口程序的編寫,借助Matlab強大的計算能力和畫圖功能,為我們的設計帶來了極大的方便。實驗結果表明該設計是行之有效的,具有很大的實用性。

來源:電子工程世界


微信掃描分享本文到朋友圈
掃碼關注5G通信官方公眾號,免費領取以下5G精品資料

本周熱點本月熱點

 

  最熱通信招聘

業(yè)界最新資訊


  最新招聘信息