half duplex set_auto_tx timing problems

简介:
Hi Ian,

Wow, thanks for the technical explanation! That makes a whole lot of
sense (see below for further questions).

On Mon, Jun 3, 2013 at 8:19 PM, Ian Buckley <address@hidden> wrote:
> Miklos,
> Here's a little bit more information about how the half-duplex operation 
> works from the H/W side.
> The verilog module "gpio_atr" contains 5 32bit configuration registers that 
> are programmed by the driver.
> This block connects to the radio daughter cards via the "io_rx" and "io_tx" 
> buses (which together have 32signals), and each daughter board uses theses 
> signals in a different way depending on the specific radio design.

Yes, I got this far in understanding the verilog code.

> One of the registers programs each of the 32signals to determine if they are 
> inputs or outputs from the FPGA.
> The remaining 4 registers contain the state that is driven out onto signals 
> (configured as outputs) in each of four states:
> IDLE, RX only, TX only, TX and RX. The current state is detemined from 
> inspection of the "run_rx" and "run_tx" signals that you will find in 
> u2plus_core.v.
> The state of these signals in turn is driven from UHD commands that are sent 
> from the host. When they are asserted then the respective DSP is enabled and 
> samples are delivered to/from the host.
> No switching of TX and RX data streams is done on the host to implement 
> half-duplex operation, the only switch is analog and very close to the TX/RX 
> antenna connection, and this switch is controlled by some of the GPIO bits I 
> have referred to.

Excellent! I will look into this.

> Internal to the FPGA "vita_time" which is a 64bit count of samples (100MHz on 
> N210) is used to schedule all DSP operation. When you send a TX stream 
> command with a time in the future, data is buffered in the FPGA ready to 
> start transmission, and when "vita_time" matches the time supplied with the 
> TX stream command, the "run_tx" signal is asserted causing both the DSP to 
> become enabled (and buffered data to be drawn into it), and also the 
> "gpio_atr" state machine to change state causing the analog RX/TX switch to 
> toggle. There is a delay of some 10's of clock cycles for data to pass 
> through the FPGA TX DSP logic and out to the DAC.
>
> Hope this is enough information to help you understand the code further.

Yup, this is what I needed. One more thing: is it true, that once we
make the switch I can still download packets from the FPGA to the HOST
in the RX channel continuously and undisturbed? If I do not use
tx_time at all, but listen while I transmit, then I will get back the
leaked transmission, so I know exactly how many samples off are the RX
channel with respect to the TX channel. Will the same happen with the
RX/TX switch scheduled with tx_time?

Best,
Miklos

> -Ian
>
>
>
>
>
>
> On Jun 3, 2013, at 5:50 PM, Miklos Maroti <address@hidden> wrote:
>
>> Hi Marcus,
>>
>> Thanks for the quick comments. Yes, I totally agree that using full
>> duplex with RX2 and TX/RX would be the ideal way to go, and as you say
>> I can easily ignore and synchronize with my own transmissions. The
>> problem is that I am required to use a single antenna, so I have to do
>> a half duplex solution with all its warts and synchronization
>> problems.
>>
>> As for the switching time, I do not care if the switches (or the FPGA)
>> introduce deterministic delays, I can cope with that.
>>
>> You mention that the state machine is set up in the daughter card
>> setup driver. Is this the file in
>> "host/lib/usrp/dboard/db_sbx_common.cpp" for the SBX board? Is this
>> code used for USRP2 and not only for USRP1?
>>
>> Best,
>> Miklos
>>
>> On Mon, Jun 3, 2013, Marcus Leech wrote:
>>>
>>> Some very quick comments.
>>>
>>> I don't think you're going to achieve nanosecond-scale TX/RX switching 
>>> times, no matter how much you tweak the FPGA. The switches
>>> themselves introduce, I'm estimating, a 50nsec delay all by themselves.
>>>
>>> In UHD, the ATR state machine is programmed during daughtercard setup by 
>>> the "driver" for a given daughtercard -- this allows somewhat
>>> different behaviour for cards that are hardware-constrained to be 
>>> half-duplex (like XCVR2450). In the daughtercard drivers, you'll see things
>>> like:
>>>
>>> this->get_iface()->set_atr_reg(dboard_iface::UNIT_TX, 
>>> dboard_iface::ATR_REG_IDLE, band_sel | ad9515div | TX_DIS_TXIO);
>>>
>>>
>>> Which are setting up ATR registers.
>>>
>>> But that being said, I think you're best to run in a mode where you have a 
>>> separate RX antenna if you require nanosecond-scale turnaround
>>> times. You'll end up receiving your own transmissions, but that's fairly 
>>> easy to cope with, I imagine.
>>>
>>> If you setup to use (WBX example) RX2 for RX and TX/RX for TX, then there's 
>>> no switching involved. You just have to ignore your own
>>> transmissions.
>>>
>>>>> Hi Guys!
>>>>>
>>>>> I am trying to develop a half duplex application with N210 and SBX
>>>>> daughterboard with the latest (git head) gnuradio that needs precise
>>>>> TX/RX switching times (like in TDMA) in the order of a few samples
>>>>> (nanoseconds). I have played with the tx_time, tx_sob, tx_eob tags and
>>>>> they do not seem to solve the problem. My findings so far are:
>>>>>
>>>>> 1) tx_sob/tx_eob does not influence anything related to the TX/RX
>>>>> switch, it only controls the grouping of the TX data stream into UDP
>>>>> packets (tx_sob starts a new UDP packet, tx_eof pushes out the last
>>>>> UDP packet even if it is not full). The same is true for USRP1 but
>>>>> that uses USB packets.
>>>>>
>>>>> 2) tx_time is translated into the metadata_t struct in the host code
>>>>> and then it is translated into VITA packet time stamps (converts the
>>>>> fractional second part into sample numbers). The integer part of
>>>>> tx_time seems to be discarded, but I still get "L" (timestamp in the
>>>>> past error), so I do not understand why the FPGA will not wait a
>>>>> little if only the factional part is considered.
>>>>>
>>>>> 3) I have found this discussion online about TX/RX switch:
>>>>>
>>>>> http://lists.gnu.org/archive/html/discuss-gnuradio/2009-03/msg00034.html
>>>>>
>>>>> where Matt Ettus said that "The act of transmitting turns off the
>>>>> receiver, so no amount of software will ever change that." in
>>>>> discussing half duplex operation. Now it is not clear if that comment
>>>>> is also applicable to the N210 and SBX, and what does he mean by "the
>>>>> act of transmitting". Specifically, if I send a packet with tx_time in
>>>>> the future, does the FPGA switches to RX mode while it is waiting?
>>>>>
>>>>> 4) We have looked up the FPGA code, and it seems that the timing is
>>>>> implemented in a short FIFO when handling the VITA UDP packets. I
>>>>> could not trace the code further, and I do not see the logic in the
>>>>> FPGA code that does the automatic switching between RX and TX. Where
>>>>> is that implemented?
>>>>>
>>>>> 5) Is it true that to switch between RX and TX then the host has to
>>>>> issue a command (poke register) to update the appropriate pin on the
>>>>> FPGA? If so, then how can you time the update of that pin to specific
>>>>> sample numbers?
>>>>>
>>>>> 6) Is it true that the firmware soft core has nothing to do with the
>>>>> time sensitive data and control handling, so in particular the
>>>>> provided register access features (if I saw them correctly) are not
>>>>> used in timing sensitive paths?
>>>>>
>>>>> 7) It is not clear how the gnuradio UHD sink block handles the sample
>>>>> rate value in the presence of tx_time tags. For example, if I generate
>>>>> 10 small packets each of which has a tx_sob,tx_time and tx_eob and 0.1
>>>>> sec delay between the times, and all of these small packets are put
>>>>> into the transmit fifo at once, then what happens? What is the rate
>>>>> that the UHD sink block will consume this data? It cannot be the
>>>>> sample rate, because these tags point to the future, so the
>>>>> consumption rate should be reduced, but is it what happens? Will the
>>>>> code switch the TX/RX switch to RX between the small packets if all
>>>>> those are already in the queue?
>>>>>
>>>>> I hope someone has answers to these questions. Searching the internet
>>>>> turned up next to nothing on these subjects.
>>>>>
>>>>> Miklos
目录
相关文章
|
10月前
FEC1 Waiting for PHY auto negotiation to complete......... TIMEOUT !
FEC1 Waiting for PHY auto negotiation to complete......... TIMEOUT !
177 0
|
9月前
|
芯片
Constant frequency mode(恒频模式)和Burst mode(点放模式)
Constant frequency mode是指恒频模式或者连续模式,Burst mode是指点放模式或者突发模式。这两个概念在DC-DC开关电源中比较常见,大家都了解开关电源是通过PWM信号控制开关管的通断来进行供电。恒频模式指PWM信号频率保持不变,开关电源一直在工作,这样电压比较稳定。点放模式下,开关管不是周期性开关的,当在轻负载状态下(一般是设备进入低功耗休眠模式),当电压低于预设电压时,导通一次开关管,这样就比较省电。
156 0
|
C语言
[Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode 解决方法
[Error] ‘for’ loop initial declarations are only allowed in C99 or C11 mode [Note] use option -std=c99,-std=gnu99,-std=c11 or-std=gnu11 to compile your code
1173 0
[Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode 解决方法
|
C语言
解决Dev-C++ [Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode
Dev-C++ [Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode
485 0
解决Dev-C++ [Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode
|
C++
PAT (Advanced Level) Practice - 1038 Recover the Smallest Number(30 分)
PAT (Advanced Level) Practice - 1038 Recover the Smallest Number(30 分)
99 0
|
安全 对象存储
set_time_limit() has been disabled for security reasons
set_time_limit() has been disabled for security reasons
143 0
set_time_limit() has been disabled for security reasons
|
C语言
[Error] ‘for‘ loop initial declarations are only allowed in C99 mode
[Error] ‘for‘ loop initial declarations are only allowed in C99 mode
290 0
[Error] ‘for‘ loop initial declarations are only allowed in C99 mode
is transfer = C ( only read dynamically) not supported in one order scenario
is transfer = C ( only read dynamically) not supported in one order scenario
102 0
is transfer = C ( only read dynamically) not supported in one order scenario
After Opp is saved - change mode filling place
After Opp is saved - change mode filling place
After Opp is saved - change mode filling place