Hi Martin,

Sorry I should've elaborated on my purpose.

I'm using a device to connect external TTL signals to the RxBasic
daughterboard GPIO pins on chA of the x310.  I'm stealing an analog channel
on the x310 to capture timing on one channel with the analog input on the
2nd channel.  This data is recorded on the host PC from the 10 GbE
interface.  I've made an application based on the rx_samples_to_file
utility that sets the daughterboard RX GPIO banks appropriately and I can
see the GPIO inputs in the Ethernet capture from my utility in the recorded
binary files (chA and chB).

Assuming a 1 MSps sample rate from the DDC and 64 samples/packet, the rate
on the axis rfnoc bus is 15.625 kHz (64 us period).  The problems arise
when the rate on the GPIO pin roughly exceeds half the packet rate on the
axis data plane.  Basically it gets aliased.  Here are the lines from the
HDL file in my block that sits between the DDC and the SEP.  I created a
testbench as well and placed a clock on a GPIO input to see what is
happening.  Also created/loaded an image to x310 and observed in the
Ethernet output, which confirmed what I see in the testbench.

assign s_out_axis_tdata = { 16'b0, radio_rx_gpio[15:0] };
assign s_out_axis_tlast = m_in_axis_tlast;
assign s_out_axis_tvalid = m_in_axis_tvalid;
assign s_out_axis_tlength = m_in_axis_tlength;
assign s_out_axis_ttimestamp = m_in_axis_ttimestamp;
assign s_out_axis_thas_time = m_in_axis_thas_time;
assign s_out_axis_tlength = m_in_axis_tlength;
assign s_out_axis_teov = m_in_axis_teov;
assign s_out_axis_teob = m_in_axis_teob;
assign m_in_axis_tready = s_out_axis_tready;

assign s_out_axis_tkeep = {NUM_PORTS{1'b1}};

Here are the lines from the image core yaml that show how the block is
connected.

# # radio0(0) to ep0 - RFA RX
- { srcblk: radio0, srcport: out_0, dstblk: ddc0, dstport: in_0 }
- { srcblk: ddc0, srcport: out_0, dstblk: rx_analog_dio_sw0, dstport: in_0
}
- { srcblk: rx_analog_dio_sw0, srcport: out_0, dstblk: ep0, dstport: in0 }

As a side note, this worked in UHD 3.9.  But that seemed entirely
different.  The DDC was a submodule of the Radio block.  The output of the
DDC was not packetized on the axis protocol at that point.  So it was
straightforward to assign the GPIO pins and then the packetization took
place later.  In UHD 4.x, the data from the DDC is packetized onto the axis
data plane already.

My thought right now is that I need to clock the GPIO pins into a generic
FIFO at the DDC rate with my own clock, connect that to the NOC shell and
let the NOC shell unload the FIFO when the axis data plane is ready.  Does
this seem like a path forward?  I'm glossing over a ton of the intricacies
and making it sound trivial.  Feel free to destroy my plan.

Hopefully this makes my intent a little clearer.

Thanks you,
Mark


On Wed, Nov 6, 2024 at 1:07 AM Martin Braun <martin.br...@ettus.com> wrote:

> Hey Mark,
>
> maybe I'm being dense, but I don't understand what it is that your GPIO
> pins are supposed to be doing when your system is done. Can you elaborate?
>
> --M
>
> On Wed, Nov 6, 2024 at 1:56 AM <mgan...@gmail.com> wrote:
>
>> Hi everybody!
>>
>> I’ve written an RFNOC block that assigns the daughterboard rx GPIO pins
>> to the tdata signals that are sent to the SEP. I’m using the axis_data
>> protocol and the block is placed statically between the DDC and the SEP. I
>> use the tvalid and tlast signal from the upstream (DDC) block and the
>> tready signal from the downstream (SEP) block. I brought the GPIO into the
>> block using appropriate YAML files. Small modification outside of RFNOC
>> were required to get the pins to RFNOC (bus_int.v, x300_core.v,
>> io_signatures.yml, and x310_bsp.yml).
>>
>> The x310 is operated at 1 Msps and there are 64 samples per CHDR packet
>> on the axis data bus. This means that the packet rate on the bus is 1 Msps
>> / 64, or 15.625 kHz. Period is 64 us.
>>
>> If I place a signal onto the GPIO pin, everything is fine as long as the
>> pulse width is greater than 64 us. I can run the radio with
>> rx_samples_to_file and see the GPIO pins faithfully reproduced in the
>> Ethernet output collected on a PC.
>>
>> At pulse widths less than 64 us, the signal is essentially aliased. I
>> believe it’s because I’m using the tvalid, tlast, and tready signals from
>> upstream/downstream blocks with data that’s already on the axis data plane.
>> That data bursts through with 64 samples roughly every 64 us and is clocked
>> with a 200 MHz master clock. I need to clock in the asynchronous GPIO.
>>
>> My question: What is the best way to do this? Generate my own clock and
>> use a generic FIFO like axi_fifo.v to hold the data until the upstream
>> block sends its data and the downstream block is ready to receive?
>>
>> Thank you,
>>
>> Mark
>> _______________________________________________
>> USRP-users mailing list -- usrp-users@lists.ettus.com
>> To unsubscribe send an email to usrp-users-le...@lists.ettus.com
>>
>
_______________________________________________
USRP-users mailing list -- usrp-users@lists.ettus.com
To unsubscribe send an email to usrp-users-le...@lists.ettus.com

Reply via email to