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 |