找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4395|回复: 2
打印 上一主题 下一主题
收起左侧

MATLAB+VHDL脉冲成型滤波器的设计 附代码

[复制链接]
跳转到指定楼层
楼主
文中应用了MATLAB和VHDL联合设计,提出基于电路分割技术实现通信系统发送端根升余弦波形成型滤波器查表法的FPGA结构,节省了ROM单元,讨论其ROM初始化时波形数据的组织方法,完成了该结构VHDL实现,最后给出使用查找表在FPGA上实现基带脉冲成型滤波器的设计方法和ModelSim环境下的仿真结果
方案1:卷积法的原理,是用一系列乘法和加法对信号进行流水线运算,需要消耗大量的乘法器和加法器,设计较复杂,并有一定的延时。这是一种分布式算法的设计结构,将传统的乘法运算和累加运算加以改进,转变为移位、累加运算,降低了硬件消耗,当运算数据的字宽较小时,极大的降低了硬件电路的复杂度,提高了响应速度;但当运算数据的字长较长时,则需要更多的移位迭代运算而不适合高速处理的需求。
方案2:查表法的原理,采用二进制基带信号的连续查表法实现在FPGA上完成信号的脉冲成型,原理是预先将所有可能的成形后的基带波形样本存入ROM,根据输入序列,从ROM中查找对应输出波形,这种方法简单直观、速度快,且当码间样点增加时,仅增长地址电路即可,不影响运行时间,可在一定的精度内高效的实现脉冲成型滤波。

  总体框图

本次设计首先利用MATLAB中的FDAtool工具设计出一个采样频率为10MHZ、截止频率为50KHZ、滚降系数为0.35的升余弦滚降滤波器,通过FDAtool导出16点系数,然后将系数进行放大、取整,以便于在FPGA中使用,最后通过QuartusII进行Verilog语言编写滤波器算法,然后通过Modesim仿真结果和MATLAB仿真结果的比较来验证该滤波器的正确性
(1) 首先,在MATLAB command window 命令窗内输入 FDAtool命令,按Enter,出现FDAtool界面,FDAtool界面如图所示。


(2)设置本课题要求的平方根升余弦滤波器的参数,设置的参数见界面如图所示。本次课题采用海明窗,Fc设置为20KHZ,滚降系数设置为0.35,采样频率设置为10MHZ,阶数设置为17,即n=16。然后点击点击“designfilter”按钮。

(3)查看平方根升余弦滤波器的幅度响应图
(4)接着用MATLAB中simulink,构建滤波器仿真模块,simulink仿真如图所示。

二 FPGA
以下是用FIR核实现平方根升余弦滚降滤波器的步骤:
(1)打开Quartus II 软件,新建一个“project”。点击“tool”打开“IP Catalog”界面。

(2)在“Import from file”里导入滤波器系其频谱图如所示。

导入的系数是前面MATLAB FDAtool中生成的滤波器系数。

(3)将我们准备好的测试文件FIR_filter_tb.v和DDS .v拷贝至工程目录文件夹下,文件添加界面如图所示。

Assignment->setting->EDA tool setting->simulation->testbenches添加仿真文件。

(4)ModelSim仿真
直接启动仿真软件Modelsim-Altera,并显示仿真波形数据(模拟形式显示)
data1 信号为 24KHz 正弦波,量化位宽为 12bit
data2 信号为 240KHz 正弦波,量化位宽为 12bit
data_in 信号为 data1 和 data2 的叠加信号,量化位宽为13bit

data_out 信号为 data_in信号经过 FIR 数字滤波后的输出,量化位宽为 28bit。仿真结果如图所示。

最后可知 matlab和FPGA的滤波结果相同。
  1. 附 录
  2. FIR_filter_tb.v
  3. // --------------------------------------------------------------------
  4. // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
  5. // --------------------------------------------------------------------
  6. // Module: FIR_filter_tb
  7. //
  8. // Author: Step
  9. //
  10. // Description: FIR_filter_tb
  11. //
  12. // --------------------------------------------------------------------
  13. // Code Revision History :
  14. // --------------------------------------------------------------------
  15. `timescale 1ps/1ps

  16. module FIR_filter_tb;

  17. parameter PERIOD = 20;
  18. reg clk, rst_n;
  19. wire signed [26:0] data_out;

  20. initial begin
  21. clk = 0;
  22. rst_n = 0;
  23. #100;
  24. rst_n = 1;
  25. #6000;
  26. $stop;
  27. end
  28. always #10 clk = ~clk;

  29. wire signed[9:0] data1;
  30. DDS dds_24k
  31. (
  32. .clk_in(clk), //clock in
  33. .rst_n_in(rst_n), //reset, active low
  34. .dds_en_in(1), //dds work enable
  35. .f_increment(24'h60000), //frequency increment
  36. .p_increment(0), //phase increment
  37. .dac_data_out(data1) //data out
  38. );

  39. wire signed[9:0] data2;
  40. DDS dds_240k
  41. (
  42. .clk_in(clk), //clock in
  43. .rst_n_in(rst_n), //reset, active low
  44. .dds_en_in(1), //dds work enable
  45. .f_increment(24'h3c0000), //frequency increment
  46. .p_increment(0), //phase increment
  47. .dac_data_out(data2) //data out
  48. );

  49. wire signed[10:0] data_in = data1 + data2;
  50. FIR_Filter u0 (
  51. .ast_sink_data (data_in), // avalon_streaming_sink.data
  52. .ast_sink_valid (1), // .valid
  53. .ast_sink_error (0), // .error
  54. .ast_source_data (data_out), // avalon_streaming_source.data
  55. .ast_source_valid (), // .valid
  56. .ast_source_error (), // .error
  57. .clk (clk), // clk.clk
  58. .reset_n (rst_n) // rst.reset_n
  59. );

  60. endmodule


  61. DDS.v
  62. // --------------------------------------------------------------------
  63. // >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
  64. // --------------------------------------------------------------------
  65. // Module: DDS
  66. //
  67. // Author: Step
  68. //
  69. // Description: DDS
  70. //
  71. // --------------------------------------------------------------------
  72. // Code Revision History :
  73. // --------------------------------------------------------------------
  74. module DDS
  75. (
  76. input clk_in, //clock in
  77. input rst_n_in, //reset, active low
  78. input dds_en_in, //dds work enable
  79. input [23:0] f_increment, //frequency increment
  80. input [23:0] p_increment, //phase increment
  81. output dac_clk_out, //clock out
  82. output [9:0] dac_data_out //data out
  83. );
  84. reg [23:0] phase_accumulator;
  85. wire [23:0] phase;
  86. //wire [9:0] dac_data_out;
  87. assign dac_clk_out = clk_in;
  88. //next_phase = phase_accumulator + f_increment;
  89. always @(posedge clk_in or negedge rst_n_in)
  90. begin
  91. if(!rst_n_in) phase_accumulator <= 23'b0;
  92. else if(dds_en_in) phase_accumulator <= phase_accumulator + f_increment;
  93. end
  94. assign phase = phase_accumulator + p_increment; // phase is the high 8 bits
  95. lookup_table lookup_table_uut
  96. (
  97. .phase(phase[23:16]),
  98. .dac_data_out(dac_data_out)
  99. );
  100. endmodule
  101. /**************************************************
  102. module: lookup_table
  103. **************************************************/
  104. module lookup_table
  105. (
  106. input [7:0] phase,
  107. output reg [9:0] dac_data_out
  108. );
  109. wire [5:0] address = phase[5:0];
  110. wire [1:0] sel = phase[7:6];
  111. wire [9:0] sine;
  112. always@(sel or sine)
  113. case (sel)
  114. 2'b00 : dac_data_out = {1'b0, sine[9:1]};
  115. 2'b01 : dac_data_out = {1'b0, sine[9:1]};
  116. 2'b10 : dac_data_out = {1'b1, 9'h1ff-sine[9:1]};
  117. 2'b11 : dac_data_out = {1'b1, 9'h1ff-sine[9:1]};
  118. endcase
  119. sine_table sine_table_uut
  120. (
  121. .sel(sel),
  122. .address(address),
  123. .sine(sine)
  124. );

  125. endmodule
  126. /**************************************************
  127. module: sine_table
  128. **************************************************/
  129. module sine_table
  130. (
  131. input [1:0] sel,
  132. input [5:0] address,
  133. output reg [9:0] sine
  134. );
  135. reg [5:0] table_addr;
  136. always @(sel or address)
  137. case (sel)
  138. 2'b00: table_addr = address;
  139. 2'b01: table_addr = 6'h3f - address;
  140. 2'b10: table_addr = address;
  141. 2'b11: table_addr = 6'h3f - address;
  142. endcase
  143. always @(table_addr)
  144. case(table_addr)
  145. 6'h0: sine=10'h000;
  146. 6'h1: sine=10'h019;
  147. 6'h2: sine=10'h032;
  148. 6'h3: sine=10'h04B;
  149. 6'h4: sine=10'h064;
  150. 6'h5: sine=10'h07D;
  151. 6'h6: sine=10'h096;
  152. 6'h7: sine=10'h0AF;
  153. 6'h8: sine=10'h0C4;
  154. 6'h9: sine=10'h0E0;
  155. 6'ha: sine=10'h0F9;
  156. 6'hb: sine=10'h111;
  157. 6'hc: sine=10'h128;
  158. 6'hd: sine=10'h141;
  159. 6'he: sine=10'h159;
  160. 6'hf: sine=10'h170;
  161. 6'h10: sine=10'h187;
  162. 6'h11: sine=10'h19F;
  163. 6'h12: sine=10'h1B5;
  164. 6'h13: sine=10'h1CC;
  165. 6'h14: sine=10'h1E2;
  166. 6'h15: sine=10'h1F8;
  167. 6'h16: sine=10'h20E;
  168. 6'h17: sine=10'h223;
  169. 6'h18: sine=10'h238;
  170. 6'h19: sine=10'h24D;
  171. 6'h1a: sine=10'h261;
  172. 6'h1b: sine=10'h275;
  173. 6'h1c: sine=10'h289;
  174. 6'h1d: sine=10'h29C;
  175. 6'h1e: sine=10'h2AF;
  176. 6'h1f: sine=10'h2C1;
  177. 6'h20: sine=10'h2D3;
  178. 6'h21: sine=10'h2E5;
  179. 6'h22: sine=10'h2F6;
  180. 6'h23: sine=10'h307;
  181. 6'h24: sine=10'h317;
  182. 6'h25: sine=10'h326;
  183. 6'h26: sine=10'h336;
  184. 6'h27: sine=10'h344;
  185. 6'h28: sine=10'h353;
  186. 6'h29: sine=10'h360;
  187. 6'h2a: sine=10'h36D;
  188. 6'h2b: sine=10'h37A;
  189. 6'h2c: sine=10'h386;
  190. 6'h2d: sine=10'h392;
  191. 6'h2e: sine=10'h39C;
  192. 6'h2f: sine=10'h3A7;
  193. 6'h30: sine=10'h3B1;
  194. 6'h31: sine=10'h3BA;
  195. 6'h32: sine=10'h3C3;
  196. 6'h33: sine=10'h3CB;
  197. 6'h34: sine=10'h3D3;
  198. 6'h35: sine=10'h3DA;
  199. 6'h36: sine=10'h3E0;
  200. 6'h37: sine=10'h3E6;
  201. 6'h38: sine=10'h3EB;
  202. 6'h39: sine=10'h3F0;
  203. 6'h3a: sine=10'h3F3;
  204. 6'h3b: sine=10'h3F7;
  205. 6'h3c: sine=10'h3FA;
  206. 6'h3d: sine=10'h3FC;
  207. 6'h3e: sine=10'h3FE;
  208. 6'h3f: sine=10'h3FF;
  209. endcase
  210. endmodule
复制代码


全部资料51hei下载地址:
FIR_Filter.zip (1.14 MB, 下载次数: 28)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:514491 发表于 2019-4-17 14:02 | 只看该作者
第一次发帖 有不好的地方请大家见谅
回复

使用道具 举报

板凳
ID:630326 发表于 2019-10-26 10:37 | 只看该作者
IKnown 发表于 2019-4-17 14:02
第一次发帖 有不好的地方请大家见谅

您好,FPGA小白一个。想照着您这个流程顺序走一遍,但无奈基础太弱,作者能不能再具体一些啊,如何具体的matlab设计步骤以及后来对比分析,能让我们这种小白完全顺着来一遍
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表