X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=usrp%2Ffpga%2Fsdr_lib%2Fcic_int_shifter.v;h=a8a3276f14027d9367b5feb419ba306434a056c1;hb=ea29b08aeb54227e6628f655ccfdb96fe4d8c378;hp=fd928373b4fee0ae0ca1a6390db0ceabb382c813;hpb=09a1e803a9e6587c78d20cdf16891e5295874668;p=debian%2Fgnuradio diff --git a/usrp/fpga/sdr_lib/cic_int_shifter.v b/usrp/fpga/sdr_lib/cic_int_shifter.v index fd928373..a8a3276f 100644 --- a/usrp/fpga/sdr_lib/cic_int_shifter.v +++ b/usrp/fpga/sdr_lib/cic_int_shifter.v @@ -20,37 +20,34 @@ // +// NOTE This only works for N=4, max interp rate of 128 +// NOTE signal "rate" is ONE LESS THAN the actual rate + module cic_int_shifter(rate,signal_in,signal_out); parameter bw = 16; - parameter N = 4; - parameter log2_of_max_rate = 7; - parameter maxbitgain = (N-1)*log2_of_max_rate; + parameter maxbitgain = 21; input [7:0] rate; input wire [bw+maxbitgain-1:0] signal_in; output reg [bw-1:0] signal_out; - function [2:0] log_ceil; - input [7:0] val; - log_ceil = val[6] ? 3'd7 : val[5] ? 3'd6 : val[4] ? 3'd5 : - val[3] ? 3'd4 : val[2] ? 3'd3 : val[1] ? 3'd2 : 3'd1; - endfunction // log_ceil - function [4:0] bitgain; input [7:0] rate; case(rate) - 8'd4 : bitgain = 2*(N-1); - 8'd8 : bitgain = 3*(N-1); - 8'd16 : bitgain = 4*(N-1); - 8'd32 : bitgain = 5*(N-1); - 8'd64 : bitgain = 6*(N-1); - 8'd128 : bitgain = 7*(N-1); + // Exact Cases + 8'd4 : bitgain = 6; + 8'd8 : bitgain = 9; + 8'd16 : bitgain = 12; + 8'd32 : bitgain = 15; + 8'd64 : bitgain = 18; + 8'd128 : bitgain = 21; + // Nearest without overflow 8'd5 : bitgain = 7; 8'd6 : bitgain = 8; 8'd7 : bitgain = 9; 8'd9,8'd10 : bitgain = 10; - 8'd12 : bitgain = 11; + 8'd11,8'd12 : bitgain = 11; 8'd13,8'd14,8'd15 : bitgain = 12; 8'd17,8'd18,8'd19,8'd20 : bitgain = 13; 8'd21,8'd22,8'd23,8'd24,8'd25 : bitgain = 14; @@ -90,7 +87,6 @@ module cic_int_shifter(rate,signal_in,signal_out); 5'd19 : signal_out = signal_in[19+bw-1:19]; 5'd20 : signal_out = signal_in[20+bw-1:20]; - default : signal_out = signal_in[21+bw-1:21]; endcase // case(shift)