踩过的fpga坑

1.fir转置滤波器

1.1问题

使用系数5,12,60,96,128,96,60,12,5实现转置滤波器,使用逻辑单元,不使用乘法器

1.2思路

使用<<、>>左移右移逻辑运算实现恒定系数乘法。

关于转置滤波器,这里就不贴图了。

1.3问题代码及仿真

1.3.1转置fir滤波器模块

module trans_fir#(
    parameter WIDTH = 'd8
)(
    input               clk,
    input               rstn,
    input signed [WIDTH+7:0]   x,
    output signed [WIDTH+18:0]  y
);
//parameter h0 = 5,h1=12,h2=60,h3=96,h4=128,h5=96,h6=60,h7=12,h8=5;
wire signed [WIDTH+18:0] b[8:0];
wire signed [WIDTH+18:0] c[16:0];
integer i;

assign c[0]=x<<2;
assign c[1]=x;
assign c[2]=x<<3;
assign c[3]=x<<2;
assign c[4]=x<<6;
assign c[5]=x<<2;
assign c[6]=x<<6;
assign c[7]=x<<5;
assign c[8]=x<<7;
assign c[9]=x<<6;
assign c[10]=x<<5;
assign c[11]=x<<6;
assign c[12]=x<<2;
assign c[13]=x<<3;
assign c[14]=x<<2;
assign c[15]=x<<2;
assign c[16]=x;

assign b[0]=c[0]+c[1];
assign b[1]=c[2]+c[3];
assign b[2]=c[4]-c[5];
assign b[3]=c[6]+c[7];
assign b[4]=c[8];
assign b[5]=c[9]+c[10];
assign b[6]=c[11]-c[12];
assign b[7]=c[13]+c[14];
assign b[8]=c[15]+c[16];



reg signed [WIDTH+18:0] d[8:0];

always @(posedge clk,negedge rstn) begin
    if(!rstn)begin
        for (i = 0;i<9 ;i=i+1 ) begin
            d[i]<='d0;
        end
    end
    else begin
        for (i = 0;i<8 ;i=i+1 ) begin
            d[i]<=b[i]+d[i+1];
        end
        d[8]<=b[8];
    end
end
assign y=b[0];
endmodule

1.3.2Testbench

这里是用了rom的ip核存储了一个正弦信号。

module tb_trans_fir(

    );
    parameter WIDTH = 'd8;
    reg clk;
    reg rstn;
    wire signed [WIDTH+7:0] x;
    wire signed [WIDTH+18:0] y;
    reg  [11:0]      addr;
    initial begin
        clk=1'b0;
        rstn=1'b0;
        #5
        rstn<=1'b1;
        
    end
    always #10 clk=~clk;
    trans_fir #(
        .WIDTH(WIDTH)
    )u_fir(
        .clk(clk),
        .rstn(rstn),
        .x(x),
        .y(y)
    );
    blk_mem_gen_0 u_rom(
        .clka(clk),
        .addra(addr),
        .douta(x)
    );
    always @(posedge clk,negedge rstn) begin
        if(!rstn)begin
            addr<='d0;
        end
        else begin
            addr<=addr+1'b1;
        end
    end
endmodule

1.3.3vivado仿真图

 1.5总结

猜测应该是移位和加法运算无法在同一个周期完成,且扩展和移位不要放在一起

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值