查看: 281|回复: 0

[教程] 【转】基于FPGA的IIR滤波器

[复制链接]

582

主题

3

好友

1万

积分

翰林

Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    擦汗
    2014-2-12 10:49
  • 签到天数: 150 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2017-7-24 15:42:30 |显示全部楼层
    基于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滤波器的顶层文件。拓扑图如下:
    1078653-20170422193446227-383020639.png

    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获得量化后的输入波形文件,经过仿真后得到滤波后的波形。
    1078653-20170422195423384-86693624.png


    3.2 引脚分配
    1078653-20170422195544790-669225906.png


    4.心得

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

    5.视频地址

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

    回复

    使用道具 举报

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

    关闭

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

    手机版|爱板网 |网站地图  

    GMT+8, 2017-10-23 04:59 , Processed in 0.130165 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部