commit-gnuradio
[Top][All Lists]
Advanced

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

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


From: matt
Subject: [Commit-gnuradio] r8019 - usrp2/trunk/fpga/sdr_lib
Date: Thu, 13 Mar 2008 21:44:14 -0600 (MDT)

Author: matt
Date: 2008-03-13 21:44:13 -0600 (Thu, 13 Mar 2008)
New Revision: 8019

Added:
   usrp2/trunk/fpga/sdr_lib/hb_dec.v
Log:
first cut


Added: usrp2/trunk/fpga/sdr_lib/hb_dec.v
===================================================================
--- usrp2/trunk/fpga/sdr_lib/hb_dec.v                           (rev 0)
+++ usrp2/trunk/fpga/sdr_lib/hb_dec.v   2008-03-14 03:44:13 UTC (rev 8019)
@@ -0,0 +1,80 @@
+// Final halfband decimator 
+// 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
+
+module hb_dec
+  #(parameter WIDTH=18)
+    (input clk,
+     input rst,
+     input bypass,
+     input stb_in,
+     input [WIDTH-1:0] data_in,
+     output reg stb_out,
+     output [WIDTH-1:0] data_out);
+
+   wire [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;
+   
+   always @*
+     case(coeff_addr)
+       0 : coeff1 <= 12345;
+       1 : coeff1 <= 1235;
+       2 : coeff1 <= 3456;
+       3 : coeff1 <= 345;
+       default : coeff1 <= 23456;
+     endcase // case(coeff_addr)
+   
+   always @*
+     case(coeff_addr)
+       0 : coeff2 <= 12345;
+       1 : coeff2 <= 1235;
+       2 : coeff2 <= 3456;
+       3 : coeff2 <= 345;
+       default : coeff2 <= 23456;
+     endcase // case(coeff_addr)
+   
+   srl #(.WIDTH(18)) 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
+     
(.clk(clk),.write(write_odd),.in(data_in),.addr(addr_odd_b),.out(data_odd_b));
+   srl #(.WIDTH(18)) 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
+     
(.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));
+   
+   srl #(.WIDTH(18)) srl_even
+     
(.clk(clk),.write(write_even),.in(data_in),.addr(addr_even),.out(data_even));
+
+   wire [17:0]                 final_sum_unreg;
+   
+   always @(posedge clk)
+     if(bypass)
+       final_sum <= data_in;
+     else
+       final_sum <= final_sum_unreg;
+
+   assign              data_out = final_sum;
+
+   always @(posedge clk)
+     if(rst)
+       stb_out <= 0;
+     else if(bypass)
+       stb_out <= stb_in;
+     else
+       stb_out <= 0;
+ 
+   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]