國外做建材的網(wǎng)站有哪些手機端競價惡意點擊能防止嗎
工具:vivado2018.3,modelsim10.6d
場景:在進行數(shù)據(jù)進行頻譜分析的時候,使用FPGA來完成FFT的計算可以加快數(shù)據(jù)的計算速度。
下面使用仿真完成DDS產(chǎn)生的數(shù)據(jù)的FFT以及IFFT。原始數(shù)據(jù)使用DDSIP產(chǎn)生,通過IP產(chǎn)生的波形數(shù)據(jù)直接輸入到FFT進行傅里葉正變換。然后再使用FFT對數(shù)據(jù)進行IFFT傅里葉逆變換還原波形數(shù)據(jù)。過程中完成了fftshift(將零頻分量搬移到頻譜中心),以及使用cordic計算平方根的過程。
FFT端口說明
端口名稱 | 方向 | 描述 |
aclk | I | 時鐘 |
aresetn | I | 復位 |
s_axis_config_tvalid | I | 配置有效 |
s_axis_config_tready | O | 配置準備好 |
s_axis_config_tdata | I | 針對配置通道的TDATA。攜帶配置信息: CP_LEN、FWD/INV、NFFT和SCALE_SCH。關于FWD/INV為FFTIP的方式,1為FFT,0為IFFT。當選擇FFT點數(shù)可配置時NFFT為點數(shù)。SCALE_SCH為縮放計劃,以確保在計算過程中不溢出。對于不同的IO架構(gòu)有不同的規(guī)則。 |
s_axis_data_tdata | I | 輸入數(shù)據(jù) |
s_axis_data_tvalid???????????????? | I | 數(shù)據(jù)有效 |
s_axis_data_tready | O | 數(shù)據(jù)準備好 |
s_axis_data_tlast | I | 輸入的一幀最后一個數(shù)據(jù) |
m_axis_data_tvalid | O | 輸出數(shù)據(jù)有效 |
m_axis_data_tready | I | 輸出數(shù)據(jù)準備好 |
m_axis_data_tdata | O | 輸出數(shù)據(jù) |
m_axis_data_tuser | O | 輸出數(shù)據(jù)狀態(tài)參數(shù)。包含XK_INDEX, OVFLO, and BLK_EXP. XK_INDEX輸出數(shù)據(jù)索引 OVFLO溢出標志 |
m_axis_data_tlast | O | 輸出的最后一個數(shù)據(jù)。 |
m_axis_status_tvalid | O | 狀態(tài)有效 |
m_axis_status_tready | I | 狀態(tài)準備好 |
m_axis_status_tdata | O | 狀態(tài)數(shù)據(jù)。包含每一幀的狀態(tài)休息。 |
event_frame_started | O | 事件幀開始 |
event_tlast_unexpected | O | 當核心在不是幀中最后一個的數(shù)據(jù)樣本上看到s_axis_data_tlast高時有效 |
event_tlast_missing | O | 當一幀的最后一個數(shù)據(jù)樣本上的s_axis_data_tlast為低時斷言。 |
event_fft_overflow | O | 當正在從數(shù)據(jù)輸出通道卸載的數(shù)據(jù)樣本中出現(xiàn)溢出時斷言。僅在溢出是一個有效的選項時才會出現(xiàn)。 |
event_data_in_channel_halt | O | 當核心從數(shù)據(jù)輸入通道請求數(shù)據(jù)而沒有數(shù)據(jù)可用時斷言。 |
event_data_out_channel_halt | O | 當核心從數(shù)據(jù)輸入通道請求數(shù)據(jù)而沒有數(shù)據(jù)可用時斷言。 |
event_status_in_channel_halt | O | 當核心試圖將數(shù)據(jù)寫入狀態(tài)通道而無法這樣做時,將被斷言。僅在非實時模式下出現(xiàn)。 |
FFT IP的配置界面
Channels:從1到12中選擇通道數(shù)。三種Burst I/O架構(gòu)均可使用多通道操作。對于浮點格式,通道必須為1。
Transform Length: 選擇一次處理所需點的大小。
The Pipelined Streaming I/O:運行連續(xù)處理。
Radix-4,Radix-2,Radix-2 Lite Burst I/O。幾種不同的實現(xiàn)方式,延遲依次增大,資源依次減少。
Run time configurable Transform Length:允許運行的過程中改變點數(shù)。勾選此后注意,s_axis_config_tdata的字段的意義。
DataFormat:選擇輸入和輸出數(shù)據(jù)樣本是否為定點格式,或在IEEE-754單精度(32位)浮點格式中。浮點格式不是當核心處于多通道配置時可用。
Scaling Options:
Scaling:用戶自定義縮放格式。注意s_axis_config_tdata的字段需要配置每個階段的縮放信息。
Block Floating-Point:由核心來判斷所需的縮放程度,以實現(xiàn)對可用動態(tài)范圍的最佳利用,并以塊指數(shù)的形式報告縮放因子。注意m_axis_data_tuser字段的塊指數(shù)報告。
Output ordering:自然順序和反轉(zhuǎn)順序。這里使用自然順序。
Optional Output Fields:XK_INDEX,輸出數(shù)據(jù)索引。
資源消耗設置界面。
關于matlab仿真,產(chǎn)生1MHZ的正弦波余弦波信號,采樣率為100MHZ。共計1024個點。對其進行FFT。
matlab仿真程序
% 生成正弦波
fc = 1e6; % 頻率
fs = 100e6; % 采樣率
t1 = 0:1/fs:1e-3; % 時間序列,1微秒
t = t1(1:1024); %RW需要取整數(shù)計算出的頻率是真實sin_wave = sin(2 * pi * fc * t);
cos_wave = cos(2 * pi * fc * t);% 復數(shù)
plural_wave = cos_wave+ 1i*sin_wave;% 加噪聲
data =awgn(cos_wave,100) ;
% data =awgn(plural_wave,100) ;% 繪制原始正弦波數(shù)據(jù)
figure;
subplot(1,1,1);
plot(t*1e9, imag(plural_wave));
title('原始正弦波');
xlabel('時間 (ns)');
ylabel('幅值');%%做FT變化,算平均功率譜,并畫譜輸出
FFT_data = data; N = length(FFT_data); w = blackman(N);Fs =100e6;
% Sf_I_Q_wave=fftshift(fft((FFT_data).*w',N)*2.381);
% w = gausswin(N);%高斯窗函數(shù),窗長度為N
gauss_data = fft((FFT_data).*w',N)*2.396;%%做FFT變換,加窗并還原窗系數(shù)
Sf_I_Q_wave=fftshift(gauss_data);
Sf_I_Q_wave_dBm =(abs(Sf_I_Q_wave));
% Sf_I_Q_wave_dBm =20*log10(1/N*abs(Sf_I_Q_wave));
X_freq=Fs.*(-N/2:N/2-1)/N;figure(2);plot(X_freq,Sf_I_Q_wave_dBm);title('plural_wave原始數(shù)據(jù)普');
對實信號余弦波進行傅里葉變換,頻譜圖如下。
對復信號進行進行傅里葉變換頻譜。
在邏輯中我們使用DDSIP來產(chǎn)生我們需要的波形數(shù)據(jù)。
DDS IP配置界面
可以看到我需要控制DDS的控制字來生成不同頻率的波形數(shù)據(jù),輸出數(shù)據(jù)的格式為高16位為正弦,低16位為余弦。
輸出頻率計算公式。
其中X為頻率控制字,Fs采樣率,即系統(tǒng)時鐘。N為多少位的控制字。要輸出1MHZ的波形信號的控制字為X=655。
輸出波形正好為一個周期1000ns。即1MHZ。
1024點FFT實信號輸入。
FFTSHIFT頻譜搬移模塊
對于FFTSHIFT模塊我們打開matlab幫助后可以發(fā)現(xiàn),搬移的效果就是以頻譜中心左右兩端譜線互換。
ABS求平方根模塊
求復數(shù)的模,定義為
復數(shù)的
在邏輯中我們使用cordic來計算平方根。
cordicIP配置如下所示
模塊仿真
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2024/08/12 14:14:51
// Design Name:
// Module Name: vtf_fft_test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module vtf_fft_test;
//fft
//input
wire [31:0] s_axis_data_tdata ;
wire s_axis_data_tvalid ;
wire s_axis_data_tready ;
wire s_axis_data_tlast ;
//output
wire [31:0] m_axis_data_tdata ;
wire m_axis_data_tvalid ;
wire m_axis_data_tready ;
wire m_axis_data_tlast ;
wire [23:0] m_axis_data_tuser ; //dds
wire m_dds_tvalid ;
wire [31:0] m_dds_tdata ; //system signal
reg clk ;
reg rst_n ;
reg data_gen ;
reg data_flog ;
reg douta_vld ;
reg [15:0] cnt ; //fftshift
wire [31:0] fftshift_data ; //
wire fftshift_data_valid ; //
wire [9:0] fftshift_cnt ; // //abswire [15:0] abs_data ; // (output)
wire abs_data_valid ; // (output)
//system signal//
assign s_axis_data_tdata = douta_vld ? m_dds_tdata : 32'h0;//給復信號
//assign s_axis_data_tdata = douta_vld ? {16'd0,m_dds_tdata[15:0]} : 32'h0;//實信號
assign s_axis_data_tvalid = douta_vld;
assign s_axis_data_tlast = (cnt == 16'd1023 );assign m_axis_data_tready = 1'b1;//FFT后數(shù)據(jù)
//取實部
wire [15:0] f_imag ;
wire [15:0] f_real ;
wire [31:0] f_abs ; assign f_imag = m_axis_data_tdata[31:16];
assign f_real = m_axis_data_tdata[15:0];
assign f_abs = f_imag + f_real;//=========================================================
dds_compiler_0 u_dds (.aclk (clk ), // input wire aclk.s_axis_config_tvalid (1'b1 ), // input wire s_axis_config_tvalid.s_axis_config_tdata (16'd655 ), // input wire [15 : 0] s_axis_config_tdata.m_axis_data_tvalid (m_dds_tvalid ), // output wire m_axis_data_tvalid.m_axis_data_tdata (m_dds_tdata ), // output wire [31 : 0] m_axis_data_tdata.m_axis_phase_tvalid ( ), // output wire m_axis_phase_tvalid.m_axis_phase_tdata ( )// output wire [15 : 0] m_axis_phase_tdata
);//=========================================================
xfft_0 u_fft (.aclk ( clk ), // input wire aclk.aresetn ( rst_n ), // input wire aresetn.s_axis_config_tdata (8'd1 ), // input wire [7 : 0] s_axis_config_tdata.s_axis_config_tvalid (1'b1 ), // input wire s_axis_config_tvalid.s_axis_config_tready ( ), // output wire s_axis_config_tready.s_axis_data_tdata (s_axis_data_tdata ), // input wire [31 : 0] s_axis_data_tdata.s_axis_data_tvalid (s_axis_data_tvalid ), // input wire s_axis_data_tvalid.s_axis_data_tready (s_axis_data_tready ), // output wire s_axis_data_tready.s_axis_data_tlast (s_axis_data_tlast ), // input wire s_axis_data_tlast.m_axis_data_tdata (m_axis_data_tdata ), // output wire [31 : 0] m_axis_data_tdata.m_axis_data_tuser (m_axis_data_tuser ), // output wire [23 : 0] m_axis_data_tuser.m_axis_data_tvalid (m_axis_data_tvalid ), // output wire m_axis_data_tvalid.m_axis_data_tready (m_axis_data_tready ), // input wire m_axis_data_tready.m_axis_data_tlast (m_axis_data_tlast ), // output wire m_axis_data_tlast.m_axis_status_tdata ( ), // output wire [7 : 0] m_axis_status_tdata.m_axis_status_tvalid ( ), // output wire m_axis_status_tvalid.m_axis_status_tready (1'b1 ), // input wire m_axis_status_tready.event_frame_started ( ), // output wire event_frame_started.event_tlast_unexpected ( ), // output wire event_tlast_unexpected.event_tlast_missing ( ), // output wire event_tlast_missing.event_status_channel_halt ( ), // output wire event_status_channel_halt.event_data_in_channel_halt ( ), // output wire event_data_in_channel_halt.event_data_out_channel_halt ( )// output wire event_data_out_channel_halt
);//==========================================================
fft_shift u_fft_shift(
//.fft_data (m_axis_data_tdata ), // (input ) .fft_cnt (m_axis_data_tuser[9:0] ), // (input ) .fft_last (m_axis_data_tlast ), // (input ) .fft_data_valid (m_axis_data_tvalid ), // (input ) .fftshift_data (fftshift_data ), // (output) .fftshift_data_valid (fftshift_data_valid ), // (output) .fftshift_cnt (fftshift_cnt[9:0] ), // (output)
//system signal.sys_clk (clk ), // (input ) .rst_n (rst_n )// (input ) );//==========================================================
abs_top u_abs_top(
//.plural_data (fftshift_data[31:0] ), // (input ) (input ).plural_data_valid (fftshift_data_valid ), // (input ) (input ).abs_data (abs_data[15:0] ), // (output) (output).abs_data_valid (abs_data_valid ), // (output) (output)
//system signal.clk (clk ), // (input ) (input ).rst_n (rst_n ) // (input ) (input )
);//==========================================================
xfft_0 u_ifft (.aclk ( clk ), // input wire aclk.aresetn ( rst_n ), // input wire aresetn.s_axis_config_tdata (8'd1 ), // input wire [7 : 0] s_axis_config_tdata.s_axis_config_tvalid (1'b1 ), // input wire s_axis_config_tvalid.s_axis_config_tready ( ), // output wire s_axis_config_tready.s_axis_data_tdata (m_axis_data_tdata ), // input wire [31 : 0] s_axis_data_tdata.s_axis_data_tvalid (m_axis_data_tvalid ), // input wire s_axis_data_tvalid.s_axis_data_tready (m_axis_data_tready ), // output wire s_axis_data_tready.s_axis_data_tlast (m_axis_data_tlast ), // input wire s_axis_data_tlast.m_axis_data_tdata ( ), // output wire [31 : 0] m_axis_data_tdata.m_axis_data_tuser ( ), // output wire [23 : 0] m_axis_data_tuser.m_axis_data_tvalid ( ), // output wire m_axis_data_tvalid.m_axis_data_tready (1'b1 ), // input wire m_axis_data_tready.m_axis_data_tlast ( ), // output wire m_axis_data_tlast.m_axis_status_tdata ( ), // output wire [7 : 0] m_axis_status_tdata.m_axis_status_tvalid ( ), // output wire m_axis_status_tvalid.m_axis_status_tready (1'b1 ), // input wire m_axis_status_tready.event_frame_started ( ), // output wire event_frame_started.event_tlast_unexpected ( ), // output wire event_tlast_unexpected.event_tlast_missing ( ), // output wire event_tlast_missing.event_status_channel_halt ( ), // output wire event_status_channel_halt.event_data_in_channel_halt ( ), // output wire event_data_in_channel_halt.event_data_out_channel_halt ( )// output wire event_data_out_channel_halt
);//================================================================
//================================================================
initial
beginclk = 0;rst_n=0;data_gen =0;#100;rst_n =1;#1000;data_gen =1;#100;data_gen =0;endalways @ (posedge clk or negedge rst_n)
beginif(rst_n == 1'b0)begin data_flog <= 1'b0;endelse if(data_gen == 1'b1)begindata_flog <= 1'b1;end else if(cnt >= 10'd1022)begindata_flog <= 1'b0;end
endalways @ (posedge clk or negedge rst_n)
beginif(rst_n == 1'b0)begin douta_vld <= 1'b0;endelse begindouta_vld <= data_flog;end endalways @ (posedge clk or negedge rst_n)
beginif(rst_n == 1'b0)begin cnt <= 16'd0;endelse if(s_axis_data_tvalid == 1'b1 && s_axis_data_tready == 1'b1)begincnt <= cnt + 1'b1;end else begincnt <= cnt;endend//================================================================
//================================================================always #5 clk = ~clk;endmodule
復信號輸入。
實信號輸入。
逆傅里葉變換結(jié)果