📄 firinterp.v
字号:
//16倍插值Fir滤波module FIRInterp(RST,sysclk,DInEn,LDin,RDin,DOutEn,LDout,RDout);parameter IO_WIDTH=16;input RST,sysclk,DInEn;input signed[IO_WIDTH-1:0] LDin,RDin;output DOutEn;output signed[IO_WIDTH-1:0] LDout,RDout;reg signed[IO_WIDTH-1:0] RDout,LDout;reg DOutEn;reg[IO_WIDTH*2-1:0] mem[15:0];reg[IO_WIDTH*2-1:0] d,q;reg[3:0] a;reg we;reg signed[IO_WIDTH-1:0] Md;reg signed[17:0] Rcof;wire[17:0] wcof;wire signed[IO_WIDTH+17:0] MultR;reg signed[IO_WIDTH+17:0] LTDt,RTDt;//integer m;reg[8:0] TapCnt;reg[7:0] RomAdd;assign MultR=Md*Rcof;always@(posedge sysclk or posedge RST) begin if(RST) begin LTDt<=0;RTDt<=0;RDout<=0;LDout<=0; TapCnt<=9'h0;RomAdd<=8'h0;DOutEn<=1'b0;a<=4'h0;d<=0;Md<=0;Rcof<=18'h0; end else begin Rcof<=wcof; if(TapCnt[0]) Md<=q[IO_WIDTH*2-1:IO_WIDTH]; else Md<=q[IO_WIDTH-1: 0]; if(TapCnt[4:0]==5'h3) begin RTDt<=MultR; LDout<=LTDt[IO_WIDTH+16:17]; RDout<=RTDt[IO_WIDTH+16:17]; DOutEn<=1'b1; end else if(TapCnt[4:0]==5'h4) begin LTDt<=MultR; DOutEn<=1'b0; end else begin DOutEn<=1'b0; if(TapCnt[0]) RTDt<=RTDt+MultR; else LTDt<=LTDt+MultR; end if((DInEn)) begin TapCnt<=9'h1e2; d[IO_WIDTH*2-1:IO_WIDTH]<=LDin; d[IO_WIDTH-1: 0]<=RDin; we<=1'b1; end else begin TapCnt<=TapCnt+9'd1; we<=1'b0; end if(TapCnt==9'h0) begin a<=a+4'h2; end else if(TapCnt[0]==0)begin a<=a+4'h1; end RomAdd<={TapCnt[4:1],~TapCnt[8:5]}; endendMyCofRom CofTab(.clk(sysclk),.Address(RomAdd),.Data(wcof));//always @ (posedge sysclk or posedge RST) begin //data ram/* if(RST) begin for(m=0;m<16;m=m+1) begin mem[m]<=0; end q<=0; end else begin*/always @ (posedge sysclk) begin //data ram if (we) mem[a] <= d; q <= mem[a]; // q doesn't get d in this clock cycle// endendendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -