On 09/29/2012 09:45 AM, Anisha G. wrote:
Thanks Josh,
What I am looking for on the TX side of things is basically the same thing
I have on the RX side. If I set the subdev spec on the basic RX to “A:A
A:B” and then use usrp->set_rx_freq(uhd::tune_request_t(freq)) for each
channel, I get two separate rx channels, both with their own IQ pairs. On
the TX side I only manage to have one IQ pair, as in I through TX_A and Q
through TX_B. We were trying for a 4 channel transmit on 2 USRPs, so that
they could all be connected by s MIMO cable. One more question, when you
say “too complicated to be worth it”, generally, what kind of modification
would be necessary?
The reason for the complication is there is this whole flow control
implementation for the TX. Here is my suggestion:
On the host, interleave your MIMO channels. So send 1 TX channel where
the samples are ch0IQ0, ch1IQ0, ch0IQ1…
In the FPGA, a good way is to modify the top level to have two DUC
chains. See right here:
http://code.ettus.com/redmine/ettus/projects/uhd/repository/revisions/master/entry/fpga/usrp2/top/N2x0/u2plus_core.v#L716
Instantiate two DUC chains. Most of the wires can stay the same. Since
this is MIMO, you want both DUC chains to have the same settings
anyways. What you want to do here is to play with the strobe_tx signal
such that every even strobe is off for DUC0 and every off strobe is off
for DUC1… thats effectively the deinterleave. Also notice how the
tx_fe outputs are connected.
reg even;
always @(posedge dsp_clk)
if (~run_tx) even <= 0;
else if (strobe_tx) even <= ~even;
duc_chain #(.BASE(SR_TX_DSP), .DSPNO(0)) duc_chain0
(.clk(dsp_clk),.rst(dsp_rst), .clr(clear_tx),
.set_stb(set_stb_dsp),.set_addr(set_addr_dsp),.set_data(set_data_dsp),
.set_stb_user(set_stb_user), .set_addr_user(set_addr_user),
.set_data_user(set_data_user),
.tx_fe_i(tx_fe_i),.tx_fe_q(),
.sample(sample_tx), .run(run_tx), .strobe(strobe_tx & even),
.debug() );
duc_chain #(.BASE(SR_TX_DSP), .DSPNO(0)) duc_chain1
(.clk(dsp_clk),.rst(dsp_rst), .clr(clear_tx),
.set_stb(set_stb_dsp),.set_addr(set_addr_dsp),.set_data(set_data_dsp),
.set_stb_user(set_stb_user), .set_addr_user(set_addr_user),
.set_data_user(set_data_user),
.tx_fe_i(tx_fe_q),.tx_fe_q(),
.sample(sample_tx), .run(run_tx), .strobe(strobe_tx & ~even),
.debug() );
-Josh