班级建设怎样建立班级网站,wordpress 文字居中,重庆市工程安全建设信息网官网,西宁百度seo串行 FIR 滤波器设计 设计说明 
设计参数不变#xff0c;与并行 FIR 滤波器参数一致。即#xff0c;输入频率为 7.5 MHz 和 250 KHz 的正弦波混合信号#xff0c;经过 FIR 滤波器后#xff0c;高频信号 7.5MHz 被滤除#xff0c;只保留 250KMHz 的信号。 
输入频率#x…串行 FIR 滤波器设计 设计说明 
设计参数不变与并行 FIR 滤波器参数一致。即输入频率为 7.5 MHz 和 250 KHz 的正弦波混合信号经过 FIR 滤波器后高频信号 7.5MHz 被滤除只保留 250KMHz 的信号。 
输入频率    7.5MHz 和 250KHz
采样频率    50MHz
阻带           1MHz-6MHz
阶数           15 N15 
串行设计就是在 16 个时钟周期内对 16 个延时数据分时依次进行乘法、加法运算然后在时钟驱动下输出滤波值。考虑到 FIR 滤波器系数的对称性计算一个滤波输出值的周期可以减少到 8 个。串行设计时每个周期只进行一次乘法运算所以设计中只需一个乘法器即可。此时数据需要每 8 个时钟周期有效输入一次但是为了保证输出信号频率的正确性工作时钟需要为采样频率的 8 倍即 400MHz。这种方法的优点是资源耗费少但是工作频率要求高数据不能持续输出。 
串行设计 
设计中使用到的乘法器模块代码可参考之前流水线式设计的乘法器。 
为方便快速仿真也可以直接使用乘号 * 完成乘法运算设计中加入宏定义 SAFE_DESIGN 来选择使用哪种乘法器。 
FIR 滤波器系数可由 matlab 生成具体见附录。 
/**********************************************************Description : fir study with serial techV190403     : Fs:50Mhz, fstop:1-6Mhz, order:16, sys clk:400MHz
***********************************************************/
define SAFE_DESIGNmodule fir_serial_low(input                rstn,input                clk,   // 系统工作时钟400MHzinput                en ,   // 输入数据有效信号input        [11:0]  xin,   // 输入混合频率的信号数据output               valid, // 输出数据有效信号output       [28:0]  yout   // 输出数据);//delay of input data enablereg [11:0]            en_r ;always (posedge clk or negedge rstn) beginif (!rstn) beginen_r[11:0]       b0 ;endelse beginen_r[11:0]       {en_r[10:0], en} ;endend//fir coeficientwire        [11:0]   coe[7:0] ;assign coe[0]         12d11 ;assign coe[1]         12d31 ;assign coe[2]         12d63 ;assign coe[3]         12d104 ;assign coe[4]         12d152 ;assign coe[5]         12d198 ;assign coe[6]         12d235 ;assign coe[7]         12d255 ;//(1) 输入数据移位部分 reg [2:0]            cnt ;integer              i, j ;always (posedge clk or negedge rstn) beginif (!rstn) begincnt  3b0 ;endelse if (en || cnt ! 0) begincnt  cnt  1b1 ;    //8个周期计数endendreg [11:0]           xin_reg[15:0];always (posedge clk or negedge rstn) beginif (!rstn) beginfor (i0; i16; ii1) beginxin_reg[i]   12b0;endendelse if (cnt  3d0  en) begin    //每8个周期读入一次有效数据xin_reg[0]  xin ;for (j0; j15; jj1) beginxin_reg[j1]  xin_reg[j] ; // 数据移位endendend//(2) 系数对称16个移位寄存器数据进行首位相加reg  [11:0]          add_a, add_b ;reg  [11:0]          coe_s ;wire [12:0]          add_s ;wire [2:0]           xin_index  cnt1 ? cnt-1 : 3d7 ;always (posedge clk or negedge rstn) beginif (!rstn) beginadd_a   13b0 ;add_b   13b0 ;coe_s   12b0 ;endelse if (en_r[xin_index]) begin //from en_r[1]add_a   xin_reg[xin_index] ;add_b   xin_reg[15-xin_index] ;coe_s   coe[xin_index] ;endendassign add_s  {add_a}  {add_b} ;  //(3) 乘法运算只用一个乘法reg        [24:0]    mout ;
ifdef SAFE_DESIGNwire                 en_mult ;wire [3:0]           index_mult  cnt2 ? cnt-1 : 4d7  cnt[0] ;mult_man #(13, 12)   u_mult_single    //例化自己设计的流水线乘法器(.clk        (clk),.rstn       (rstn),.data_rdy   (en_r[index_mult]),  //注意数据时序对应.mult1      (add_s),.mult2      (coe_s),.res_rdy    (en_mult),   .res        (mout));elsealways (posedge clk or negedge rstn) beginif (!rstn) beginmout    25b0 ;endelse if (|en_r[8:1]) beginmout    coe_s * add_s ;  //直接乘endendwire                 en_mult  en_r[2];
endif//(4) 积分累加8组25bit数据 - 1组 29bit 数据reg        [28:0]    sum ;reg                  valid_r ;//mult output en counterreg [4:0]            cnt_acc_r ;always (posedge clk or negedge rstn) beginif (!rstn) begincnt_acc_r  b0 ;endelse if (cnt_acc_r  5d7) begin  //计时8个周期cnt_acc_r  b0 ;endelse if (en_mult || cnt_acc_r ! 0) begin //只要en有效计时不停cnt_acc_r  cnt_acc_r  1b1 ;endendalways (posedge clk or negedge rstn) beginif (!rstn) beginsum       29d0 ;valid_r   1b0 ;endelse if (cnt_acc_r  5d7) begin //在第8个累加周期输出滤波值sum       sum  mout;valid_r   1b1 ;endelse if (en_mult  cnt_acc_r  0) begin //初始化sum       mout ;valid_r   1b0 ;endelse if (cnt_acc_r ! 0) begin //acculating between cyclessum       sum  mout ;valid_r   1b0 ;endend//时钟锁存有效的输出数据为了让输出信号不是那么频繁的变化reg [28:0]           yout_r ;always (posedge clk or negedge rstn) beginif (!rstn) beginyout_r  b0 ;endelse if (valid_r) beginyout_r  sum ;endendassign yout  yout_r ;//(5) 输出数据有效延迟即滤波数据丢掉前15个滤波值reg [4:0]    cnt_valid ;always (posedge clk or negedge rstn) beginif (!rstn) begincnt_valid       b0 ;endelse if (valid_r  cnt_valid ! 5d16) begincnt_valid       cnt_valid  1b1 ;endendassign valid  (cnt_valid  5d16)  valid_r ;endmoduletestbench 
testbench 编写如下主要功能就是不间断连续的输入 250KHz 与 7.5MHz 的正弦波混合信号数据。输入的混合信号数据也可由 matlab 生成具体见附录。 
其中工作频率为 400MHz但输入数据和输入数据有效信号应当都保持 50MHz 的频率输入。 
module test ;//inputreg          clk ;reg          rst_n ;reg          en ;reg  [11:0]  xin ;//outputwire [28:0]  yout ;wire         valid ;parameter    SIMU_CYCLE    64d1000 ;parameter    SIN_DATA_NUM  200 ;//
// 8*50MHz clk generatinglocalparam   TCLK_HALF      (10_000 3);initial beginclk  1b0 ;forever begin# TCLK_HALF clk  ~clk ;endend//
//  reset and finishinitial beginrst_n  1b0 ;# 30        rst_n  1b1 ;# (TCLK_HALF * 2 * 8  * SIMU_CYCLE) ;$finish ;end//
// read cos data into registerreg          [11:0] stimulus [0: SIN_DATA_NUM-1] ;integer      i ;initial begin$readmemh(../tb/cosx0p25m7p5m12bit.txt, stimulus) ;en  0 ;i  0 ;xin  0 ;# 200 ;forever beginrepeat(7)  (negedge clk) ; //空置7个周期第8个周期给数据en           1 ;xin          stimulus[i] ;(negedge clk) ;en           0 ;         //输入数据有效信号只持续一个周期即可if (i  SIN_DATA_NUM-1)  i  0 ;else  i  i  1 ;end end fir_serial_low       u_fir_serial (.clk         (clk),.rstn        (rst_n),.en          (en),.xin         (xin),.valid       (valid),.yout        (yout));endmodule仿真结果 
由下图仿真结果可知经过 FIR 滤波器后的信号只有一种低频率信号250KHz高频信号7.5MHz被滤除了。为了波形更加的美观取 16 个之后的滤波数据作为有效输出。  波形局部放大后如下图所示此时输入数据有效信号 en 与输出数据有效信号 valid 是周期50MHz相同的脉冲信号不是持续有效的。但工作时钟为 400MHz所以输出也会呈现为 50MHz 采样频率下的 250KHz 频率的正弦波信号。  
附录matlab 使用与《并行 FIR 滤波器设计》一致 生成 FIR 滤波器系数 
打开 matlab在命令窗口输入命令 fdatool。 
然后会打开如下窗口按照 FIR 滤波器参数进行设置如下所示。 
这里选择的 FIR 实现方法是最小二乘法Least-squares不同的实现方式滤波效果也不同。  点击 File - Export 
将滤波器参数输出存到变量 coef 中如下图所示。  
此时 coef 变量应该是浮点型数据。对其进行一定倍数的相乘扩大然后取其近似的定点型数据作为设计中的 FIR 滤波器参数。这里取扩大倍数为 2048结果如下所示。 生成输入的混合信号 
利用 matlab 生成混合的输入信号参考代码如下。 
信号为无符号定点型数据位宽宽度为 12bit存于文件 cosx0p25m7p5m12bit.txt 。 
clear all;close all;clc;
%
% generating a cos wave data with txt hex format
%fc           0.25e6 ;      % 中心频率
fn           7.5e6 ;       % 杂波频率
Fs           50e6 ;        % 采样频率
T            1/fc ;        % 信号周期
Num          Fs * T ;      % 周期内信号采样点数
t            (0:Num-1)/Fs ;      % 离散时间
cosx         cos(2*pi*fc*t) ;    % 中心频率正弦信号
cosn         cos(2*pi*fn*t) ;    % 杂波信号
cosy         mapminmax(cosx  cosn) ;     %幅值扩展到-1,1 之间
cosy_dig     floor((2^11-1) * cosy  2^11) ;     %幅值扩展到 0~4095
fid          fopen(cosx0p25m7p5m12bit.txt, wt) ;  %写数据文件
fprintf(fid, %x\n, cosy_dig) ;
fclose(fid) ;%时域波形
figure(1);
subplot(121);plot(t,cosx);hold on ;
plot(t,cosn) ;
subplot(122);plot(t,cosy_dig) ;%频域波形
fft_cosy     fftshift(fft(cosy, Num)) ;
f_axis       (-Num/2 : Num/2 - 1) * (Fs/Num) ;
figure(5) ;
plot(f_axis, abs(fft_cosy)) ;