在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2584|回复: 1

[求助] 信号发生器和FIR低通滤波器如何进行数据传输

[复制链接]
发表于 2016-1-25 18:20:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
两个信号发生器分别产生200Hz和800Hz的信号,最后用加法得到的结果输入到低通滤波器,用signaltapii进行的板极调试,问题是结果仅仅是输入的幅值增大,没有产生滤波效果。FIR低通滤波器的功能模块用modelsim仿真正确,激励的产生是用matlab。如何才能让信号发生器和FIR低通滤波器有正确的数据传输,或者如何才能在板极调试的过程中FIR低通滤波器的激励如何提供?本人小白,有什么没有描述清楚的,可以具体讨论呐~谢谢大家的帮忙啦,纠结好久了

FIR源程序





  1. module FirFullSerial (
  2.         rst,clk,Xin,Yout);
  3.        
  4.         input                rst;   //复位信号,高电平有效
  5.         input                clk;   //FPGA系统时钟,频率为16kHz
  6.         input         signed [11:0]        Xin;  //数据输入频率为2khZ
  7.         output signed [28:0]        Yout; //滤波后的输出数据


  8.         //实例化有符号数乘法器IP核mult
  9.    reg  signed [11:0] coe;   //滤波器为12比特量化数据
  10.         wire signed [12:0] add_s; //输入为12比特量化数据,两个对称系数相加需要13比特存储
  11.         wire signed [24:0] Mout;  
  12.         mult        Umult (
  13.                 .clock (clk),
  14.                 .dataa (coe),
  15.                 .datab (add_s),
  16.                 .result (Mout));

  17.         //实例化有符号数加法器IP核,对输入数据进行1位符号位扩展,输出结果为13比特数据
  18.         reg signed [12:0] add_a;
  19.         reg signed [12:0] add_b;
  20.         adder Uadder (
  21.                 .dataa (add_a),
  22.                 .datab (add_b),
  23.                 .result (add_s));       
  24.                
  25.         //3位计数器,计数周期为8,为输入数据速率
  26.         reg [2:0] count;
  27.         always @(posedge clk or posedge rst)
  28.                 if (rst)
  29.                         count = 3'd0;
  30.                 else
  31.                         count = count + 1;
  32.        
  33.         //将数据存入移位寄存器Xin_Reg中
  34.         reg [11:0] Xin_Reg[15:0];
  35.         reg [3:0] i,j;
  36.         always @(posedge clk or posedge rst)
  37.                 if (rst)
  38.                         //初始化寄存器值为0
  39.                         begin
  40.                                 for (i=0; i<15; i=i+1)
  41.                                         Xin_Reg[i]=12'd0;
  42.                         end
  43.                 else
  44.                         begin
  45.                                 if (count==7)
  46.                                         begin
  47.                                                 for (j=0; j<15; j=j+1)
  48.                                                         Xin_Reg[j+1] <= Xin_Reg[j];
  49.                                                 Xin_Reg[0] <= Xin;
  50.                                         end
  51.                         end
  52.                        
  53.         //将对称系数的输入数据相加,同时将对应的滤波器系数送入乘法器
  54.         //需要注意的是,下面程序只使用了一个加法器及一个乘法器资源
  55.         //以8倍数据速率调用乘法器IP核,由于滤波器长度为16,系数具有对称性,故可在一个数据
  56.         //周期内完成所有8个滤波器系数与数据的乘法运算
  57.         //为了保证加法运算不溢出,输入输出数据均扩展为13比特。
  58.         always @(posedge clk or posedge rst)
  59.                 if (rst)
  60.                         begin
  61.                                 add_a <= 13'd0;
  62.                                 add_b <= 13'd0;
  63.                                 coe <= 12'd0;
  64.                         end
  65.                 else
  66.                         begin
  67.                                 if (count==3'd0)
  68.                                         begin
  69.                                                 add_a <= {Xin_Reg[0][11],Xin_Reg[0]};
  70.                                                 add_b <= {Xin_Reg[15][11],Xin_Reg[15]};
  71.                                                 coe <= 12'h000;//c0
  72.                                         end
  73.                                 else if (count==3'd1)
  74.                                         begin
  75.                                                 add_a <= {Xin_Reg[1][11],Xin_Reg[1]};
  76.                                                 add_b <= {Xin_Reg[14][11],Xin_Reg[14]};                                       
  77.                                                 coe <= 12'hffd; //c1
  78.                                         end
  79.                                 else if (count==3'd2)
  80.                                         begin
  81.                                                 add_a <= {Xin_Reg[2][11],Xin_Reg[2]};
  82.                                                 add_b <= {Xin_Reg[13][11],Xin_Reg[13]};                                               
  83.                                                 coe <= 12'h00f; //c2
  84.                                         end
  85.                                 else if (count==3'd3)
  86.                                         begin
  87.                                                 add_a <= {Xin_Reg[3][11],Xin_Reg[3]};
  88.                                                 add_b <= {Xin_Reg[12][11],Xin_Reg[12]};
  89.                                                 coe <= 12'h02e; //c3
  90.                                         end
  91.                                 else if (count==3'd4)
  92.                                         begin
  93.                                                 add_a <= {Xin_Reg[4][11],Xin_Reg[4]};
  94.                                                 add_b <= {Xin_Reg[11][11],Xin_Reg[11]};                                               
  95.                                                 coe <= 12'hf8b; //c4
  96.                                         end
  97.                                 else if (count==3'd5)
  98.                                         begin
  99.                                                 add_a <= {Xin_Reg[5][11],Xin_Reg[5]};
  100.                                                 add_b <= {Xin_Reg[10][11],Xin_Reg[10]};                               
  101.                                                 coe <= 12'hef9; //c5
  102.                                         end                                       
  103.                                 else if (count==3'd6)
  104.                                         begin
  105.                                                 add_a <= {Xin_Reg[6][11],Xin_Reg[6]};
  106.                                                 add_b <= {Xin_Reg[9][11],Xin_Reg[9]};                                               
  107.                                                 coe <= 12'h24e; //c6
  108.                                         end
  109.                                 else
  110.                                         begin
  111.                                                 add_a <= {Xin_Reg[7][11],Xin_Reg[7]};
  112.                                                 add_b <= {Xin_Reg[8][11],Xin_Reg[8]};                                               
  113.                                                 coe <= 12'h7ff; //c7
  114.                                         end
  115.                         end

  116.         //对滤波器系数与输入数据的乘法结果进行累加,并输出滤波后的数据
  117.         //考虑到乘法器及累加器的延时,需要计数器为2时对累加器清零,同时输出滤波器结果数据。
  118.         //类似的时延长度一方面可通过精确计算获取,但更好的方法是通过行为仿真查看
  119.         reg signed [28:0] sum;
  120.         reg signed [28:0] yout;
  121.         always @(posedge clk or posedge rst)
  122.                 if (rst)
  123.                         begin
  124.                                 sum = 29'd0;
  125.                                 yout <= 29'd0;
  126.                         end
  127.                 else
  128.                         begin
  129.                                 if (count==2)
  130.                                         begin
  131.                                                 yout <= sum;
  132.                                                 sum = 29'd0;
  133.                                                 sum =sum + Mout;
  134.                                         end
  135.                                 else
  136.                                    sum = sum + Mout;
  137.                         end
  138.        
  139.         assign Yout = yout;
  140.                        
  141. endmodule



复制代码



testbench仿真程序




  1. `timescale 1 ns/ 1 ns //设置仿真时间单位:ns
  2. module FirFullSerial_vlg_tst();
  3. // constants                                          
  4. // general purpose registers
  5. reg eachvec;
  6. // test vector input registers
  7. reg [11:0] Xin;
  8. reg clk;
  9. reg rst;
  10. reg clk_data; //数据时钟,速率为系统时钟clk的1/8;
  11. // wires                                               
  12. wire [28:0]  Yout;

  13. // assign statements (if any)                          
  14. FirFullSerial i1 (
  15. // port map - connection between master ports and signals/registers   
  16.         .Xin(Xin),
  17.         .Yout(Yout),
  18.         .clk(clk),
  19.         .rst(rst)
  20. );

  21. parameter clk_period=625; //设置时钟信号周期(频率):1.6MHz
  22. parameter clk_period_data=clk_period*8;
  23. parameter clk_half_period=clk_period/2;
  24. parameter clk_half_period_data=clk_half_period*8;
  25. parameter data_num=2000;  //仿真数据长度
  26. parameter time_sim=data_num*clk_period; //仿真时间

  27. initial
  28. begin
  29.         //设置时钟信号初值
  30.         clk=1;
  31.         clk_data=1;
  32.         //设置复位信号
  33.         rst=1;
  34.         #1000 rst=0;
  35.         //设置仿真时间
  36.         #time_sim $finish;
  37.         //设置输入信号初值
  38.         Xin=12'd10;
  39. end

  40. //产生时钟信号
  41. always                                                
  42.         #clk_half_period clk=~clk;
  43. always
  44.         #clk_half_period_data clk_data=~clk_data;

  45. //从外部TX文件(SinIn.txt)读入数据作为测试激励
  46. integer Pattern;
  47. reg [11:0] stimulus[1:data_num];
  48. initial
  49. begin

  50.         $readmemb("E4_7_Bin_noise.txt",stimulus);
  51.         //$readmemb("E4_7_Bin_s.txt",stimulus);
  52.         Pattern=0;
  53.         repeat(data_num)
  54.                 begin
  55.                         Pattern=Pattern+1;
  56.                         Xin=stimulus[Pattern];
  57.                         #clk_period_data;//数据周期为时钟周期的8倍
  58.                 end
  59. end


  60. //将仿真数据dout写入外部TXT文件中(out.txt)
  61. integer file_out;
  62. initial
  63. begin
  64.    //文件放置在"工程目录\simulation\modelsim"路径下                                                  
  65.         file_out = $fopen("E4_7_Noiseout.txt");
  66.         //file_out = $fopen("E4_7_Sout.txt");
  67.         if(!file_out)
  68.                 begin
  69.                         $display("could not open file!");
  70.                         $finish;
  71.                 end
  72. end
  73. wire rst_write;
  74. wire signed [28:0] dout_s;
  75. assign dout_s = Yout;                //将dout转换成有符号数据
  76. assign rst_write = clk_data & (!rst);//产生写入时钟信号,复位状态时不写入数据
  77. always @(posedge rst_write )
  78.         $fdisplay(file_out,"%d",dout_s);
  79.        
  80. endmodule


复制代码



 楼主| 发表于 2016-1-25 19:34:23 | 显示全部楼层
整体.jpg 详细.jpg 这是我的原理图
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 20:37 , Processed in 0.021831 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表