commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r8471 - usrp2/trunk/fpga/sdr_lib


From: matt
Subject: [Commit-gnuradio] r8471 - usrp2/trunk/fpga/sdr_lib
Date: Wed, 21 May 2008 11:58:16 -0600 (MDT)

Author: matt
Date: 2008-05-21 11:58:16 -0600 (Wed, 21 May 2008)
New Revision: 8471

Added:
   usrp2/trunk/fpga/sdr_lib/HB.sav
   usrp2/trunk/fpga/sdr_lib/SMALL_HB.sav
Modified:
   usrp2/trunk/fpga/sdr_lib/hb_dec.v
Log:
progress on halfband decimator, plus some sav files for gtkwave


Added: usrp2/trunk/fpga/sdr_lib/HB.sav
===================================================================
--- usrp2/trunk/fpga/sdr_lib/HB.sav                             (rev 0)
+++ usrp2/trunk/fpga/sdr_lib/HB.sav     2008-05-21 17:58:16 UTC (rev 8471)
@@ -0,0 +1,55 @@
+[size] 1400 967
+[pos] -1 -1
+*-44.529663 5615000000000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+[treeopen] hb_dec_tb.
+[treeopen] hb_dec_tb.uut.
address@hidden
+hb_dec_tb.data_in[17:0]
address@hidden
+hb_dec_tb.strobe_in
+hb_dec_tb.strobe_out
+hb_dec_tb.uut.write_even
address@hidden
+hb_dec_tb.uut.addr_even[3:0]
address@hidden
+hb_dec_tb.uut.data_even[17:0]
address@hidden
+hb_dec_tb.uut.addr_odd_a[3:0]
+hb_dec_tb.uut.addr_odd_b[3:0]
+hb_dec_tb.uut.addr_odd_c[3:0]
+hb_dec_tb.uut.addr_odd_d[3:0]
address@hidden
+hb_dec_tb.uut.data_odd_a[17:0]
+hb_dec_tb.uut.data_odd_b[17:0]
+hb_dec_tb.uut.data_odd_c[17:0]
+hb_dec_tb.uut.data_odd_d[17:0]
address@hidden
+hb_dec_tb.uut.write_odd
address@hidden
+hb_dec_tb.uut.prod1[35:0]
+hb_dec_tb.uut.prod2[35:0]
+hb_dec_tb.uut.sum_of_prod[17:0]
+hb_dec_tb.uut.acc_out[19:0]
+hb_dec_tb.uut.acc_round[17:0]
address@hidden
+hb_dec_tb.uut.phase[2:0]
address@hidden
+hb_dec_tb.uut.stb_in
+hb_dec_tb.uut.stb_out
address@hidden
+hb_dec_tb.uut.sum2[17:0]
+hb_dec_tb.uut.stb_out_pre[15:0]
address@hidden
+hb_dec_tb.uut.do_acc
+hb_dec_tb.uut.clear
address@hidden
+hb_dec_tb.uut.sum1[17:0]
+hb_dec_tb.uut.coeff1[17:0]
+hb_dec_tb.uut.prod1[35:0]
+hb_dec_tb.uut.prod2[35:0]
+hb_dec_tb.uut.sum_of_prod[17:0]
+hb_dec_tb.uut.acc_out[19:0]
+hb_dec_tb.uut.acc_round[17:0]
+hb_dec_tb.uut.final_sum[17:0]
+hb_dec_tb.data_out[17:0]
+hb_dec_tb.uut.coeff2[17:0]

Added: usrp2/trunk/fpga/sdr_lib/SMALL_HB.sav
===================================================================
--- usrp2/trunk/fpga/sdr_lib/SMALL_HB.sav                               (rev 0)
+++ usrp2/trunk/fpga/sdr_lib/SMALL_HB.sav       2008-05-21 17:58:16 UTC (rev 
8471)
@@ -0,0 +1,40 @@
+[size] 1400 967
+[pos] -1 -1
+*-11.608687 1834 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1 -1
+[treeopen] small_hb_dec_tb.
+[treeopen] small_hb_dec_tb.uut.
address@hidden
+small_hb_dec_tb.uut.clk
+small_hb_dec_tb.uut.phase
address@hidden
+small_hb_dec_tb.uut.data_in[17:0]
address@hidden
+small_hb_dec_tb.uut.d1[17:0]
+small_hb_dec_tb.uut.d2[17:0]
+small_hb_dec_tb.uut.d3[17:0]
+small_hb_dec_tb.uut.d4[17:0]
+small_hb_dec_tb.uut.d5[17:0]
+small_hb_dec_tb.uut.d6[17:0]
+small_hb_dec_tb.uut.coeff[17:0]
+small_hb_dec_tb.uut.sum[17:0]
+small_hb_dec_tb.uut.prod[35:0]
+small_hb_dec_tb.uut.accum_rnd[17:0]
address@hidden
+small_hb_dec_tb.uut.stb_in
address@hidden
+small_hb_dec_tb.uut.final_sum[17:0]
address@hidden
+small_hb_dec_tb.uut.go
+small_hb_dec_tb.uut.go_d1
+small_hb_dec_tb.uut.go_d2
+small_hb_dec_tb.uut.go_d3
+small_hb_dec_tb.uut.go_d4
+small_hb_dec_tb.uut.stb_out
address@hidden
+small_hb_dec_tb.uut.data_out[17:0]
+small_hb_dec_tb.uut.prod[35:0]
+small_hb_dec_tb.uut.accum_rnd[17:0]
+small_hb_dec_tb.uut.final_sum[17:0]
address@hidden
+small_hb_dec_tb.uut.round_acc.out[17:0]
+small_hb_dec_tb.uut.data_out[17:0]

Modified: usrp2/trunk/fpga/sdr_lib/hb_dec.v
===================================================================
--- usrp2/trunk/fpga/sdr_lib/hb_dec.v   2008-05-21 16:59:27 UTC (rev 8470)
+++ usrp2/trunk/fpga/sdr_lib/hb_dec.v   2008-05-21 17:58:16 UTC (rev 8471)
@@ -2,141 +2,151 @@
 // Implements impulse responses of the form [A 0 B 0 C .. 0 H 0.5 H 0 .. C 0 B 
0 A]
 // Strobe in cannot come faster than every 2nd clock cycle
 // These taps designed by halfgen4 from ldoolittle
+// myfilt = round(65536 * 2 * halfgen4(.7/4,8))
 
 module hb_dec
-  #(parameter WIDTH=18)
+  #(parameter IWIDTH=18, OWIDTH=18, CWIDTH=18, ACCWIDTH=20)
     (input clk,
      input rst,
      input bypass,
      input stb_in,
-     input [WIDTH-1:0] data_in,
+     input [IWIDTH-1:0] data_in,
      output reg stb_out,
-     output [WIDTH-1:0] data_out);
+     output reg [OWIDTH-1:0] data_out);
 
+   // Control
    reg [3:0]           addr_odd_a, addr_odd_b, addr_odd_c, addr_odd_d, 
addr_even;
-   wire [WIDTH-1:0]    data_odd_a, data_odd_b, data_odd_c, data_odd_d, 
data_even;
-   wire [WIDTH-1:0]    sum1, sum2;     
-   reg [WIDTH-1:0]     final_sum;
-   reg [WIDTH-1:0]     coeff1, coeff2;
-
-   wire [2:0]          coeff_addr;
-   wire [35:0]                 prod1, prod2;
-
-   wire                write_odd, write_even;
-   reg                         odd_even;
-   reg [2:0]           phase;
+   wire                write_odd, write_even, do_mult;
+   reg                         odd;
+   reg [2:0]           phase, phase_d1;
+   reg                         stb_out_int;
+   wire                clear, do_acc;
+   assign              do_mult = 1;
    
    always @(posedge clk)
      if(rst)
-       odd_even <= 0;
+       odd <= 0;
      else if(stb_in)
-       odd_even <= ~odd_even;
+       odd <= ~odd;
 
-   assign              write_odd = stb_in & odd_even;
-   assign              write_even = stb_in & ~odd_even;
+   assign              write_odd = stb_in & odd;
+   assign              write_even = stb_in & ~odd;
 
    always @(posedge clk)
      if(rst)
        phase <= 0;
-     else if(stb_in & odd_even)
+     else if(stb_in & odd)
        phase <= 1;
      else if(phase == 4)
        phase <= 0;
      else if(phase != 0)
        phase <= phase + 1;
 
-   assign              coeff_addr = phase;
+   always @(posedge clk)
+     phase_d1 <= phase;
+   
+   reg [15:0]          stb_out_pre;
+   always @(posedge clk)
+     if(rst)
+       stb_out_pre <= 0;
+     else
+       stb_out_pre <= {stb_out_pre[14:0],(stb_in & odd)};
 
-   always @*
-     case(phase)
-       1 : addr_odd_a = 1;
-       2 : addr_odd_a = 7;
-       3 : addr_odd_a = 9;
-       4 : addr_odd_a = 15;
-       default : addr_odd_a = 3;
-     endcase // case(phase)
+   always @(posedge clk)
+     addr_even <= 7;
    
    always @*
      case(phase)
-       1 : addr_odd_b = 1;
-       2 : addr_odd_b = 7;
-       3 : addr_odd_b = 9;
-       4 : addr_odd_b = 15;
-       default : addr_odd_b = 3;
+       1 : begin addr_odd_a = 0; addr_odd_b = 15; end
+       2 : begin addr_odd_a = 1; addr_odd_b = 14; end
+       3 : begin addr_odd_a = 2; addr_odd_b = 13; end
+       4 : begin addr_odd_a = 3; addr_odd_b = 12; end
+       default : begin addr_odd_a = 0; addr_odd_b = 15; end
      endcase // case(phase)
-   
+
    always @*
      case(phase)
-       1 : addr_odd_c = 4;
-       2 : addr_odd_c = 5;
-       3 : addr_odd_c = 6;
-       4 : addr_odd_c = 15;
-       default : addr_odd_c = 3;
+       1 : begin addr_odd_c = 4; addr_odd_d = 11; end
+       2 : begin addr_odd_c = 5; addr_odd_d = 10; end
+       3 : begin addr_odd_c = 6; addr_odd_d = 9; end
+       4 : begin addr_odd_c = 7; addr_odd_d = 8; end
+       default : begin addr_odd_c = 4; addr_odd_d = 11; end
      endcase // case(phase)
+
+   assign do_acc = |stb_out_pre[6:3];
+   assign clear = stb_out_pre[3];
    
-   always @*
-     case(phase)
-       1 : addr_odd_d = 2;
-       2 : addr_odd_d = 3;
-       3 : addr_odd_d = 5;
-       4 : addr_odd_d = 5;
-       default : addr_odd_d = 3;
+   // Data
+   wire [IWIDTH-1:0]   data_odd_a, data_odd_b, data_odd_c, data_odd_d, 
data_even;
+   wire [IWIDTH-1:0]   sum1, sum2;     
+   wire [OWIDTH-1:0]   final_sum;
+   reg [CWIDTH-1:0]    coeff1, coeff2;
+   wire [35:0]                 prod1, prod2;
+
+   always @*            // Outer coeffs
+     case(phase_d1)
+       1 : coeff1 = -53;
+       2 : coeff1 = 223;
+       3 : coeff1 = -636;
+       4 : coeff1 = 1480;
+       default : coeff1 = -53;
      endcase // case(phase)
    
-   always @*
-     case(coeff_addr)
-       0 : coeff1 = 12345;
-       1 : coeff1 = 1235;
-       2 : coeff1 = 3456;
-       3 : coeff1 = 345;
-       3 : coeff1 = 345;
-       default : coeff1 = 23456;
-     endcase // case(coeff_addr)
-   
-   always @*
-     case(coeff_addr)
-       0 : coeff2 = 12345;
-       1 : coeff2 = 12;
-       2 : coeff2 = 356;
-       3 : coeff2 = 45;
+   always @*            //  Inner coeffs
+     case(phase_d1)
+       1 : coeff2 = -3053;
+       2 : coeff2 = 5976;
+       3 : coeff2 = -12353;
+       4 : coeff2 = 41179;
        default : coeff2 = 23456;
-     endcase // case(coeff_addr)
+     endcase // case(phase)
    
-   srl #(.WIDTH(18)) srl_odd_a
+   srl #(.WIDTH(IWIDTH)) srl_odd_a
      
(.clk(clk),.write(write_odd),.in(data_in),.addr(addr_odd_a),.out(data_odd_a));
-   srl #(.WIDTH(18)) srl_odd_b
+   srl #(.WIDTH(IWIDTH)) srl_odd_b
      
(.clk(clk),.write(write_odd),.in(data_in),.addr(addr_odd_b),.out(data_odd_b));
-   srl #(.WIDTH(18)) srl_odd_c
+   srl #(.WIDTH(IWIDTH)) srl_odd_c
      
(.clk(clk),.write(write_odd),.in(data_in),.addr(addr_odd_c),.out(data_odd_c));
-   srl #(.WIDTH(18)) srl_odd_d
+   srl #(.WIDTH(IWIDTH)) srl_odd_d
      
(.clk(clk),.write(write_odd),.in(data_in),.addr(addr_odd_d),.out(data_odd_d));
 
-   add2_and_round_reg #(.WIDTH(18)) add1 
(.clk(clk),.in1(data_odd_a),.in2(data_odd_b),.sum(sum1));
-   add2_and_round_reg #(.WIDTH(18)) add2 
(.clk(clk),.in1(data_odd_c),.in2(data_odd_d),.sum(sum2));
+   add2_reg /*_and_round_reg*/ #(.WIDTH(IWIDTH)) add1 
(.clk(clk),.in1(data_odd_a),.in2(data_odd_b),.sum(sum1));
+   add2_reg /*_and_round_reg*/ #(.WIDTH(IWIDTH)) add2 
(.clk(clk),.in1(data_odd_c),.in2(data_odd_d),.sum(sum2));
    
-   srl #(.WIDTH(18)) srl_even
+   srl #(.WIDTH(IWIDTH)) srl_even
      
(.clk(clk),.write(write_even),.in(data_in),.addr(addr_even),.out(data_even));
 
-   wire [17:0]                 final_sum_unreg;
+   wire [IWIDTH-1:0]   sum_of_prod;
    
+   MULT18X18S mult1(.C(clk), .CE(do_mult), .R(rst), .P(prod1), .A(coeff1), 
.B(sum1) );
+   MULT18X18S mult2(.C(clk), .CE(do_mult), .R(rst), .P(prod2), .A(coeff2), 
.B(sum2) );
+   add2_and_round_reg #(.WIDTH(IWIDTH)) add3 
(.clk(clk),.in1(prod1[35:18]),.in2(prod2[35:18]),.sum(sum_of_prod));
+
+   wire [ACCWIDTH-1:0]         acc_out;
+   wire [OWIDTH-1:0]   acc_round;
+   
+   acc #(.IWIDTH(IWIDTH),.OWIDTH(ACCWIDTH)) 
+     acc (.clk(clk),.clear(clear),.acc(do_acc),.in(sum_of_prod),.out(acc_out));
+
+   round_reg #(.bits_in(ACCWIDTH),.bits_out(OWIDTH))
+     final_round (.clk(clk),.in(acc_out),.out(acc_round));
+
+   add2_and_round_reg #(.WIDTH(OWIDTH)) 
+     final_adder (.clk(clk), .in1(acc_round), .in2(data_even), 
.sum(final_sum));
+
+   // Output
    always @(posedge clk)
      if(bypass)
-       final_sum <= data_in;
-     else
-       final_sum <= final_sum_unreg;
+       data_out <= data_in;
+     else if(stb_out_pre[9])
+       data_out <= final_sum;
 
-   assign              data_out = final_sum;
-
    always @(posedge clk)
      if(rst)
        stb_out <= 0;
      else if(bypass)
        stb_out <= stb_in;
      else
-       stb_out <= 0;
+       stb_out <= stb_out_pre[9];
  
-   MULT18X18S mult1(.C(clk), .CE(do_mult), .R(rst), .P(prod1), .A(coeff1), 
.B(sum1) );
-   MULT18X18S mult2(.C(clk), .CE(do_mult), .R(rst), .P(prod2), .A(coeff2), 
.B(sum2) );
-   add2_and_round_reg #(.WIDTH(18)) add3 
(.clk(clk),.in1(prod1[35:18]),.in2(prod2[35:18]),.sum(final_sum_unreg));
- 
 endmodule // hb_dec





reply via email to

[Prev in Thread] Current Thread [Next in Thread]