回答

收藏

【转】基于FPGA的IIR滤波器

FPGA/DSP FPGA/DSP 4216 人阅读 | 0 人回复 | 2017-07-24

基于FPGA的IIR滤波器
                                                        by方阳

1.说明
这是之前EDA做的综合大实验,拿出来和大家分享分享!
先说一下,此篇文章是基于你有IIR滤波器的原理和FPGA语言(也就是Verilog HDL)基础上的!至于IIR滤波器的原理和Verilog HDL语言,我这里就不说了,网上有一大堆的资料可以观看,IIR可以看数字信号处理的书或直接百度,Verilog HDL推荐《Hello,FPGA》!
申明一下,这边博客很长,请做好心理准备!!!
说明:这个IIR滤波器我是用芯航线FPGA开发板——cyclone IV E EP4CE10F1708实现的,还用了ADDA模块——集成TLC1544 ADC采集芯片和TLC5620 DAC 输出芯片,软件平台是quartus13.0,测试用的是信号发生器和示波器。
这个共有一个顶层文件,十一个子文件,子文件其中一个是IIR滤波器的顶层文件。拓扑图如下:

2.参考代码
相应的代码如下
2.1 顶层文件IIR_FY_TOP.V
  1. module IIR_FY_TOP
  2. (
  3.     Clk,
  4.     Rst_n,
  5.    
  6.     TLC5620_CLK,
  7.     TLC5620_DATA,
  8.     TLC5620_LOAD,
  9.     TLC5620_LDAC,
  10.    
  11.     TLV1544_SDO,   
  12.     TLV1544_SDI,   
  13.     TLV1544_SCLK,   
  14.     TLV1544_NCS,   
  15.     TLV1544_FS,
  16.     TLV1544_EOC

  17. );

  18.     input Clk;
  19.     input Rst_n;

  20.     output TLC5620_CLK;
  21.     output TLC5620_DATA;
  22.     output TLC5620_LOAD;
  23.     output TLC5620_LDAC;
  24.    
  25.     input TLV1544_SDO;   
  26.     output TLV1544_SDI;   
  27.     output TLV1544_SCLK;   
  28.     output TLV1544_NCS;   
  29.     output TLV1544_FS;
  30.     input TLV1544_EOC;
  31.    
  32.     wire AD_DONE;
  33.     wire [9:0]ADC_DATA;
  34.     wire DATA_Valid;
  35.     wire [10:0]CtrlWord;
  36.     wire signed[15:0] din;
  37.     wire signed[15:0] dout;

  38.    
  39.     TLV1544_CTRL TLV1544_CTRL0(

  40.         .Clk(Clk),
  41.         .Rst_n(Rst_n),
  42.         
  43.         .Do_Conv(1'b1),    //开始转换使能信号
  44.         .AD_DONE(AD_DONE),    //转换完成信号
  45.         .ADC_CHSEL(4'b0),    //通道选择
  46.         
  47.         .ADC_DATA(ADC_DATA),    //采样结果
  48.         .DATA_Valid(DATA_Valid),
  49.         
  50.         .TLV1544_SDO(TLV1544_SDO),   
  51.         .TLV1544_SDI(TLV1544_SDI),   
  52.         .TLV1544_SCLK(TLV1544_SCLK),   
  53.         .TLV1544_NCS(TLV1544_NCS),   
  54.         .TLV1544_FS(TLV1544_FS),
  55.         .TLV1544_EOC(TLV1544_EOC)
  56.     );
  57.    
  58.     ADC_to_filter ADC_to_filter0(

  59.     .ADC_DATA(ADC_DATA),
  60.     .din(din)

  61.     );
  62.    
  63.      myiir myiir0(
  64.         .rst(Rst_n),
  65.         .clk(Clk),
  66.         .din(din),
  67.         .dout(dout),
  68.         .din_valid(DATA_Valid),
  69.         .dout_valid()
  70.         );
  71.         
  72.     filter_to_DAC filter_to_DAC0(
  73.           .dout(dout),
  74.           .CtrlWord(CtrlWord)
  75.         );
  76.         
  77.         TLC5620_CTRL TLC5620_CTRL0(
  78.         .Clk(Clk),
  79.         .Rst_n(Rst_n),
  80.         .UpdateReq(1'b1),
  81.         .CtrlWord(CtrlWord),

  82.         .UpdateDone(),
  83.         .TLC5620_CLK(TLC5620_CLK),
  84.         .TLC5620_DATA(TLC5620_DATA),
  85.         .TLC5620_LOAD(TLC5620_LOAD),
  86.         .TLC5620_LDAC(TLC5620_LDAC)
  87.     );        
  88.                     
  89. endmodule
复制代码
2.2 TLV1544驱动

TLV1544_CTRL.V
  1. module TLV1544_CTRL(

  2.     Clk,
  3.     Rst_n,
  4.    
  5.     Do_Conv,    //开始转换使能信号
  6.     AD_DONE,    //转换完成信号
  7.     ADC_CHSEL,    //通道选择
  8.    
  9.     ADC_DATA,    //采样结果
  10.     DATA_Valid,
  11.    
  12.     TLV1544_SDO,   
  13.     TLV1544_SDI,   
  14.     TLV1544_SCLK,   
  15.     TLV1544_NCS,   
  16.     TLV1544_FS,
  17.     TLV1544_EOC
  18. );

  19.     input Clk;
  20.     input Rst_n;
  21.     input Do_Conv;    //开始转换使能信号

  22.     input [3:0]ADC_CHSEL;    //通道选择
  23.    
  24.     output reg [9:0]ADC_DATA;    //采样结果
  25.     output reg AD_DONE;    //转换完成信号
  26.     output reg DATA_Valid;
  27.    
  28.     input TLV1544_SDO;
  29.     input TLV1544_EOC;
  30.     output reg TLV1544_SDI;   
  31.     output reg TLV1544_SCLK;   
  32.     output reg TLV1544_NCS;
  33.     output wire TLV1544_FS;
  34.    
  35.     assign TLV1544_FS = 1'b1;
  36.    
  37.     reg [7:0] LSM_CNT;//序列计数器
  38.     reg [9:0] rADC_DATA;
  39.    
  40.     always@(posedge Clk or negedge Rst_n)
  41.     if(!Rst_n)
  42.         LSM_CNT <= 8'd0;
  43.     else if(LSM_CNT <204 && (TLV1544_EOC == 1'b1) && (Do_Conv || LSM_CNT > 8'd0))
  44.         LSM_CNT <= LSM_CNT + 1'b1;
  45.     else if(LSM_CNT < 204 && (TLV1544_EOC == 1'b0))
  46.         LSM_CNT <= LSM_CNT;
  47.     else if(LSM_CNT == 204 && (TLV1544_EOC == 1'b1))
  48.         LSM_CNT <= 8'd0;
  49.         
  50.     always@(posedge Clk or negedge Rst_n)
  51.     if(!Rst_n)begin
  52.         rADC_DATA <= 10'd0;
  53.         TLV1544_SDI <= 1'b0;   
  54.         TLV1544_SCLK <= 1'b0;   
  55.         TLV1544_NCS <= 1'b1;   
  56.         AD_DONE <= 1'b0;
  57.         DATA_Valid <= 1'b0;
  58.         ADC_DATA <= 10'd0;
  59.     end
  60.     else begin
  61.         case(LSM_CNT)
  62.             0:
  63.                 begin
  64.                     rADC_DATA <= 10'd0;
  65.                     TLV1544_SDI <= 1'b0;   
  66.                     TLV1544_SCLK <= 1'b0;   
  67.                     TLV1544_NCS <= 1'b1;   
  68.                     AD_DONE <= 1'b0;
  69.                 end
  70.                
  71.             1:
  72.                 begin
  73.                     TLV1544_NCS <= 1'b0;   
  74.                     TLV1544_SDI <= ADC_CHSEL[3];   
  75.                 end
  76.                
  77.             9:
  78.                 begin
  79.                     TLV1544_SCLK <= 1'b1;
  80.                     rADC_DATA[9] <= TLV1544_SDO;
  81.                 end
  82.                
  83.             19:
  84.                 begin
  85.                     TLV1544_SDI <= ADC_CHSEL[2];
  86.                     TLV1544_SCLK <= 1'b0;            
  87.                 end
  88.             
  89.             29:
  90.                 begin
  91.                     TLV1544_SCLK <= 1'b1;
  92.                     rADC_DATA[8] <= TLV1544_SDO;
  93.                 end
  94.                
  95.             39:
  96.                 begin
  97.                     TLV1544_SDI <= ADC_CHSEL[1];
  98.                     TLV1544_SCLK <= 1'b0;            
  99.                 end
  100.                
  101.             49:
  102.                 begin
  103.                     TLV1544_SCLK <= 1'b1;
  104.                     rADC_DATA[7] <= TLV1544_SDO;
  105.                 end
  106.                
  107.             59:
  108.                 begin
  109.                     TLV1544_SDI <= ADC_CHSEL[0];
  110.                     TLV1544_SCLK <= 1'b0;            
  111.                 end
  112.                
  113.             69:
  114.                 begin
  115.                     TLV1544_SCLK <= 1'b1;
  116.                     rADC_DATA[6] <= TLV1544_SDO;
  117.                 end
  118.                
  119.             79:TLV1544_SCLK <= 1'b0;
  120.             
  121.             89:
  122.                 begin
  123.                     TLV1544_SCLK <= 1'b1;
  124.                     rADC_DATA[5] <= TLV1544_SDO;
  125.                 end
  126.             99:TLV1544_SCLK <= 1'b0;
  127.             
  128.             109:
  129.                 begin
  130.                     TLV1544_SCLK <= 1'b1;
  131.                     rADC_DATA[4] <= TLV1544_SDO;
  132.                 end
  133.                
  134.             119:TLV1544_SCLK <= 1'b0;
  135.             
  136.             129:
  137.                 begin
  138.                     TLV1544_SCLK <= 1'b1;
  139.                     rADC_DATA[3] <= TLV1544_SDO;
  140.                 end
  141.                
  142.            139:TLV1544_SCLK <= 1'b0;
  143.             
  144.            149:
  145.                 begin
  146.                     TLV1544_SCLK <= 1'b1;
  147.                     rADC_DATA[2] <= TLV1544_SDO;
  148.                 end
  149.                
  150.             159:TLV1544_SCLK <= 1'b0;
  151.             
  152.             169:
  153.                 begin
  154.                     TLV1544_SCLK <= 1'b1;
  155.                     rADC_DATA[1] <= TLV1544_SDO;
  156.                 end
  157.                
  158.            179:TLV1544_SCLK <= 1'b0;
  159.             
  160.           189:
  161.                 begin
  162.                     TLV1544_SCLK <= 1'b1;
  163.                     //rADC_DATA[0] <= TLV1544_SDO;
  164.                     if(TLV1544_EOC)
  165.                         DATA_Valid <= 1'b1;
  166.                     else
  167.                         DATA_Valid <= 1'b0;
  168.                     ADC_DATA <= {rADC_DATA[9:1],TLV1544_SDO};
  169.                 end
  170.                
  171.           199:
  172.                 begin
  173.                     TLV1544_SCLK <= 1'b0;
  174.                     TLV1544_NCS <= 1'b1;
  175.                 end
  176.                
  177.             204:AD_DONE <= 1'b1;
  178.             
  179.             default:DATA_Valid <= 1'b0;
  180.         endcase
  181.     end

  182. endmodule
复制代码
2.3 ADC转filter模块

ADC_to_filter.V
  1. module ADC_to_filter (

  2. ADC_DATA,
  3. din

  4. );

  5. input        [9:0]ADC_DATA;
  6. output signed[15:0]din;

  7. assign din = ADC_DATA<<6;


  8. endmodule
复制代码
2.4 myiir模块
myiir.V
  1. module myiir(
  2. rst,
  3. clk,
  4. din,
  5. dout,
  6. din_valid,
  7. dout_valid,
  8. );
  9. input rst;
  10. input clk;
  11. input signed[15:0] din;
  12. input din_valid;
  13. output reg signed[15:0] dout;
  14. output reg dout_valid;

  15. wire signed[15:0] dout1;
  16. wire signed[15:0] dout2;
  17. wire signed[15:0] dout3;
  18. wire signed[15:0] dout4;
  19. wire signed[15:0] dout5;
  20. wire signed[15:0] dout_reg;

  21. wire din_valid1;
  22. wire dout_valid1;
  23. wire din_valid2;
  24. wire dout_valid2;
  25. wire din_valid3;
  26. wire dout_valid3;
  27. wire din_valid4;
  28. wire dout_valid4;
  29. wire din_valid5;
  30. wire dout_valid5;
  31. wire din_valid6;
  32. wire dout_valid6;

  33. assign din_valid1=din_valid;
  34. assign din_valid2=dout_valid1;
  35. assign din_valid3=dout_valid2;
  36. assign din_valid4=dout_valid3;
  37. assign din_valid5=dout_valid4;
  38. assign din_valid6=dout_valid5;

  39. //assign dout_prevalid=dout_valid1;

  40. myiir_first_step U1(
  41. .rst(rst),
  42. .clk(clk),
  43. .din(din),
  44. .dout(dout1),
  45. .din_valid(din_valid1),
  46. .dout_valid(dout_valid1)
  47. );

  48. myiir_second_step U2(
  49. .rst(rst),
  50. .clk(clk),
  51. .din(dout1),
  52. .dout(dout2),
  53. .din_valid(din_valid2),
  54. .dout_valid(dout_valid2)
  55. );

  56. myiir_third_step U3(
  57. .rst(rst),
  58. .clk(clk),
  59. .din(dout2),
  60. .dout(dout3),
  61. .din_valid(din_valid3),
  62. .dout_valid(dout_valid3)
  63. );

  64. myiir_fourth_step U4(
  65. .rst(rst),
  66. .clk(clk),
  67. .din(dout3),
  68. .dout(dout4),
  69. .din_valid(din_valid4),
  70. .dout_valid(dout_valid4)
  71. );

  72. myiir_fifth_step U5(
  73. .rst(rst),
  74. .clk(clk),
  75. .din(dout4),
  76. .dout(dout5),
  77. .din_valid(din_valid5),
  78. .dout_valid(dout_valid5)
  79. );

  80. myiir_sixth_step U6(
  81. .rst(rst),
  82. .clk(clk),
  83. .din(dout5),
  84. .dout(dout_reg),
  85. .din_valid(din_valid6),
  86. .dout_valid(dout_valid6)
  87. );

  88. always @(negedge rst,posedge clk) begin
  89.         if(!rst) begin
  90.                 dout<=16'd0;
  91.                 dout_valid=1'b0;
  92.         end
  93.         else if(dout_valid6) begin
  94.                 dout_valid=1'b1;
  95.                 dout<=dout_reg;        
  96.         end
  97.         else begin
  98.                 dout<=dout;
  99.                 dout_valid=1'b0;
  100.         end
  101. end

  102. endmodule
复制代码
2.5 filter转DAC模块

filter_to_DAC.V
  1. module filter_to_DAC
  2. (
  3.   dout,
  4.   CtrlWord

  5. );

  6. input signed[15:0] dout;
  7. output [10:0]CtrlWord;

  8. assign CtrlWord[7:0]=dout[7:0];
  9. assign CtrlWord[10:8]=3'b0;


  10. endmodule
复制代码
2.6 TLC5620驱动
TLC5620_CTRL.V
  1. module TLC5620_CTRL(
  2.     Clk,
  3.     Rst_n,
  4.     UpdateReq,
  5.     CtrlWord,

  6.     UpdateDone,
  7.     TLC5620_CLK,
  8.     TLC5620_DATA,
  9.     TLC5620_LOAD,
  10.     TLC5620_LDAC
  11. );


  12.     input Clk;
  13.     input Rst_n;
  14.     input UpdateReq;
  15.     input [10:0]CtrlWord;

  16.     output reg UpdateDone;
  17.     output reg TLC5620_CLK;
  18.     output reg TLC5620_DATA;
  19.     output reg TLC5620_LOAD;
  20.     output reg TLC5620_LDAC;
  21.    
  22.     reg [9:0] Cnt;
  23.    
  24.     always@(posedge Clk or negedge Rst_n)
  25.     if(!Rst_n)
  26.         Cnt <= 10'd0;
  27.     else if(UpdateReq == 1 | (Cnt != 10'd0))begin
  28.         if(Cnt == 10'd820)
  29.             Cnt <= 10'd0;
  30.         else
  31.             Cnt <= Cnt + 10'd1;
  32.     end
  33.     else
  34.         Cnt <= 10'd0;

  35.     always@(posedge Clk or negedge Rst_n)
  36.     if(!Rst_n)begin
  37.         TLC5620_CLK <= 1'b0;
  38.         TLC5620_DATA <= 1'b0;
  39.         TLC5620_LOAD <= 1'b0;
  40.         TLC5620_LDAC <= 1'b0;
  41.         UpdateDone <= 1'b0;
  42.     end
  43.     else begin
  44.         case(Cnt)
  45.             0:
  46.                 begin         
  47.                     TLC5620_CLK <= 1'b0;
  48.                     TLC5620_DATA <= 1'b0;
  49.                     TLC5620_LOAD <= 1'b1;
  50.                     TLC5620_LDAC <= 1'b0;
  51.                     UpdateDone <= 1'b0;
  52.                 end
  53.             10:
  54.                 begin         
  55.                     TLC5620_CLK <= 1'b1;
  56.                     TLC5620_DATA <= CtrlWord[10];
  57.                 end
  58.             40: TLC5620_CLK <= 1'b0;
  59.                
  60.             70:
  61.                 begin         
  62.                     TLC5620_CLK <= 1'b1;
  63.                     TLC5620_DATA <= CtrlWord[9];
  64.                 end
  65.             
  66.             100: TLC5620_CLK <= 1'b0;
  67.             130:
  68.                 begin         
  69.                     TLC5620_CLK <= 1'b1;
  70.                     TLC5620_DATA <= CtrlWord[8];
  71.                 end
  72.             160: TLC5620_CLK <= 1'b0;
  73.             190:
  74.                 begin         
  75.                     TLC5620_CLK <= 1'b1;
  76.                     TLC5620_DATA <= CtrlWord[7];
  77.                 end
  78.             220: TLC5620_CLK <= 1'b0;
  79.             250:
  80.                 begin         
  81.                     TLC5620_CLK <= 1'b1;
  82.                     TLC5620_DATA <= CtrlWord[6];
  83.                 end
  84.             280: TLC5620_CLK <= 1'b0;
  85.             310:
  86.                 begin         
  87.                     TLC5620_CLK <= 1'b1;
  88.                     TLC5620_DATA <= CtrlWord[5];
  89.                 end
  90.             340: TLC5620_CLK <= 1'b0;
  91.             370:
  92.                 begin         
  93.                     TLC5620_CLK <= 1'b1;
  94.                     TLC5620_DATA <= CtrlWord[4];
  95.                 end
  96.             400: TLC5620_CLK <= 1'b0;
  97.             430:
  98.                 begin         
  99.                     TLC5620_CLK <= 1'b1;
  100.                     TLC5620_DATA <= CtrlWord[3];
  101.                 end
  102.             460: TLC5620_CLK <= 1'b0;
  103.             490:
  104.                 begin         
  105.                     TLC5620_CLK <= 1'b1;
  106.                     TLC5620_DATA <= CtrlWord[2];
  107.                 end
  108.             520: TLC5620_CLK <= 1'b0;
  109.             550:
  110.                 begin         
  111.                     TLC5620_CLK <= 1'b1;
  112.                     TLC5620_DATA <= CtrlWord[1];
  113.                 end
  114.             580: TLC5620_CLK <= 1'b0;
  115.             610:
  116.                 begin         
  117.                     TLC5620_CLK <= 1'b1;
  118.                     TLC5620_DATA <= CtrlWord[0];
  119.                 end
  120.             640: TLC5620_CLK <= 1'b0;
  121.             670:TLC5620_LOAD <= 1'b0;
  122.             800:TLC5620_LOAD <= 1'b1;
  123.             820:UpdateDone <= 1'b1;
  124.             default:;
  125.         endcase   
  126.     end

  127. endmodule
复制代码
2.7 myiir_first_step模块
myiir_first_step.V
  1. module myiir_first_step(
  2. rst,
  3. clk,
  4. din,
  5. dout,
  6. din_valid,
  7. dout_valid
  8. );

  9. parameter b0=16145;
  10. parameter b1=-23383;
  11. parameter b2=16145;
  12. parameter a1=-26283;
  13. parameter a2=14526;

  14. input rst;
  15. input clk;
  16. input signed[15:0] din;
  17. input din_valid;

  18. output signed[15:0] dout;
  19. output dout_valid;

  20. reg[4:0] cState,nState;
  21. reg signed[15:0] x_reg0;
  22. reg signed[15:0] x_reg1;

  23. reg signed[31:0] x_mul1;
  24. reg signed[31:0] x_mul2;
  25. reg signed[31:0] x_mul3;

  26. wire signed[15:0] x_int_mul1;
  27. wire signed[15:0] x_int_mul2;
  28. wire signed[15:0] x_int_mul3;

  29. reg signed[17:0] x_sum;
  30. wire signed[15:0] x_temp;

  31. reg signed[15:0] y_reg0;
  32. reg signed[15:0] y_reg1;

  33. reg signed[31:0] y_mul1;
  34. reg signed[31:0] y_mul2;

  35. wire signed[15:0] y_int_mul1;
  36. wire signed[15:0] y_int_mul2;

  37. reg signed[16:0] y_sum;
  38. wire signed[15:0] y_temp;

  39. reg signed[16:0] dout_sum;
  40. wire signed[15:0] dout_temp;

  41. always @(negedge rst,posedge clk) begin
  42.         if(!rst) begin
  43.                 cState<=0;
  44.         end
  45.         else begin
  46.                 cState<=nState;               
  47.         end
  48. end

  49. always @(*) begin
  50.         case(cState)
  51.                 0:if(din_valid) begin
  52.                         nState<=1;
  53.                   end
  54.                   else begin
  55.                         nState<=0;
  56.                   end
  57.                 1:nState<=2;
  58.                 2:nState<=3;
  59.                 3:nState<=4;
  60.                 4:nState<=5;
  61.                 5:nState<=6;
  62.                 6:nState<=0;
  63.                 default:nState<=nState;
  64.         endcase
  65. end

  66. always @(*) begin
  67.         if(rst) begin
  68.                 case(cState)
  69.                         1:x_mul1=b0*din;
  70.                         2:begin
  71.                                 x_mul2=b1*x_reg0;
  72.                                 y_mul1=a1*y_reg0;
  73.                         end
  74.                         3:begin
  75.                                 x_mul3=b2*x_reg1;
  76.                                 y_mul2=a2*y_reg1;
  77.                         end
  78.                         4:begin
  79.                                 x_sum=x_int_mul1+x_int_mul2+x_int_mul3;
  80.                                 y_sum=y_int_mul1+y_int_mul2;
  81.                         end
  82.                         5:dout_sum=x_temp-y_temp;
  83.                         default:;
  84.                 endcase
  85.         end
  86. end

  87. always @(cState) begin
  88.         if(rst) begin
  89.                 if(cState==4) begin
  90.                         x_reg0<=din;
  91.                         x_reg1<=x_reg0;
  92.                 end
  93.                 else begin
  94.                         x_reg0<=x_reg0;
  95.                         x_reg1<=x_reg1;
  96.                 end
  97.         end
  98.         else begin
  99.                 x_reg0<=16'd0;
  100.                 x_reg1<=16'd0;
  101.         end
  102. end

  103. always @(cState) begin
  104.         if(rst) begin
  105.                 if(cState==6) begin
  106.                         y_reg0<=dout;
  107.                         y_reg1<=y_reg0;
  108.                 end
  109.                 else begin
  110.                         y_reg0<=y_reg0;
  111.                         y_reg1<=y_reg1;
  112.                 end
  113.         end
  114.         else begin
  115.                 y_reg0<=16'd0;
  116.                 y_reg1<=16'd0;
  117.         end
  118. end

  119. assign x_int_mul1=(x_mul1[31]^x_mul1[30])?x_mul1[31:16]:x_mul1[30:15];
  120. assign x_int_mul2=(x_mul2[31]^x_mul2[30])?x_mul2[31:16]:x_mul2[30:15];
  121. assign x_int_mul3=(x_mul3[31]^x_mul3[30])?x_mul3[31:16]:x_mul3[30:15];
  122. assign x_temp=(x_sum[17:15]==3'b000||x_sum[17:15]==3'b111)?x_sum[15:0]:(x_sum[17])?16'h8000:16'h7fff;

  123. assign y_int_mul1=(y_mul1[31]^y_mul1[30])?y_mul1[31:16]:y_mul1[30:15];
  124. assign y_int_mul2=(y_mul2[31]^y_mul2[30])?y_mul2[31:16]:y_mul2[30:15];
  125. assign y_temp=(y_sum[16:15]==2'b00||y_sum[16:15]==2'b11)?y_sum[15:0]:(y_sum[16])?16'h8000:16'h7fff;

  126. assign dout_temp=(dout_sum[16:15]==2'b00||dout_sum[16:15]==2'b11)?dout_sum[15:0]:(dout_sum[16])?16'h8000:16'h7fff;
  127. assign dout=(!rst)?16'd0:dout_temp;

  128. assign dout_valid=(cState==6 && nState==0)?1'b1:1'b0;

  129. endmodule
复制代码
2.8 myiir_second_step模块
myiir_second_step.V
  1. module myiir_second_step(
  2. rst,
  3. clk,
  4. din,
  5. dout,
  6. din_valid,
  7. dout_valid
  8. );

  9. parameter b0=13569;
  10. parameter b1=-18494;
  11. parameter b2=13569;
  12. parameter a1=-19700;
  13. parameter a2=9712;

  14. input rst;
  15. input clk;
  16. input signed[15:0] din;
  17. input din_valid;

  18. output signed[15:0] dout;
  19. output dout_valid;

  20. reg[4:0] cState,nState;
  21. reg signed[15:0] x_reg0;
  22. reg signed[15:0] x_reg1;

  23. reg signed[31:0] x_mul1;
  24. reg signed[31:0] x_mul2;
  25. reg signed[31:0] x_mul3;

  26. wire signed[15:0] x_int_mul1;
  27. wire signed[15:0] x_int_mul2;
  28. wire signed[15:0] x_int_mul3;

  29. reg signed[17:0] x_sum;
  30. wire signed[15:0] x_temp;

  31. reg signed[15:0] y_reg0;
  32. reg signed[15:0] y_reg1;

  33. reg signed[31:0] y_mul1;
  34. reg signed[31:0] y_mul2;

  35. wire signed[15:0] y_int_mul1;
  36. wire signed[15:0] y_int_mul2;

  37. reg signed[16:0] y_sum;
  38. wire signed[15:0] y_temp;

  39. reg signed[16:0] dout_sum;
  40. wire signed[15:0] dout_temp;

  41. always @(negedge rst,posedge clk) begin
  42.         if(!rst) begin
  43.                 cState<=0;
  44.         end
  45.         else begin
  46.                 cState<=nState;
  47.         end
  48. end

  49. always @(*) begin
  50.         case(cState)
  51.                 0:if(din_valid) begin
  52.                         nState<=1;
  53.                   end
  54.                   else begin
  55.                         nState<=0;
  56.                   end
  57.                 1:nState<=2;
  58.                 2:nState<=3;
  59.                 3:nState<=4;
  60.                 4:nState<=5;
  61.                 5:nState<=6;
  62.                 6:nState<=0;
  63.                 default:nState<=nState;
  64.         endcase
  65. end

  66. always @(*) begin
  67.         if(rst) begin
  68.                 case(cState)
  69.                         1:x_mul1=b0*din;
  70.                         2:begin
  71.                                 x_mul2=b1*x_reg0;
  72.                                 y_mul1=a1*y_reg0;
  73.                         end
  74.                         3:begin
  75.                                 x_mul3=b2*x_reg1;
  76.                                 y_mul2=a2*y_reg1;
  77.                         end
  78.                         4:begin
  79.                                 x_sum=x_int_mul1+x_int_mul2+x_int_mul3;
  80.                                 y_sum=y_int_mul1+y_int_mul2;
  81.                         end
  82.                         5: dout_sum=x_temp-y_temp;
  83.                         default:;
  84.                 endcase
  85.         end
  86. end

  87. assign x_int_mul1=(x_mul1[31]^x_mul1[30])?x_mul1[31:16]:x_mul1[30:15];
  88. assign x_int_mul2=(x_mul2[31]^x_mul2[30])?x_mul2[31:16]:x_mul2[30:15];
  89. assign x_int_mul3=(x_mul3[31]^x_mul3[30])?x_mul3[31:16]:x_mul3[30:15];
  90. assign x_temp=(x_sum[17:15]==3'b000||x_sum[17:15]==3'b111)?x_sum[15:0]:(x_sum[17])?16'h8000:16'h7fff;

  91. assign y_int_mul1=(y_mul1[31]^y_mul1[30])?y_mul1[31:16]:y_mul1[30:15];
  92. assign y_int_mul2=(y_mul2[31]^y_mul2[30])?y_mul2[31:16]:y_mul2[30:15];
  93. assign y_temp=(y_sum[16:15]==2'b00||y_sum[16:15]==2'b11)?y_sum[15:0]:(y_sum[16])?16'h8000:16'h7fff;

  94. assign dout_temp=(dout_sum[16:15]==2'b00||dout_sum[16:15]==2'b11)?dout_sum[15:0]:(dout_sum[16])?16'h8000:16'h7fff;
  95. assign dout=(!rst)?16'd0:dout_temp;

  96. always @(cState) begin
  97.         if(rst) begin
  98.                 if(cState==4) begin
  99.                         x_reg0<=din;
  100.                         x_reg1<=x_reg0;
  101.                 end
  102.                 else begin
  103.                         x_reg0<=x_reg0;
  104.                         x_reg1<=x_reg1;
  105.                 end
  106.         end
  107.         else begin
  108.                 x_reg0<=16'd0;
  109.                 x_reg1<=16'd0;
  110.         end
  111. end

  112. always @(cState) begin
  113.         if(rst) begin
  114.                 if(cState==6) begin
  115.                         y_reg0<=dout;
  116.                         y_reg1<=y_reg0;
  117.                 end
  118.                 else begin
  119.                         y_reg0<=y_reg0;
  120.                         y_reg1<=y_reg1;
  121.                 end
  122.         end
  123.         else begin
  124.                 y_reg0<=16'd0;
  125.                 y_reg1<=16'd0;
  126.         end
  127. end

  128. assign dout_valid=(cState==6 && nState==0)?1'b1:1'b0;

  129. endmodule
复制代码
2.9 myiir_third_step模块
myiir_third_step.V
  1. module myiir_third_step(
  2. rst,
  3. clk,
  4. din,
  5. dout,
  6. din_valid,
  7. dout_valid
  8. );

  9. parameter b0=10302;
  10. parameter b1=-11731;
  11. parameter b2=10302;
  12. parameter a1=-11633;
  13. parameter a2=5561;

  14. input rst;
  15. input clk;
  16. input signed[15:0] din;
  17. input din_valid;

  18. output signed[15:0] dout;
  19. output dout_valid;

  20. reg[4:0] cState,nState;
  21. reg signed[15:0] x_reg0;
  22. reg signed[15:0] x_reg1;

  23. reg signed[31:0] x_mul1;
  24. reg signed[31:0] x_mul2;
  25. reg signed[31:0] x_mul3;

  26. wire signed[15:0] x_int_mul1;
  27. wire signed[15:0] x_int_mul2;
  28. wire signed[15:0] x_int_mul3;

  29. reg signed[17:0] x_sum;
  30. wire signed[15:0] x_temp;

  31. reg signed[15:0] y_reg0;
  32. reg signed[15:0] y_reg1;

  33. reg signed[31:0] y_mul1;
  34. reg signed[31:0] y_mul2;

  35. wire signed[15:0] y_int_mul1;
  36. wire signed[15:0] y_int_mul2;

  37. reg signed[16:0] y_sum;
  38. wire signed[15:0] y_temp;

  39. reg signed[16:0] dout_sum;
  40. wire signed[15:0] dout_temp;

  41. always @(negedge rst,posedge clk) begin
  42.         if(!rst) begin
  43.                 cState<=0;
  44.         end
  45.         else begin
  46.                 cState<=nState;
  47.         end
  48. end

  49. always @(*) begin
  50.         case(cState)
  51.                 0:if(din_valid) begin
  52.                         nState<=1;
  53.                   end
  54.                   else begin
  55.                         nState<=0;
  56.                   end
  57.                 1:nState<=2;
  58.                 2:nState<=3;
  59.                 3:nState<=4;
  60.                 4:nState<=5;
  61.                 5:nState<=6;
  62.                 6:nState<=0;
  63.                 default:nState<=nState;
  64.         endcase
  65. end

  66. always @(*) begin
  67.         if(rst) begin
  68.                 case(cState)
  69.                         1:x_mul1=b0*din;
  70.                         2:begin
  71.                                 x_mul2=b1*x_reg0;
  72.                                 y_mul1=a1*y_reg0;
  73.                         end
  74.                         3:begin
  75.                                 x_mul3=b2*x_reg1;
  76.                                 y_mul2=a2*y_reg1;
  77.                         end
  78.                         4:begin
  79.                                 x_sum=x_int_mul1+x_int_mul2+x_int_mul3;
  80.                                 y_sum=y_int_mul1+y_int_mul2;
  81.                         end
  82.                         5: dout_sum=x_temp-y_temp;
  83.                         default:;
  84.                 endcase
  85.         end
  86. end

  87. assign x_int_mul1=(x_mul1[31]^x_mul1[30])?x_mul1[31:16]:x_mul1[30:15];
  88. assign x_int_mul2=(x_mul2[31]^x_mul2[30])?x_mul2[31:16]:x_mul2[30:15];
  89. assign x_int_mul3=(x_mul3[31]^x_mul3[30])?x_mul3[31:16]:x_mul3[30:15];
  90. assign x_temp=(x_sum[17:15]==3'b000||x_sum[17:15]==3'b111)?x_sum[15:0]:(x_sum[17])?16'h8000:16'h7fff;

  91. assign y_int_mul1=(y_mul1[31]^y_mul1[30])?y_mul1[31:16]:y_mul1[30:15];
  92. assign y_int_mul2=(y_mul2[31]^y_mul2[30])?y_mul2[31:16]:y_mul2[30:15];
  93. assign y_temp=(y_sum[16:15]==2'b00||y_sum[16:15]==2'b11)?y_sum[15:0]:(y_sum[16])?16'h8000:16'h7fff;

  94. assign dout_temp=(dout_sum[16:15]==2'b00||dout_sum[16:15]==2'b11)?dout_sum[15:0]:(dout_sum[16])?16'h8000:16'h7fff;
  95. assign dout=(!rst)?16'd0:dout_temp;

  96. always @(cState) begin
  97.         if(rst) begin
  98.                 if(cState==4) begin
  99.                                 x_reg0<=din;
  100.                                 x_reg1<=x_reg0;
  101.                 end
  102.                 else begin
  103.                                 x_reg0<=x_reg0;
  104.                                 x_reg1<=x_reg1;               
  105.                 end
  106.         end
  107.         else begin
  108.                 x_reg0<=16'd0;
  109.                 x_reg1<=16'd0;
  110.         end
  111. end

  112. always @(cState) begin
  113.         if(rst) begin
  114.                 if(cState==6) begin
  115.                         y_reg0<=dout;
  116.                         y_reg1<=y_reg0;
  117.                 end
  118.                 else begin
  119.                         y_reg0<=y_reg0;
  120.                         y_reg1<=y_reg1;
  121.                 end
  122.         end
  123.         else begin
  124.                 y_reg0<=16'd0;
  125.                 y_reg1<=16'd0;
  126.         end
  127. end

  128. assign dout_valid=(cState==6 && nState==0)?1'b1:1'b0;

  129. endmodule
复制代码
2.10 myiir_fourth_step模块
myiir_fourth_step.V
  1. module myiir_fourth_step(
  2. rst,
  3. clk,
  4. din,
  5. dout,
  6. din_valid,
  7. dout_valid
  8. );

  9. parameter b0=6724;
  10. parameter b1=-4060;
  11. parameter b2=6724;
  12. parameter a1=-7317;
  13. parameter a2=2520;

  14. input rst;
  15. input clk;
  16. input signed[15:0] din;
  17. input din_valid;

  18. output signed[15:0] dout;
  19. output dout_valid;

  20. reg[4:0] cState,nState;
  21. reg signed[15:0] x_reg0;
  22. reg signed[15:0] x_reg1;

  23. reg signed[31:0] x_mul1;
  24. reg signed[31:0] x_mul2;
  25. reg signed[31:0] x_mul3;

  26. wire signed[15:0] x_int_mul1;
  27. wire signed[15:0] x_int_mul2;
  28. wire signed[15:0] x_int_mul3;

  29. reg signed[17:0] x_sum;
  30. wire signed[15:0] x_temp;

  31. reg signed[15:0] y_reg0;
  32. reg signed[15:0] y_reg1;

  33. reg signed[31:0] y_mul1;
  34. reg signed[31:0] y_mul2;

  35. wire signed[15:0] y_int_mul1;
  36. wire signed[15:0] y_int_mul2;

  37. reg signed[16:0] y_sum;
  38. wire signed[15:0] y_temp;

  39. reg signed[16:0] dout_sum;
  40. wire signed[15:0] dout_temp;

  41. always @(negedge rst,posedge clk) begin
  42.         if(!rst) begin
  43.                 cState<=0;
  44.         end
  45.         else begin
  46.                 cState<=nState;
  47.         end
  48. end

  49. always @(*) begin
  50.         case(cState)
  51.                 0:if(din_valid) begin
  52.                         nState<=1;
  53.                   end
  54.                   else begin
  55.                         nState<=0;
  56.                   end
  57.                 1:nState<=2;
  58.                 2:nState<=3;
  59.                 3:nState<=4;
  60.                 4:nState<=5;
  61.                 5:nState<=6;
  62.                 6:nState<=0;
  63.                 default:nState<=nState;
  64.         endcase
  65. end

  66. always @(*) begin
  67.         if(rst) begin
  68.                 case(cState)
  69.                         1:x_mul1=b0*din;
  70.                         2:begin
  71.                                 x_mul2=b1*x_reg0;
  72.                                 y_mul1=a1*y_reg0;
  73.                         end
  74.                         3:begin
  75.                                 x_mul3=b2*x_reg1;
  76.                                 y_mul2=a2*y_reg1;
  77.                         end
  78.                         4:begin
  79.                                 x_sum=x_int_mul1+x_int_mul2+x_int_mul3;
  80.                                 y_sum=y_int_mul1+y_int_mul2;
  81.                         end
  82.                         5: dout_sum=x_temp-y_temp;
  83.                         default:;
  84.                 endcase
  85.         end
  86. end

  87. assign x_int_mul1=(x_mul1[31]^x_mul1[30])?x_mul1[31:16]:x_mul1[30:15];
  88. assign x_int_mul2=(x_mul2[31]^x_mul2[30])?x_mul2[31:16]:x_mul2[30:15];
  89. assign x_int_mul3=(x_mul3[31]^x_mul3[30])?x_mul3[31:16]:x_mul3[30:15];
  90. assign x_temp=(x_sum[17:15]==3'b000||x_sum[17:15]==3'b111)?x_sum[15:0]:(x_sum[17])?16'h8000:16'h7fff;

  91. assign y_int_mul1=(y_mul1[31]^y_mul1[30])?y_mul1[31:16]:y_mul1[30:15];
  92. assign y_int_mul2=(y_mul2[31]^y_mul2[30])?y_mul2[31:16]:y_mul2[30:15];
  93. assign y_temp=(y_sum[16:15]==2'b00||y_sum[16:15]==2'b11)?y_sum[15:0]:(y_sum[16])?16'h8000:16'h7fff;

  94. assign dout_temp=(dout_sum[16:15]==2'b00||dout_sum[16:15]==2'b11)?dout_sum[15:0]:(dout_sum[16])?16'h8000:16'h7fff;
  95. assign dout=(!rst)?16'd0:dout_temp;

  96. always @(cState) begin
  97.         if(rst) begin
  98.                 case(cState)
  99.                         4: begin
  100.                                 x_reg0<=din;
  101.                                 x_reg1<=x_reg0;
  102.                         end
  103.                         default:begin
  104.                                 x_reg0<=x_reg0;
  105.                                 x_reg1<=x_reg1;
  106.                         end
  107.                 endcase
  108.         end
  109.         else begin
  110.                 x_reg0<=16'd0;
  111.                 x_reg1<=16'd0;
  112.         end
  113. end

  114. always @(cState) begin
  115.         if(rst) begin
  116.                 if(cState==6) begin
  117.                         y_reg0<=dout;
  118.                         y_reg1<=y_reg0;
  119.                 end
  120.                 else begin
  121.                         y_reg0<=y_reg0;
  122.                         y_reg1<=y_reg1;
  123.                 end
  124.         end
  125.         else begin
  126.                 y_reg0<=16'd0;
  127.                 y_reg1<=16'd0;
  128.         end
  129. end

  130. assign dout_valid=(cState==6 && nState==0)?1'b1:1'b0;

  131. endmodule
复制代码
2.11 myiir_fifth_step模块
myiir_fifth_step.V
  1. module myiir_fifth_step(
  2. rst,
  3. clk,
  4. din,
  5. dout,
  6. din_valid,
  7. dout_valid
  8. );

  9. parameter b0=3736;
  10. parameter b1=-2448;
  11. parameter b2=3736;
  12. parameter a1=-3526;
  13. parameter a2=921;

  14. input rst;
  15. input clk;
  16. input signed[15:0] din;
  17. input din_valid;

  18. output signed[15:0] dout;
  19. output dout_valid;

  20. reg[4:0] cState,nState;
  21. reg signed[15:0] x_reg0;
  22. reg signed[15:0] x_reg1;

  23. reg signed[31:0] x_mul1;
  24. reg signed[31:0] x_mul2;
  25. reg signed[31:0] x_mul3;

  26. wire signed[15:0] x_int_mul1;
  27. wire signed[15:0] x_int_mul2;
  28. wire signed[15:0] x_int_mul3;

  29. reg signed[17:0] x_sum;
  30. wire signed[15:0] x_temp;

  31. reg signed[15:0] y_reg0;
  32. reg signed[15:0] y_reg1;

  33. reg signed[31:0] y_mul1;
  34. reg signed[31:0] y_mul2;

  35. wire signed[15:0] y_int_mul1;
  36. wire signed[15:0] y_int_mul2;

  37. reg signed[16:0] y_sum;
  38. wire signed[15:0] y_temp;

  39. reg signed[16:0] dout_sum;
  40. wire signed[15:0] dout_temp;

  41. always @(negedge rst,posedge clk) begin
  42.         if(!rst) begin
  43.                 cState<=0;
  44.         end
  45.         else begin
  46.                 cState<=nState;
  47.         end
  48. end

  49. always @(*) begin
  50.         case(cState)
  51.                 0:if(din_valid) begin
  52.                         nState<=1;
  53.                   end
  54.                   else begin
  55.                         nState<=0;
  56.                   end
  57.                 1:nState<=2;
  58.                 2:nState<=3;
  59.                 3:nState<=4;
  60.                 4:nState<=5;
  61.                 5:nState<=6;
  62.                 6:nState<=0;
  63.                 default:nState<=nState;
  64.         endcase
  65. end

  66. always @(*) begin
  67.         if(rst) begin
  68.                 case(cState)
  69.                         1:x_mul1=b0*din;
  70.                         2:begin
  71.                                 x_mul2=b1*x_reg0;
  72.                                 y_mul1=a1*y_reg0;
  73.                         end
  74.                         3:begin
  75.                                 x_mul3=b2*x_reg1;
  76.                                 y_mul2=a2*y_reg1;
  77.                         end
  78.                         4:begin
  79.                                 x_sum=x_int_mul1+x_int_mul2+x_int_mul3;
  80.                                 y_sum=y_int_mul1+y_int_mul2;
  81.                         end
  82.                         5: dout_sum=x_temp-y_temp;
  83.                         default:;
  84.                 endcase
  85.         end
  86. end

  87. assign x_int_mul1=(x_mul1[31]^x_mul1[30])?x_mul1[31:16]:x_mul1[30:15];
  88. assign x_int_mul2=(x_mul2[31]^x_mul2[30])?x_mul2[31:16]:x_mul2[30:15];
  89. assign x_int_mul3=(x_mul3[31]^x_mul3[30])?x_mul3[31:16]:x_mul3[30:15];
  90. assign x_temp=(x_sum[17:15]==3'b000||x_sum[17:15]==3'b111)?x_sum[15:0]:(x_sum[17])?16'h8000:16'h7fff;

  91. assign y_int_mul1=(y_mul1[31]^y_mul1[30])?y_mul1[31:16]:y_mul1[30:15];
  92. assign y_int_mul2=(y_mul2[31]^y_mul2[30])?y_mul2[31:16]:y_mul2[30:15];
  93. assign y_temp=(y_sum[16:15]==2'b00||y_sum[16:15]==2'b11)?y_sum[15:0]:(y_sum[16])?16'h8000:16'h7fff;

  94. assign dout_temp=(dout_sum[16:15]==2'b00||dout_sum[16:15]==2'b11)?dout_sum[15:0]:(dout_sum[16])?16'h8000:16'h7fff;
  95. assign dout=(!rst)?16'd0:dout_temp;

  96. always @(cState) begin
  97.         if(rst) begin
  98.                 case(cState)
  99.                         4: begin
  100.                                 x_reg0<=din;
  101.                                 x_reg1<=x_reg0;
  102.                         end
  103.                         default:begin
  104.                                 x_reg0<=x_reg0;
  105.                                 x_reg1<=x_reg1;
  106.                         end
  107.                 endcase
  108.         end
  109.         else begin
  110.                 x_reg0<=16'd0;
  111.                 x_reg1<=16'd0;
  112.         end
  113. end

  114. always @(cState) begin
  115.         if(rst) begin
  116.                 if(cState==6) begin
  117.                         y_reg0<=dout;
  118.                         y_reg1<=y_reg0;
  119.                 end
  120.                 else begin
  121.                         y_reg0<=y_reg0;
  122.                         y_reg1<=y_reg1;
  123.                 end
  124.         end
  125.         else begin
  126.                 y_reg0<=16'd0;
  127.                 y_reg1<=16'd0;
  128.         end
  129. end

  130. assign dout_valid=(cState==6 && nState==0)?1'b1:1'b0;

  131. endmodule
复制代码
2.12 myiir_sixth_step模块
myiir_sixth_step.V
  1. module myiir_sixth_step(
  2. rst,
  3. clk,
  4. din,
  5. dout,
  6. din_valid,
  7. dout_valid
  8. );

  9. parameter b0=9119;
  10. parameter b1=9119;
  11. parameter a1=-4044;

  12. input rst;
  13. input clk;
  14. input signed[15:0] din;
  15. input din_valid;

  16. output signed[15:0] dout;
  17. output dout_valid;

  18. reg[4:0] cState,nState;

  19. reg signed[15:0] x_reg0;

  20. reg signed[31:0] x_mul1;
  21. reg signed[31:0] x_mul2;

  22. wire signed[15:0] x_int_mul1;
  23. wire signed[15:0] x_int_mul2;

  24. reg signed[16:0] x_sum;
  25. wire signed[15:0] x_temp;

  26. reg signed[15:0] y_reg0;

  27. reg signed[31:0] y_mul1;
  28. wire signed[15:0] y_int_mul1;

  29. reg signed[16:0] dout_sum;
  30. wire signed[15:0] dout_temp;

  31. always @(negedge rst,posedge clk) begin
  32.         if(!rst) begin
  33.                 cState<=0;
  34.         end
  35.         else begin
  36.                 cState<=nState;
  37.         end
  38. end

  39. always @(*) begin
  40.         case(cState)
  41.                 0:if(din_valid) begin
  42.                         nState<=1;
  43.                   end
  44.                   else begin
  45.                         nState<=0;
  46.                   end
  47.                 1:nState<=2;
  48.                 2:nState<=3;
  49.                 3:nState<=4;
  50.                 4:nState<=5;
  51.                 5:nState<=0;
  52.                 default:nState<=0;
  53.         endcase
  54. end

  55. always @(*) begin
  56.         if(rst) begin
  57.                 case(cState)
  58.                         1:x_mul1=b0*din;
  59.                         2:begin
  60.                                 x_mul2=b1*x_reg0;
  61.                                 y_mul1=a1*y_reg0;
  62.                         end
  63.                         3:begin
  64.                                 x_sum=x_int_mul1+x_int_mul2;
  65.                         end
  66.                         4:begin
  67.                                 dout_sum=x_temp-y_int_mul1;
  68.                         end
  69.                         default:;
  70.                 endcase
  71.         end
  72. end

  73. assign x_int_mul1=(x_mul1[31]^x_mul1[30])?x_mul1[31:16]:x_mul1[30:15];
  74. assign x_int_mul2=(x_mul2[31]^x_mul2[30])?x_mul2[31:16]:x_mul2[30:15];
  75. assign x_temp=(x_sum[16:15]==2'b00||x_sum[16:15]==2'b11)?x_sum[15:0]:(x_sum[16])?16'h8000:16'h7fff;

  76. assign y_int_mul1=(y_mul1[31]^y_mul1[30])?y_mul1[31:16]:y_mul1[30:15];

  77. assign dout_temp=(dout_sum[16:15]==2'b00||dout_sum[16:15]==2'b11)?dout_sum[15:0]:(dout_sum[16])?16'h8000:16'h7fff;
  78. assign dout=(!rst)?16'd0:dout_temp;

  79. always @(cState) begin
  80.         if(rst) begin
  81.                 if(cState==4) begin
  82.                         x_reg0<=din;
  83.                 end
  84.                 else begin
  85.                         x_reg0<=x_reg0;
  86.                 end
  87.         end
  88.         else begin
  89.                 x_reg0<=16'd0;
  90.         end
  91. end

  92. always @(cState) begin
  93.         if(rst) begin
  94.                 if(cState==5) begin
  95.                         y_reg0<=dout;
  96.                 end
  97.                 else begin
  98.                         y_reg0<=y_reg0;
  99.                 end
  100.         end
  101.         else begin
  102.                 y_reg0<=16'd0;
  103.         end
  104. end

  105. assign dout_valid=(cState==5 && nState==0)?1'b1:1'b0;

  106. endmodule
复制代码
代码到这里终于结束了!辛苦观看。。
3.仿真与引脚分配
3.1 仿真
实验使用modelsim进行仿真,从matlab获得量化后的输入波形文件,经过仿真后得到滤波后的波形。


3.2 引脚分配


4.心得

本次实验好艰辛啊!从最开始的晕头晕脑,到最后有效果,时间挺长的,但确实学到了许多!通过这次实验,不仅更加熟练地学习到了FPGA设计的流程,更加深了数字信号处理滤波器的设计和实现!重要是坚持!!!

5.视频地址

前篇
http://v.youku.com/v_show/id_XMjcyMjkwNDY3Mg==.html
后篇
http://v.youku.com/v_show/id_XMjcyMjkyOTYzMg==.html

关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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