酒業(yè)公司網(wǎng)站模板鄭州百度推廣公司
目錄
一、理論基礎(chǔ)
二、FPGA程序
三、測試結(jié)果
一、理論基礎(chǔ)
能夠產(chǎn)生常規(guī)的波形,包括正弦波、方波和鋸齒波;
用鍵盤輸入編輯生成上述波形(同周期)的線性組合波形,以及由基波及其諧波(5次以下)線性組合波形;
具有波形存儲功能;
輸出波形頻率范圍為100Hz-200KHz,頻率步進間隔<=100Hz;
輸出波形幅度范圍0-5V(峰-峰值),調(diào)整步距為0.1V;
能夠顯示輸出波形的類型、頻率和幅度;
?????? 這里,DDS的基本原理,就是將原始的信號保存到ROM中,然后通過頻率控制字讀取內(nèi)部的信號,通過修改頻率控制字的值,獲得對應(yīng)的頻率值。
?????? 關(guān)于幅度,則通過將輸入信號的幅度乘以一個固定的數(shù),獲得不同大小的頻率。
輸出波形頻率范圍為100Hz-200KHz,頻率步進間隔<=100Hz;
輸出波形幅度范圍0-5V(峰-峰值),調(diào)整步距為0.1V;
? ? ? ? 假設(shè)晶振是40M,那么如果要輸出100Hz到200K之間的頻率范圍。以正弦波為例子。
??????? 那么通過計算頻率控制字,即如果以40M作為時鐘頻率,最小100Hz,最大200KHz,然后頻率控制字為24bit寬度。
? ? ? ? 那么100hz對應(yīng)的頻率控制值為:
A:42(100/40000000*2^24)
B: 83886 (200000/40000000*2^24)
通過修改頻率控制值,產(chǎn)生對應(yīng)的不同的頻率。
方波和鋸齒波做同樣的處理。
? ? ? ?然后對于幅度,0~5.布局為0.1,那么其分辨率為0.1V。那么整個調(diào)整區(qū)間為50,那么對應(yīng)的幅度,我們設(shè)置的位寬為12位(位數(shù)越高,其精度越高)
然后我們通過外部的按鍵,選擇信號類型,信號頻率,信號幅度。
然后再介紹一下那個線性組合的問題。
對于基波,我們直接通過加減法就可以實現(xiàn)。
? ? ? ?對于諧波,因為諧波是指頻率是基波頻率整數(shù)倍的信號,那么在這里,我加入了頻率為2~10倍這幾種范圍的諧波,具體只要選擇對應(yīng)頻率的諧波即可。然后對將諧波加入到原始信號中即可。
二、FPGA程序
通過設(shè)置如下的接口,我們可以分別獲得不同的信號組合,具體操作如下所示:
input???????i_clk; | 系統(tǒng)時鐘,默認(rèn)時鐘為40M |
input???????i_rst; | 系統(tǒng)復(fù)位,輸入1,系統(tǒng)清零復(fù)位,輸入0,系統(tǒng)正常工作 |
input[3:0]??i_sel; | 信號類型選擇按鍵,具體如下: //signal?sel |
input???????i_amp_add; | 幅度變大 |
input???????i_amp_sub; | 幅度變小 |
input???????i_fre_add; | 頻率變大 |
input???????i_fre_sub; | 頻率變小 |
input[3:0]??i_fre_time; | 產(chǎn)生幾倍頻率諧波,2~15 |
output[11:0]o_signal; | 輸出信號 |
output[31:0]o_fre; | 輸出當(dāng)前頻率 |
output[11:0]o_amp; | 輸出當(dāng)前幅度 |
output[3:0]?o_signal_type; | 輸出信號類型 |
頂層程序如下:
`timescale 1ps / 1ps
module tops(i_clk,i_rst,i_sel,i_amp_add,i_amp_sub,i_fre_add,i_fre_sub,i_fre_time,o_signal,o_fre,o_amp,o_signal_type);input i_clk;
input i_rst;
input[3:0] i_sel; //signal sel
//0:sin
//1:square
//2:sawtooth
//3:k*sin
//4:k*square
//5:k*sawtooth
//6:sin+square
//7:sin+sawtooth
//8:sawtooth+square
//9:sin+sawtooth+square
//10:sin+ksin
//11:sawtooth+k*sawtooth
//12:square+k*square
input i_amp_add;
input i_amp_sub;
input i_fre_add;
input i_fre_sub;
input[3:0] i_fre_time;
output[11:0]o_signal;
output[23:0]o_fre;
output[6:0] o_amp;
output[3:0] o_signal_type;reg[23:0]o_fre;
always @(posedge i_clk or posedge i_rst)
beginif(i_rst)begino_fre <= 24'd83886;end
else begin//frequency adjust//frequency adjustif(i_fre_add == 1'b1)o_fre <= o_fre + 24'd1;if(i_fre_sub == 1'b1)o_fre <= o_fre - 24'd1;if(o_fre <= 24'd42)o_fre <= 24'd42; if(o_fre >= 24'd83886)o_fre <= 24'd83886; end
endreg[5:0]amps;
always @(posedge i_clk or posedge i_rst)
beginif(i_rst)beginamps <= 7'b0111_111;end
else begin//frequency adjust//frequency adjustif(i_amp_add == 1'b1)amps <= amps + 7'd1;if(i_amp_sub == 1'b1)amps <= amps - 7'd1;if(amps <= 7'b0000_001)amps <= 7'b0000_001; if(amps >= 7'b0111_111)amps <= 7'b0111_111; end
endassign o_amp = amps;
assign o_signal_type = i_sel; reg signed[18:0]tmps;
wire signed[11:0]sin1;
wire signed[11:0]cube1;
wire signed[11:0]saw1;
DDS base(.i_clk (i_clk),.i_rst (i_rst),.i_k (4'd1),.i_fre (o_fre),.o_sin (sin1),.o_cube (cube1),.o_saw (saw1),.o_fre (),.o_test1(),.o_test2()); wire signed[11:0]sink;
wire signed[11:0]cubek;
wire signed[11:0]sawk;
DDS h(.i_clk (i_clk),.i_rst (i_rst),.i_k (i_fre_time),.i_fre (o_fre),.o_sin (sink),.o_cube (cubek),.o_saw (sawk),.o_fre (),.o_test1(),.o_test2()); always @(posedge i_clk or posedge i_rst)
beginif(i_rst)begintmps <= 19'd0;end
else begincase(i_sel)0:tmps <= amps*sin1;1:tmps <= amps*cube1;2:tmps <= amps*saw1;3:tmps <= amps*sink;4:tmps <= amps*cubek;5:tmps <= amps*sawk;6:tmps <= amps*sin1[11:1] + amps*cube1[11:1];7:tmps <= amps*sin1[11:1] + amps*saw1[11:1];8:tmps <= amps*saw1[11:1] + amps*cube1[11:1];9:tmps <= amps*sin1[11:2] + amps*cube1[11:2] + amps*saw1[11:2];10:tmps <= amps*sin1[11:1] + amps*sink[11:1];11:tmps <= amps*cube1[11:1] + amps*cubek[11:1];12:tmps <= amps*saw1[11:1] + amps*sawk[11:1];default:tmps <= amps*sin1;endcase end
end assign o_signal=tmps[18:7];
//0:sin
//1:square
//2:sawtooth//3:k*sin
//4:k*square
//5:k*sawtooth//6:sin+square
//7:sin+sawtooth
//8:sawtooth+square
//9:sin+sawtooth+square//10:sin+ksin
//11:sawtooth+k*sawtooth
//12:square+k*square endmodule
三、測試結(jié)果
通過仿真,我們得到如下的幾組信號:
A35-15
?