設計背景:
DDS(Direct Digital Synthesizer)直接數(shù)字式頻率合成器,是一種新型頻率合成技術,具有低成本、低功耗、高分辨率、相對帶寬大和頻率轉換時間短等優(yōu)點。較容易實現(xiàn)頻率、相位以及幅度的數(shù)控調(diào)制,廣泛應用在電信與電子儀器和通信領域。波形發(fā)生器是一種數(shù)據(jù)信號發(fā)生器,在調(diào)試硬件時,常常需要加入一些信號,以觀察電路工作是否正常。加入的信號有:正弦波、三角波、方波和任意波形等。
設計原理:
相位(phase)是對于一個波,特定的時刻在它循環(huán)周期中的位置:一種它是否在波峰、波谷或它們之間的某點的標度。相位描述信號波形變化的度量,通常以度 (角度)作為單位,也稱作相角。 當信號波形以周期的方式變化,波形循環(huán)一周即為360°。那么相位可調(diào)也可以簡單的理解為:改變初始相位。
頻率,是單位時間內(nèi)完成周期性變化的次數(shù),是描述周期運動頻繁程度的量,常用符號f或ν表示,單位為秒分之一,符號為s-1。頻率可調(diào)也就是改變單位時間內(nèi)完成周期性變化的次數(shù)。
本設計采用DDS技術設計相位頻率可調(diào)的波形發(fā)生器,已經(jīng)知道了相位和頻率可調(diào)分別代表什么,那么接下來就要知道怎樣依靠DDS技術實現(xiàn)波形發(fā)生器,并且相位和頻率可以調(diào)控。DDS的基本結構如下圖所示:
根據(jù)上圖可以看出:DDS主要由相位累加器、波形數(shù)據(jù)表(ROM)、D/A轉換器構成,本設計暫時不涉及D/A轉換部分。相位累加器位寬為N,波形數(shù)據(jù)表的大小為2^P,累加器的高P位則用于尋址波形數(shù)據(jù)表,即ROM,從ROM中輸出的數(shù)據(jù)則是產(chǎn)生的波形。如果累加器在系統(tǒng)時鐘(CLOCK)的作用下,以步進為M累加直至溢出,則M為頻率控制字(即圖中的FWORD),相位控制字(PWORD)則作為累加器的輸入初始值。這里的累加器,也可以理解為ROM的地址發(fā)生器。
上段所述我們可具體理解為:改變地址的初值(PWORD)就可以改變初始的相位,由于我們設計中,ROM的數(shù)據(jù)為256,所以PWORD的值在0~255之間,PWORD= 256*(初始相位/360度)。
我們設計的系統(tǒng)時鐘(CLOCK)為50MHz,周期為20ns,而正弦波被分成了256個點,波形發(fā)生器的頻率就是195.31KHz。若想要輸出別的頻率,則可通過改變輸出的點的個數(shù),即改變有效地址的數(shù)量。我們用位寬為N位的累加器,假設FWORD為1,要產(chǎn)生一個完整波形的周期則為20ns*2^N,則產(chǎn)生波形的頻率=系統(tǒng)時鐘/2^N,即Fout = Fclk/2^N,如果FWORD為B,每次步進的間隔提高了B倍,所以計滿一個波形周期的時間就縮小了B倍,即頻率就提高了B倍。則波形頻率的公式為:Fout = B*(Fclk/2^N)。之后我們?nèi)±奂悠鞯母?位,去尋址波形數(shù)據(jù),對應點的還是個數(shù)一樣的。本設計中我們將N取為32,當B=1,F(xiàn)out約為0.012Hz,0.012就相當于最小精度,所以我們就實現(xiàn)了頻率為0.012倍數(shù)的調(diào)制,但因為0.012值很小了,所以可以說基本實現(xiàn)了所有頻率的調(diào)制。
設計架構圖:
根據(jù)上述的原理圖分析,本設計的架構如下圖:
架構圖中的端口功能描述如下表:
dds_addr模塊是實現(xiàn)相位累加器的模塊,這里用參數(shù)來調(diào)制FWORD和PWORD的值,累加之后,將地址高八位(addr_out)輸出到rom模塊,從而產(chǎn)生波形數(shù)據(jù)。
設計代碼:
在具體寫代碼之前,我們需要先制作載有波形數(shù)據(jù)的mif文件,這時需要一個小軟件(Mif_Maker2010),軟件的鏈接如下:
鏈接:http://pan.baidu.com/s/1gfzcOzL密碼:ietw
具體操作步驟如下:
打開Mif_Maker2010,在查看中點擊全局參數(shù),如下圖:
將全局參數(shù)設置如下圖:數(shù)據(jù)長度為256,數(shù)據(jù)位寬為8,數(shù)據(jù)格式為無符號10進制,采樣頻率為1000。
點擊設定波形,選擇想要生成的波形,這里我們以正弦波為例,如需要其他波形,都可進行修改:
之后點擊保存,則可生成mif文件,這里我們命名為sin.mif。打開sin.mif后,如下圖所示:
dds_addr模塊代碼:
這里我們以初始相位為180度,頻率為5KHz為例:
0moduledds_addr (clk,rst_n,addr_out);
1
2inputclk,rst_n;//系統(tǒng)時鐘復位
3output[7:0]addr_out;//輸出的地址,對應到ROM內(nèi)的數(shù)據(jù)
4
5parameterN =32;
6parameterPWORD =128;//相位控制字 (x/360)*256
7parameterFWORD =429497;//頻率控制字F_out=B*(F_clk/2**32),fword=B
8//5KHZ
9reg[N-1:0]addr;//32位累加器
10
11always@(posedgeclk ornegedgerst_n)
12begin
13if(!rst_n)
14begin
15addr <=0;
16end
17else
18begin
19/*每隔fword的大小,輸出一位地址,若頻率控制字FWORD等于2,那么地址計數(shù)器輸出的就依次是0,2,4.....*/
20addr <=addr +FWORD;
21end
22end
23/*將累加器器的地址的高八位賦值給輸出的地址(ROM的地址*/
24assignaddr_out =addr[N-1:N-8]+ PWORD;
25
26endmodule
rom模塊為調(diào)用的IP核,該rom IP核中存儲了sin.mif的數(shù)據(jù)。
dds頂層模塊代碼:
0moduledds (clk,rst_n,q);
1
2inputclk,rst_n;//系統(tǒng)時鐘復位
3output[7:0]q;//輸出波形數(shù)據(jù)
4
5wire[7:0]addr_out;//8位地址,對應到ROM內(nèi)的數(shù)據(jù)
6
7/*****相位累加器模塊*****/
8dds_addr dds_addr_inst(
9.clk(clk),
10.rst_n(rst_n),
11.addr_out(addr_out)
12);
13
14/*****波形數(shù)據(jù)模塊*****/
15rom rom_inst (
16.address (addr_out ),
17.clock (clk ),
18.q (q )
19);
20
21endmodule
dds_tb頂層模塊的測試模塊:
0`timescale1ns/1ps
1
2moduledds_tb;
3
4regclk,rst_n;
5wire[7:0]q;
6
7initialbegin
8clk =1;
9rst_n =0;
10#200.1
11rst_n =1;
12
13#50_000_000$stop;
14end
15
16dds dds_dut(
17.clk(clk),
18.rst_n(rst_n),
19.q(q)
20);
21
22always#10clk =~clk;
23
24endmodule
仿真圖:
根據(jù)上圖可知,我們的設計正確。并且可以實現(xiàn)相位和頻率可調(diào)。
-
DDS
+關注
關注
21文章
631瀏覽量
152541 -
波形發(fā)生器
+關注
關注
3文章
288瀏覽量
31355
發(fā)布評論請先 登錄
相關推薦
評論