Statistics
| Branch: | Tag: | Revision:

root / usrp2 / sdr_lib / rx_frontend.v @ 4f94819a

History | View | Annotate | Download (2.6 KB)

1 f8a04a48 Matt Ettus
2
module rx_frontend
3 321305a6 Matt Ettus
  #(parameter BASE = 0,
4 d5cbb773 Josh Blum
    parameter IQCOMP_EN = 1)
5 f8a04a48 Matt Ettus
   (input clk, input rst,
6
    input set_stb, input [7:0] set_addr, input [31:0] set_data,
7
8
    input [15:0] adc_a, input adc_ovf_a,
9
    input [15:0] adc_b, input adc_ovf_b,
10
11 6c28203a Matt Ettus
    output [23:0] i_out, output [23:0] q_out,
12 f8a04a48 Matt Ettus
    input run,
13
    output [31:0] debug
14
    );
15
   
16
   reg [15:0] 	  adc_i, adc_q;
17
   wire [17:0] 	  adc_i_ofs, adc_q_ofs;
18 3993b882 Matt Ettus
   wire [35:0] 	  corr_i, corr_q; wire [17:0] 	  mag_corr,phase_corr;
19
   wire 	  swap_iq;
20 f8a04a48 Matt Ettus
   
21 3993b882 Matt Ettus
   setting_reg #(.my_addr(BASE), .width(1)) sr_8
22 f8a04a48 Matt Ettus
     (.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),
23 3993b882 Matt Ettus
      .in(set_data),.out(swap_iq),.changed());
24 f8a04a48 Matt Ettus
25
   always @(posedge clk)
26 3993b882 Matt Ettus
     if(swap_iq) // Swap
27
       {adc_i,adc_q} <= {adc_b,adc_a};
28
     else
29
       {adc_i,adc_q} <= {adc_a,adc_b};
30
       
31 f8a04a48 Matt Ettus
   setting_reg #(.my_addr(BASE+1),.width(18)) sr_1
32
     (.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),
33 2bad9b4d Matt Ettus
      .in(set_data),.out(mag_corr),.changed());
34 f8a04a48 Matt Ettus
   
35
   setting_reg #(.my_addr(BASE+2),.width(18)) sr_2
36
     (.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),
37 2bad9b4d Matt Ettus
      .in(set_data),.out(phase_corr),.changed());
38 f8a04a48 Matt Ettus
39 321305a6 Matt Ettus
   generate
40
      if(IQCOMP_EN == 1)
41
	begin
42
	   rx_dcoffset #(.WIDTH(18),.ADDR(BASE+3)) rx_dcoffset_i
43
	     (.clk(clk),.rst(rst),.set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
44
	      .in({adc_i,2'b00}),.out(adc_i_ofs));
45
	   
46
	   rx_dcoffset #(.WIDTH(18),.ADDR(BASE+4)) rx_dcoffset_q
47
	     (.clk(clk),.rst(rst),.set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
48
	      .in({adc_q,2'b00}),.out(adc_q_ofs));
49
	   
50
	   MULT18X18S mult_mag_corr
51
	     (.P(corr_i), .A(adc_i_ofs), .B(mag_corr), .C(clk), .CE(1), .R(rst) ); 
52
	   
53
	   MULT18X18S mult_phase_corr
54
	     (.P(corr_q), .A(adc_i_ofs), .B(phase_corr), .C(clk), .CE(1), .R(rst) );
55
	   
56
	   add2_and_clip_reg #(.WIDTH(24)) add_clip_i
57
	     (.clk(clk), .rst(rst), 
58 52b552f4 Josh Blum
	      .in1({adc_i_ofs,6'd0}), .in2(corr_i[35:12]), .strobe_in(1'b1),
59 321305a6 Matt Ettus
	      .sum(i_out), .strobe_out());
60
	   
61
	   add2_and_clip_reg #(.WIDTH(24)) add_clip_q
62
	     (.clk(clk), .rst(rst), 
63 52b552f4 Josh Blum
	      .in1({adc_q_ofs,6'd0}), .in2(corr_q[35:12]), .strobe_in(1'b1),
64 321305a6 Matt Ettus
	      .sum(q_out), .strobe_out());
65
	end // if (IQCOMP_EN == 1)
66
      else
67
	begin
68
	   rx_dcoffset #(.WIDTH(24),.ADDR(BASE+3)) rx_dcoffset_i
69
	     (.clk(clk),.rst(rst),.set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
70
	      .in({adc_i,8'b00}),.out(i_out));
71
	   
72
	   rx_dcoffset #(.WIDTH(24),.ADDR(BASE+4)) rx_dcoffset_q
73
	     (.clk(clk),.rst(rst),.set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
74
	      .in({adc_q,8'b00}),.out(q_out));
75
	end // else: !if(IQCOMP_EN == 1)
76
      endgenerate
77 56853530 Matt Ettus
   
78 f8a04a48 Matt Ettus
endmodule // rx_frontend