首先介紹下信號混頻的相關(guān)概念?;祛l就是把兩個不同頻率的信號混合,得到第三個頻率。數(shù)字電路中最常見的混頻方法就是將兩個信號相乘。將兩個頻率為 f0,f1 的正弦波進行相乘,根據(jù)積化和差公式,得到兩個頻率分量為 f0+f1 ,f0-f1 的信號。
數(shù)字混頻在通信的調(diào)制,解調(diào),DUC(數(shù)字上變頻),DDC(數(shù)字下變頻)等系統(tǒng)中應用廣泛。通常把其中一個信號稱為本振信號( local oscillator ),另一個我信號稱為混頻器的輸入信號。
下面的matlab代碼用于驗證混頻器的設(shè)計。
%%信號混頻
%%將兩個頻率為 f0,f1 的正弦波進行相乘,根據(jù)積化和差公式,得到兩個頻率分量為 f0+f1 ,f0-f1 的信號
clear all;close all;clc;
fs = 100*10e6; %采樣頻率 100MHz
f1 = 2*10e6; %信號0的頻率 2MHz
f0 = 1.5*10e6; %信號1的頻率 1.5MHz
fpass =1.7*10e6; %低通濾波器通帶頻率
fstop =1.9*10e6; %低通濾波器截止頻率
DIV = 16
N = 4096; %采樣點數(shù)
t = 0 : 1/fs : (N-1)/fs; %設(shè)置采樣時間
Sig0 = sin (2*pi*f0*t); %生成信號0
Sig1 = sin (2*pi*f1*t); %生成信號1
Sig = Sig0 .*Sig1; %兩個信號進行相乘
% 進行快速傅里葉變化,得到頻譜
XK0 = fft(Sig0);
XK1 = fft(Sig1);
XK = fft(Sig);
%設(shè)置頻率
f = ( 0:N/DIV-1 )*fs/( N * 10e6 ); %單位設(shè)置為MHz
Amax = max (abs( XK(1:N/DIV)));
f0 = [0 fpass/(10e6 ) fstop/(10e6 ) ( N/DIV-1 )*fs/( N * 10e6 ) ];
A = [ Amax Amax 0 0 ];
%繪制時域波形圖
figure(1);
subplot(3,1,1); plot(t,Sig0); title(“頻率為1.5MHz的正弦信號”);xlabel(“時間(s)”);ylabel(“幅度”);
subplot(3,1,2); plot(t,Sig1); title(“頻率為2.0MHz的正弦信號”);xlabel(“時間(s)”);ylabel(“幅度”);
subplot(3,1,3); plot(t,Sig); title(“1.5MHz和2.0MHz正弦波相乘得到的信號”);xlabel(“時間(s)”);ylabel(“幅度”);
%繪制頻域圖
figure(2);
subplot(3,1,1); plot(f, ( abs( XK0(1:N/DIV) ) ) );title(“1.5MHz正弦信號的頻譜”);xlabel(“頻率(MHz)”);ylabel(“幅度”);
subplot(3,1,2); plot(f, ( abs( XK1(1:N/DIV) ) ) );title(“2.0MHz正弦信號的頻譜”);xlabel(“頻率(MHz)”);ylabel(“幅度”);
subplot(3,1,3); plot(f, ( abs( XK(1:N/DIV) ) ) );title(“1.5MHz和2.0MHz正弦波相乘得到的信號的頻譜”);xlabel(“頻率(MHz)”);ylabel(“幅度”);
hold on;
%低通濾波器示意圖
plot( f0 ,A );
在該仿真代碼中,設(shè)置采樣時鐘為100MHz,兩個信號的頻率分別為1.5MHz 和2.0 MHz 。兩個信號相乘后,產(chǎn)生一個頻率分量為 0.5MHz ( 2.0MHz - 1.5MHz ) 和3.5MHz ( 2.0MHz + 1.5MHz ) 的信號。時域圖顯示如下:
頻域圖顯示如下:
如圖上所示,混頻后得到了兩個頻率頻率分量為 0.5MHz 和 3.5 MHz的信號。將該信號通過一個截止頻率為2.0MHz左右的濾波器中,即可過濾掉 3.5 MHz的高頻信號,只留下 0.5MHz的信號。即如上圖橙色曲線所示。
2.MATLAB設(shè)計濾波器系數(shù)。
利用matlab的 濾波器設(shè)計工具箱( Filter Designer )可以非常方便地設(shè)計出符合工程要求的濾波器,在該工具箱中可以直接導出用于FPGA 濾波器設(shè)計的系數(shù)文件。打開該工具箱后,默認顯示如下:
進行簡單的設(shè)置:
濾波器類型:低通濾波器
濾波器形式:fir
濾波器階數(shù):100
頻率單位:MHz
采樣頻率:100MHz
通帶頻率:1MHz
截止頻率:2MHz
濾波器參數(shù)設(shè)置好后,點擊 Designer Filter 按鈕,稍等片刻,即可出現(xiàn)設(shè)計好的濾波器的頻幅相應曲線?!咀ⅰ坑捎谑浅鯇W乍練,以上的參數(shù)設(shè)計的不一定合理,其中某些概念還不是很懂,還望通信大神指點。
由于要在FPGA中使用,還要將浮點型的系數(shù)轉(zhuǎn)化為定點數(shù)。如下圖設(shè)置,設(shè)置輸出格式為定點數(shù),位寬為16bit.
接下來就可以生成用于FPGA設(shè)計的系數(shù)文件了。在菜單【 Targets 】下點擊【 XILINX coefficient(.coe)file 】,保存即可。
.coe文件中的內(nèi)容大致如下,存儲了濾波器的各個系數(shù),用16進制表示。
至此,濾波器就設(shè)置完成了。
3.建立FPGA工程。
利用xilinx 的vivado工具來建立 fir 濾波器系統(tǒng),對上述的matlab 程序進行硬件驗證。兩路正弦波信號可以用vivado 的DDS IP生成,乘法操作用乘法器IP實現(xiàn),用vivado自帶的fir 濾波器實現(xiàn)濾波。利用vivado 的 block design 工具,可以不寫一行代碼,實現(xiàn)FPGA系統(tǒng)的搭建。先預覽下搭建好的一個簡單的fir 系統(tǒng)工程。
該工程中,利用兩個DDS 輸出 1.5MHz 和 2.0MHz 的正弦波,利用乘法器IP進行兩路信號的相乘,實現(xiàn)混頻操作。再講混頻的信號通過一個fir濾波器,實現(xiàn)濾波操作。先亮以下仿真結(jié)果,漂亮的波形圖。
濾波器完美輸出了0.5MHz的波形,濾掉了3.5MHz的高頻波。不過這是在仿真中的結(jié)果,在實際工程中,輸入的信號可能含有噪聲,失真等缺陷,實際效果不可能如此完美,但這個仿真結(jié)果也可以說明問題,在理想的輸入下,該濾波器可以完美地濾掉高頻波。下面詳細介紹 FPGA 工程的搭建。
1,建立 block design 工程。
在vivado 工具中點擊 create block design ,輸入 fir_system ( 該名稱可以任意指定 )。
2,添加IP。
在新打開的 Diagram 視圖中,添加IP 塊。點擊 “ + ”號,在彈出的對話框中輸入DDS,雙擊DDS compiler ,即可將DDS IP 加入到塊圖中。
按照上面的方法依次添加兩個 DDS( DDS compiler ) IP ,兩個截位( slice )IP ,一個fir濾波器(fir compiler) IP,一個乘法器( mult )IP,如下圖。
3,設(shè)置IP。
IP添加后,還有經(jīng)過配置參數(shù)才能使用。雙擊IP 塊即可進行配置。
(1)DDS配置。
兩個DDS模塊,一塊設(shè)置輸出為2.0MHz,一個設(shè)置輸出為1.5MHZ,其余設(shè)置保持相同即可。時鐘頻率一定要設(shè)置為100MHz,和前面matlab仿真保持一致。
另一個DDS設(shè)置為1.5MHz 。設(shè)置方法同上。需要注意的是,如上圖顯示,輸出數(shù)據(jù)端口(MAXISDATA_TDATA)為16bit ,高8位為 正弦波(sin)數(shù)據(jù),低8位為余弦波(cos)數(shù)據(jù)。
(2)slice IP設(shè)置。
該IP用于截位操作,設(shè)置如下,輸入為16bit,輸出為8bit,為16bit的bit7到bit0.位寬為8bit.該IP用于截取從DDS輸出的正弦波數(shù)據(jù)。
(3)乘法器IP配置。
輸入位寬設(shè)置為8bit 有符號數(shù),流水線級數(shù)采用建議的延時,設(shè)置為3.表示從輸入到乘法結(jié)果輸出經(jīng)過3個時鐘周期延時。其余可保持默認。
(4)移位寄存器設(shè)置。
移位寄存器用以延時數(shù)據(jù)有效信號,使其與乘法器的輸出保持同步。由于乘法器有3個時鐘的延遲,故將移位寄存器深度也設(shè)置為3,使其輸出比輸入延遲3個時鐘周期。其余可保持默認。
(5)fir濾波器配置。
濾波器的系數(shù)設(shè)置為coe文件,加載前面在matlab生成的coe文件,稍等片刻即可在左邊窗口看到該濾波器的幅頻響應曲線。將輸入采樣頻率和時鐘頻率都設(shè)置為100MHz。其余可默認。
4,引出端口。
鼠標選中端口,右鍵選擇 make external,即可導出端口。
5,IP連接。
IP最終連接如下圖。
6,生成代碼。
按照下圖,選中塊設(shè)計,右鍵先選擇 “ generate output product.。。”,等待完成后在選擇 “create HDL wrapper.。。”,即可自動生成頂層代碼。
如果出現(xiàn)下面的界面,可選擇下拉菜單中的最大值,這個選項表示運行時vivado軟件可使用的最大核心數(shù)。
最終自動生成的頂層代碼如下,就是對建立的原理圖工程做了模塊調(diào)用,其本質(zhì)還是Verilog代碼。
4,F(xiàn)PGA仿真驗證。建立如下的測試文件:
module tb_fir( );
wire [7:0]adc0_sin;
wire [7:0]adc1_sin;
wire [15:0]fir_in;
wire [39:0]fir_out_tdata;
wire fir_out_tvalid;
reg sysclk;
fir_system_wrapper fir_system_wrapper
(
.adc0_sin ( adc0_sin ),
.adc1_sin ( adc1_sin ),
.fir_in ( fir_in ),
.fir_out_tdata ( fir_out_tdata ),
.fir_out_tvalid ( fir_out_tvalid ),
.sysclk ( sysclk )
);
initial
begin
sysclk = 0;
#50000 $stop(2);
end
always #5 sysclk = ~sysclk;
Endmodule
由于該工程的邏輯已在源代碼中完成,故在測試文件只是對頂層模塊做了例化和產(chǎn)生時鐘信號。最后仿真結(jié)果如下圖:
濾波器完美輸出了0.5MHz的波形,濾掉了3.5MHz的高頻波。
編輯:jq
-
濾波器
+關(guān)注
關(guān)注
161文章
7799瀏覽量
178010 -
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120244 -
IP
+關(guān)注
關(guān)注
5文章
1703瀏覽量
149511 -
乘法器
+關(guān)注
關(guān)注
8文章
205瀏覽量
37043 -
代碼
+關(guān)注
關(guān)注
30文章
4780瀏覽量
68531
原文標題:matlab+vivado設(shè)計數(shù)字濾波器
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論