Skip to content

Commit

Permalink
pulsar_adc: add split transfer functionality
Browse files Browse the repository at this point in the history
add a parameter, SPLIT_TRANSFER_SIZE, to enable and control split transfers. If
SPLIT_TRANSFER_SIZE is set to 0 (default), the project behaves as usual (no
split transfers). Otherwise, an asymetric fifo is used to stitch together 2
transfers before sending them to the DMA, SPLIT_TRANSFER_SIZE being used to
indicate the size of each transfer in the split.

Signed-off-by: Laez Barbosa <[email protected]>
  • Loading branch information
LBFFilho committed Oct 4, 2024
1 parent 1dd8efc commit a99fac3
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 1 deletion.
9 changes: 9 additions & 0 deletions docs/projects/pulsar_adc/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,15 @@ These modes are selected using the ``SPI_OP_MODE`` parameter:

The SPI_OP_MODE parameter must only be used for the FMC variant.

Some ADCs like the AD7944 allow for split transfers, which require samples to be
assembled out of two SPI Engine transfer reads from the ADC. This is enabled by
the ``SPLIT_TRANSFER_SIZE`` parameter. If 0, split transfers are disabled. For
values greater than 0, it determines the size of each of the two transfers that
make up the split transfer.

* 0 - for no split transfers (default)
* N - for N>0, selects the size of each transfer that make up the sample

CPU/Memory interconnects addresses
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Expand Down
27 changes: 26 additions & 1 deletion projects/pulsar_adc/common/pulsar_adc_bd.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ set num_sdo 1
set sdi_delay 1
set echo_sclk 0

set SPLIT_TRANSFER_SIZE [get_env_param SPLIT_TRANSFER_SIZE 0]

set hier_spi_engine spi_pulsar_adc

spi_engine_create $hier_spi_engine $data_width $async_spi_clk $num_cs $num_sdi $num_sdo $sdi_delay $echo_sclk
Expand All @@ -40,6 +42,24 @@ ad_ip_parameter axi_pulsar_adc_dma CONFIG.DMA_2D_TRANSFER 0
ad_ip_parameter axi_pulsar_adc_dma CONFIG.DMA_DATA_WIDTH_SRC $data_width
ad_ip_parameter axi_pulsar_adc_dma CONFIG.DMA_DATA_WIDTH_DEST 64

if {$SPLIT_TRANSFER_SIZE != 0} {
ad_ip_instance util_axis_fifo_asym rx_asym_fifo
ad_ip_parameter rx_asym_fifo CONFIG.ASYNC_CLK 0
ad_ip_parameter rx_asym_fifo CONFIG.S_DATA_WIDTH $SPLIT_TRANSFER_SIZE
ad_ip_parameter rx_asym_fifo CONFIG.S_ADDRESS_WIDTH 3
ad_ip_parameter rx_asym_fifo CONFIG.M_DATA_WIDTH [expr {2*$SPLIT_TRANSFER_SIZE}]
ad_ip_parameter rx_asym_fifo CONFIG.M_AXIS_REGISTERED 1
ad_ip_parameter rx_asym_fifo CONFIG.ALMOST_EMPTY_THRESHOLD 2
ad_ip_parameter rx_asym_fifo CONFIG.ALMOST_FULL_THRESHOLD 6
ad_ip_parameter rx_asym_fifo CONFIG.TLAST_EN 0
ad_ip_parameter rx_asym_fifo CONFIG.TKEEP_EN 0

ad_connect spi_clk rx_asym_fifo/s_axis_aclk
ad_connect $hier_spi_engine/${hier_spi_engine}_axi_regmap/spi_resetn rx_asym_fifo/s_axis_aresetn
ad_connect spi_clk rx_asym_fifo/m_axis_aclk
ad_connect $hier_spi_engine/${hier_spi_engine}_axi_regmap/spi_resetn rx_asym_fifo/m_axis_aresetn
}

ad_connect $sys_cpu_clk spi_clkgen/clk
ad_connect spi_clk spi_clkgen/clk_0

Expand All @@ -48,7 +68,12 @@ ad_connect $sys_cpu_clk pulsar_adc_trigger_gen/s_axi_aclk
ad_connect sys_cpu_resetn pulsar_adc_trigger_gen/s_axi_aresetn
ad_connect pulsar_adc_trigger_gen/pwm_0 $hier_spi_engine/trigger

ad_connect axi_pulsar_adc_dma/s_axis $hier_spi_engine/M_AXIS_SAMPLE
if {$SPLIT_TRANSFER_SIZE != 0} {
ad_connect rx_asym_fifo/s_axis $hier_spi_engine/M_AXIS_SAMPLE
ad_connect axi_pulsar_adc_dma/s_axis rx_asym_fifo/m_axis
} else {
ad_connect axi_pulsar_adc_dma/s_axis $hier_spi_engine/M_AXIS_SAMPLE
}
ad_connect $hier_spi_engine/m_spi pulsar_adc_spi

ad_connect $sys_cpu_clk $hier_spi_engine/clk
Expand Down
1 change: 1 addition & 0 deletions projects/pulsar_adc/zed/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,6 @@ LIB_DEPS += spi_engine/spi_engine_interconnect
LIB_DEPS += spi_engine/spi_engine_offload
LIB_DEPS += sysid_rom
LIB_DEPS += util_i2c_mixer
LIB_DEPS += util_axis_fifo_asym

include ../../scripts/project-xilinx.mk
5 changes: 5 additions & 0 deletions projects/pulsar_adc/zed/system_project.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ source $ad_hdl_dir/projects/scripts/adi_board.tcl
##
set FMC_N_PMOD [get_env_param FMC_N_PMOD 1]
set SPI_OP_MODE [get_env_param SPI_OP_MODE 0]
set SPLIT_TRANSFER_SIZE [get_env_param SPLIT_TRANSFER_SIZE 0]

adi_project pulsar_adc_pmdz_zed 0 [list \
FMC_N_PMOD [get_env_param FMC_N_PMOD 1] \
Expand Down Expand Up @@ -56,5 +57,9 @@ if {$FMC_N_PMOD == 0} {
return -code error [format "ERROR: Invalid eval board type! ..."]
}

if {$SPLIT_TRANSFER_SIZE < 0 || ![string is integer $SPLIT_TRANSFER_SIZE]} {
return -code error [format "ERROR: Illegal value for SPLIT_TRANSFER_SIZE ..."]
}

adi_project_run pulsar_adc_pmdz_zed

0 comments on commit a99fac3

Please sign in to comment.