From f76689612696c928f5581d0d13452eee0f74ce7f Mon Sep 17 00:00:00 2001 From: Stanca Pop Date: Thu, 18 Jul 2024 16:29:23 +0300 Subject: [PATCH] pcx: Rename cn0585 folders --- .../streaming/cn0585/CN0585_streaming.m | 74 +++++ .../CN0585_streaming_axi4lite_read_write.m | 96 +++++++ ...0585_host_axi4_lite_read_write_example.slx | Bin 0 -> 27263 bytes .../zynq-zed-adv7511-cn0585.dts | 269 ++++++++++++++++++ .../+common/add_io.m | 17 ++ .../hdlcoder_ref_design_customization.m | 20 ++ .../+common/plugin_board.m | 29 ++ .../+common/plugin_rd.m | 110 +++++++ .../+zed/+tx/add_tx_io.m | 107 +++++++ .../+tx/hdlcoder_ref_design_customization.m | 20 ++ .../+zed/+tx/plugin_board.m | 9 + .../+zed/+tx/plugin_rd.m | 8 + .../hdlworkflow_cn0585_gpio_zed_tx.m | 38 +++ .../testModel_Tx16and8.slx | Bin 0 -> 45619 bytes .../targeting/cn0585/cn0585_hdl/adi_build.tcl | 59 ++++ .../targeting/cn0585/cn0585_hdl/build_bsp.sh | 88 ++++++ .../cn0585/cn0585_hdl/fh_preprocess.tcl | 6 + .../cn0585/cn0585_hdl/matlab_processors.tcl | 138 +++++++++ .../targeting/cn0585/cn0585_hdl/ports.json | 176 ++++++++++++ .../cn0585/cn0585_hdl/system_project_rxtx.tcl | 35 +++ .../testModel_Tx16and8.slx | Bin 0 -> 45619 bytes 21 files changed, 1299 insertions(+) create mode 100644 pcx_examples/streaming/cn0585/CN0585_streaming.m create mode 100755 pcx_examples/streaming/cn0585/cn0585_axi4_lite_rw_demo/CN0585_streaming_axi4lite_read_write.m create mode 100755 pcx_examples/streaming/cn0585/cn0585_axi4_lite_rw_demo/cn0585_host_axi4_lite_read_write_example.slx create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_axi4_lite_demo/zynq-zed-adv7511-cn0585.dts create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/add_io.m create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/hdlcoder_ref_design_customization.m create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/plugin_board.m create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/plugin_rd.m create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/add_tx_io.m create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/hdlcoder_ref_design_customization.m create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/plugin_board.m create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/plugin_rd.m create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/hdlworkflow_cn0585_gpio_zed_tx.m create mode 100644 pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/testModel_Tx16and8.slx create mode 100644 pcx_examples/targeting/cn0585/cn0585_hdl/adi_build.tcl create mode 100755 pcx_examples/targeting/cn0585/cn0585_hdl/build_bsp.sh create mode 100644 pcx_examples/targeting/cn0585/cn0585_hdl/fh_preprocess.tcl create mode 100755 pcx_examples/targeting/cn0585/cn0585_hdl/matlab_processors.tcl create mode 100755 pcx_examples/targeting/cn0585/cn0585_hdl/ports.json create mode 100644 pcx_examples/targeting/cn0585/cn0585_hdl/system_project_rxtx.tcl create mode 100644 pcx_examples/targeting/cn0585/cn0585_led_sw_gpio_control_demo/testModel_Tx16and8.slx diff --git a/pcx_examples/streaming/cn0585/CN0585_streaming.m b/pcx_examples/streaming/cn0585/CN0585_streaming.m new file mode 100644 index 0000000..a9d9e81 --- /dev/null +++ b/pcx_examples/streaming/cn0585/CN0585_streaming.m @@ -0,0 +1,74 @@ +% CN0585 Streaming example + +board_ip = 'local_board_ip'; +uri = cat(2, 'ip:', board_ip); + +% Describe the devices + +cn0585_device_rx = adi.CN0585.Rx('uri',uri); +cn0585_device_tx0 = adi.CN0585.Tx0('uri',uri); +cn0585_device_tx1 = adi.CN0585.Tx1('uri',uri); + +cn0585_device_tx0.EnableCyclicBuffers = true; +cn0585_device_tx1.EnableCyclicBuffers = true; + +cn0585_device_rx.BufferTypeConversionEnable = true; + +% Enable the channels to write data to (options are 1, 2 ) + +cn0585_device_tx0.EnabledChannels = [1, 2]; +cn0585_device_tx1.EnabledChannels = [1, 2]; + +% Enable the channels to read data from (options are 1, 2, 3 ,4 ) + +cn0585_device_rx.EnabledChannels = [1, 2, 3, 4]; + +% Generate the sinewave signal + +amplitude = 2 ^ 15; +sampFreq = cn0585_device_tx0.SamplingRate; +toneFreq = 1e3; +N = sampFreq / toneFreq; +x = linspace(-pi, pi, N).'; +sine_wave = amplitude * sin(x); + +% Continuously load data in the buffer and configure the GPIOs state +% (SetupInit Base file) +% DAC1 has to be updated and started first and then DAC0 in order to have syncronized data between devices + +cn0585_device_tx1([sine_wave, sine_wave]); +cn0585_device_tx0([sine_wave, sine_wave]); + +% Stream status available options: "start_stream_synced", "start_stream", "stop_stream" + +cn0585_device_tx1.StreamStatus = 'start_stream'; +cn0585_device_tx0.StreamStatus = 'start_stream'; + +% The data will be stored inside "data" variable + +data = cn0585_device_rx(); + +title('ADAQ23876 Channels'); +subplot(4, 1, 1); +plot(data(:, 1)); +ylabel('Channel A'); +subplot(4, 1, 2); +plot(data(:, 2)); +ylabel('Channel B'); +subplot(4, 1, 3); +plot(data(:, 3)); +ylabel('Channel C'); +subplot(4, 1, 4); +plot(data(:, 4)); +ylabel('Channel D'); +xlabel('Number of samples'); + +% Release the device + +cn0585_device_tx1.StreamStatus = 'stop_stream'; +cn0585_device_tx0.StreamStatus = 'stop_stream'; + +cn0585_device_tx1.release(); +cn0585_device_tx0.release(); + +cn0585_device_rx.release(); diff --git a/pcx_examples/streaming/cn0585/cn0585_axi4_lite_rw_demo/CN0585_streaming_axi4lite_read_write.m b/pcx_examples/streaming/cn0585/cn0585_axi4_lite_rw_demo/CN0585_streaming_axi4lite_read_write.m new file mode 100755 index 0000000..935eaa0 --- /dev/null +++ b/pcx_examples/streaming/cn0585/cn0585_axi4_lite_rw_demo/CN0585_streaming_axi4lite_read_write.m @@ -0,0 +1,96 @@ +% CN0585 Streaming example for AXI4 Lite register read/write + +board_ip = 'local_board_ip'; +uri = cat(2, 'ip:', board_ip); + +% Describe the devices + +cn0585_device_rx = adi.CN0585.Rx('uri',uri); +cn0585_device_tx0 = adi.CN0585.Tx0('uri',uri); +cn0585_device_tx1 = adi.CN0585.Tx1('uri',uri); + +cn0585_device_tx0.EnableCyclicBuffers = true; +cn0585_device_tx1.EnableCyclicBuffers = true; + +cn0585_device_rx.BufferTypeConversionEnable = true; + +% Enable the channels to write data to (options are 1, 2) + +cn0585_device_tx0.EnabledChannels = [1, 2]; +cn0585_device_tx1.EnabledChannels = [1, 2]; + +% Enable the channels to read data from (options are 1, 2, 3 ,4) + +cn0585_device_rx.EnabledChannels = [1, 2, 3, 4]; + +write_reg = soc.libiio.aximm.WriteHost(devName = 'mwipcore0:mmwr-channel0', IPAddress = board_ip); % MathWorks IP Core Write channel +read_reg = soc.libiio.aximm.WriteHost(devName = 'mwipcore0:mmrd-channel1', IPAddress = board_ip); % MathWorks IP Core Read channel + +% Input source available options: 'adc_input', 'dma_input', 'ramp_input' + +cn0585_device_tx0.InputSource = 'dma_input'; +cn0585_device_tx1.InputSource = 'dma_input'; + +% Output range available options: '0/2.5V', '0/5V', '0/10V', '-5/+5V', '-10/+10V' + +cn0585_device_tx0.OutputRange = '-10/+10V'; +cn0585_device_tx1.OutputRange = '-10/+10V'; + +% Generate the sinewave signal + +amplitude = 2 ^ 15; +sampFreq = cn0585_device_tx0.SamplingRate; +toneFreq = 1e3; +N = sampFreq / toneFreq; +x = linspace(-pi, pi, N).'; +sine_wave = amplitude * sin(x); + +% Continuously load data in the buffer and configure the GPIOs state +% (SetupInit Base file) +% DAC1 has to be updated and started first and then DAC0 in order to have syncronized data between devices + +cn0585_device_tx1([sine_wave, sine_wave]); +cn0585_device_tx0([sine_wave, sine_wave]); + +% Stream status available options: "start_stream_synced", "start_stream", "stop_stream" + +cn0585_device_tx1.StreamStatus = 'start_stream'; +cn0585_device_tx0.StreamStatus = 'start_stream'; + +% The data will be stored inside "data" variable + +data = cn0585_device_rx(); + +if cn0585_device_tx0.CheckMathWorksCore() + + write_reg.writeReg(hex2dec('100'), 85); + write_reg.writeReg(hex2dec('104'), 22); + + fprintf('Read value from the 0x108 register is: %d \n', read_reg.readReg(hex2dec('108'))); + fprintf('Read value from the 0x10c register is: %d \n', read_reg.readReg(hex2dec('10c'))); +end + +title('ADAQ23876 Channels'); +subplot(4, 1, 1); +plot(data(:, 1)); +ylabel('Channel A'); +subplot(4, 1, 2); +plot(data(:, 2)); +ylabel('Channel B'); +subplot(4, 1, 3); +plot(data(:, 3)); +ylabel('Channel C'); +subplot(4, 1, 4); +plot(data(:, 4)); +ylabel('Channel D'); +xlabel('Number of samples'); + +% Release the device + +cn0585_device_tx1.StreamStatus = 'stop_stream'; +cn0585_device_tx0.StreamStatus = 'stop_stream'; + +cn0585_device_tx1.release(); +cn0585_device_tx0.release(); + +cn0585_device_rx.release(); diff --git a/pcx_examples/streaming/cn0585/cn0585_axi4_lite_rw_demo/cn0585_host_axi4_lite_read_write_example.slx b/pcx_examples/streaming/cn0585/cn0585_axi4_lite_rw_demo/cn0585_host_axi4_lite_read_write_example.slx new file mode 100755 index 0000000000000000000000000000000000000000..1b130f7c4aba982532de2a4786a68c97056ec17b GIT binary patch literal 27263 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 +#include +#include + +/ { + clocks { + ext_clk: clock@0 { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <120000000>; + }; + }; + + one-bit-adc-dac@0 { + compatible = "adi,one-bit-adc-dac"; + #address-cells = <1>; + #size-cells = <0>; + + in-gpios = <&gpio_mux 4 GPIO_ACTIVE_HIGH>, + <&gpio_mux 5 GPIO_ACTIVE_HIGH>; + out-gpios = <&gpio_mux 3 GPIO_ACTIVE_HIGH>, + <&gpio_mux 2 GPIO_ACTIVE_HIGH>, + <&gpio_mux 1 GPIO_ACTIVE_HIGH>, + <&gpio_mux 0 GPIO_ACTIVE_HIGH>, + <&gpio_mux 6 GPIO_ACTIVE_HIGH>, + <&gpio_mux 7 GPIO_ACTIVE_HIGH>, + <&gpio_mux 11 GPIO_ACTIVE_HIGH>, + <&gpio_mux 12 GPIO_ACTIVE_HIGH>, + <&gpio_mux 13 GPIO_ACTIVE_HIGH>, + <&gpio_mux 14 GPIO_ACTIVE_HIGH>; + + channel@0 { + reg = <0>; + label = "GPIO4_VIO"; + }; + channel@1 { + reg = <1>; + label = "GPIO5_VIO"; + }; + channel@2 { + reg = <2>; + label = "GPIO0_VIO"; + }; + channel@3 { + reg = <3>; + label = "GPIO1_VIO"; + }; + channel@4 { + reg = <4>; + label = "GPIO2_VIO"; + }; + channel@5 { + reg = <5>; + label = "GPIO3_VIO"; + }; + channel@6 { + reg = <6>; + label = "GPIO6_VIO"; + }; + channel@7 { + reg = <7>; + label = "GPIO7_VIO"; + }; + channel@8 { + reg = <8>; + label = "PAD_ADC0"; + }; + channel@9 { + reg = <9>; + label = "PAD_ADC1"; + }; + channel@10 { + reg = <10>; + label = "PAD_ADC2"; + }; + channel@11 { + reg = <11>; + label = "PAD_ADC3"; + }; + }; +}; + +&fpga_axi { + axi_pwm_gen: pwm@44B10000 { + compatible = "adi,axi-pwmgen"; + reg = <0x44B10000 0x1000>; + label = "ltc2387_if"; + #pwm-cells = <2>; + clocks = <&ext_clk>; + }; + + ref_clk: clk@44B00000 { + compatible = "adi,axi-clkgen-2.00.a"; + reg = <0x44B00000 0x10000>; + #clock-cells = <0>; + clocks = <&clkc 15>, <&clkc 15>; + clock-names = "s_axi_aclk", "clkin1"; + clock-output-names = "ref_clk"; + }; + + rx_dma: dmac@44A40000 { + compatible = "adi,axi-dmac-1.00.a"; + reg = <0x44A40000 0x1000>; + #dma-cells = <1>; + interrupts = <0 57 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clkc 15>; + + adi,channels { + #size-cells = <0>; + #address-cells = <1>; + + dma-channel@0 { + reg = <0>; + adi,source-bus-width = <64>; + adi,source-bus-type = <2>; + adi,destination-bus-width = <64>; + adi,destination-bus-type = <0>; + }; + }; + }; + + ltc2387@0{ + compatible = "ltc2387-16-x4"; + pwms = <&axi_pwm_gen 0 0 + &axi_pwm_gen 1 0>; + pwm-names = "cnv", "clk_en"; + clocks = <&ref_clk>; + dmas = <&rx_dma 0>; + dma-names = "rx"; + adi,use-two-lanes; + }; + + qspi0: spi@0x44B20000 { + #address-cells = <1>; + #size-cells = <0>; + reg = <0x44B20000 0x1000>; + num-cs = <0x2>; + compatible = "xlnx,xps-spi-2.00.a"; + bits-per-word = <16>; + fifo-size = <16>; + clock-names = "ext_spi_clk", "s_axi_aclk"; + clocks = <&clkc 15>, <&clkc 15>; + interrupt-names = "ip2intc_irpt"; + interrupt-parent = <&intc>; + interrupts = <0 52 IRQ_TYPE_LEVEL_HIGH>; + + gpio_mux: max7301@0 { + compatible = "max7301"; + reg = <0>; + spi-max-frequency = <20000000>; + #gpio-cells = <2>; + gpio-controller; + }; + }; + + dac0_tx_dma: tx-dmac@0x44D30000 { + compatible = "adi,axi-dmac-1.00.a"; + reg = <0x44D30000 0x10000>; + #dma-cells = <1>; + interrupt-parent = <&intc>; + interrupts = <0 34 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clkc 15>; + + adi,channels { + #size-cells = <0>; + #address-cells = <1>; + + dma-channel@0 { + reg = <0>; + adi,source-bus-width = <32>; + adi,source-bus-type = <0>; + adi,destination-bus-width = <32>; + adi,destination-bus-type = <1>; + }; + }; + }; + + dac1_tx_dma: tx-dmac@0x44E30000 { + compatible = "adi,axi-dmac-1.00.a"; + reg = <0x44E30000 0x10000>; + #dma-cells = <1>; + interrupt-parent = <&intc>; + interrupts = <0 33 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clkc 15>; + + adi,channels { + #size-cells = <0>; + #address-cells = <1>; + + dma-channel@0 { + reg = <0>; + adi,source-bus-width = <32>; + adi,source-bus-type = <0>; + adi,destination-bus-width = <32>; + adi,destination-bus-type = <1>; + }; + }; + }; + + axi_ad3552r_0: axi-ad3552r-0@44d04000 { + compatible = "adi,axi-ad3552r"; + reg = <0x44d04000 0x1000>; + + reset-gpios = <&gpio0 90 GPIO_ACTIVE_LOW>; + + clocks = <&ref_clk>; + + dmas = <&dac0_tx_dma 0>; + dma-names = "tx"; + }; + + axi_ad3552r_1: axi-ad3552r-1@44e04000 { + compatible = "adi,axi-ad3552r"; + reg = <0x44e04000 0x1000>; + + clocks = <&ref_clk>; + + dmas = <&dac1_tx_dma 0>; + dma-names = "tx"; + }; + + mwipcore@43c00000 { + compatible = "mathworks,mwipcore-v3.00"; + reg = <0x43C00000 0xfffff>; + #address-cells = <1>; + #size-cells = <0>; + mmwr-channel@0{ + reg = <0x0>; + compatible = "mathworks,mm-write-channel-v1.00"; + }; + mmrd-channel@1{ + reg = <0x1>; + compatible = "mathworks,mm-read-channel-v1.00"; + }; + + + }; + + i2c@41620000 { + compatible = "xlnx,axi-iic-1.01.b", "xlnx,xps-iic-2.00.a"; + reg = <0x41620000 0x10000>; + interrupt-parent = <&intc>; + interrupts = <0 55 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clkc 15>; + clock-names = "pclk"; + + #size-cells = <0>; + #address-cells = <1>; + + eeprom@50 { + compatible = "at24,24c02"; + reg = <0x50>; + }; + eeprom2@54 { + compatible = "at24,24c02"; + reg = <0x54>; + }; + ad7291_1@20 { + label = "ADC_I2C_1"; + compatible = "adi,ad7291"; + reg = <0x20>; + }; + + }; +}; diff --git a/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/add_io.m b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/add_io.m new file mode 100644 index 0000000..6cd8cdc --- /dev/null +++ b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/add_io.m @@ -0,0 +1,17 @@ +% function add_io(hRD,project,fpga,type) +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % Add AXI4 and AXI4-Lite slave interfaces +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% out = AnalogDevices.get_memory_axi_interface_info(fpga,lower(project)); +% hRD.addAXI4SlaveInterface( ... +% 'InterfaceConnection', out.InterfaceConnection, ... +% 'BaseAddress', out.BaseAddress, ... +% 'MasterAddressSpace', out.MasterAddressSpace); +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % Add Reference design interfaces +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% AnalogDevices.add_io_ports(hRD,lower(project),lower(type),lower(fpga)); +% +% end diff --git a/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/hdlcoder_ref_design_customization.m b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/hdlcoder_ref_design_customization.m new file mode 100644 index 0000000..31e4cea --- /dev/null +++ b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/hdlcoder_ref_design_customization.m @@ -0,0 +1,20 @@ +function [rd,boardName] = hdlcoder_ref_design_customization +% Reference design plugin registration file +% 1. The registration file with this name inside of a board plugin folder +% will be picked up +% 2. Any registration file with this name on MATLAB path will also be picked up +% 3. The registration file returns a cell array pointing to the location of +% the reference design plugins +% 4. The registration file also returns its associated board name +% 5. Reference design plugin must be a package folder accessible from +% MATLAB path, and contains a reference design definition file + +% Copyright 2013-2014 The MathWorks, Inc. + +rd = {... + 'AnalogDevicesDemo.cn0585_led_sw_gpio_control_demo.zed.tx.plugin_rd', ... + }; + +boardName = 'AnalogDevices CN0585 GPIO Control'; + +end diff --git a/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/plugin_board.m b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/plugin_board.m new file mode 100644 index 0000000..27d0b67 --- /dev/null +++ b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/plugin_board.m @@ -0,0 +1,29 @@ +function hB = plugin_board(BoardName) +% Use Plugin API to create board plugin object + +% Copyright 2015 The MathWorks, Inc. + +hB = hdlcoder.Board; + +% Target Board Information +hB.BoardName = sprintf('AnalogDevices CN0585 GPIO Control'); + +% FPGA Device +hB.FPGAVendor = 'Xilinx'; +hB.FPGAFamily = 'Zynq'; + +% Determine the device based on the board + +hB.FPGADevice = sprintf('xc7%s', 'z020'); +hB.FPGAPackage = 'clg484'; +hB.FPGASpeed = '-1'; +hB.FPGAFamily = 'Zynq'; + +% Tool Info +hB.SupportedTool = {'Xilinx Vivado'}; + +% FPGA JTAG chain position +hB.JTAGChainPosition = 2; + +%% Add interfaces +% Standard "External Port" interface diff --git a/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/plugin_rd.m b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/plugin_rd.m new file mode 100644 index 0000000..d277e32 --- /dev/null +++ b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+common/plugin_rd.m @@ -0,0 +1,110 @@ +function hRD = plugin_rd(board, design) +% Reference design definition + +% Copyright 2014-2015 The MathWorks, Inc. + +% pname = upper(project); +% ppath = project; +% if strcmpi(project, 'cn0585') +% ppath = 'cn0585'; +% end + +board = 'zed'; +design = 'Tx'; + +hRD = hdlcoder.ReferenceDesign('SynthesisTool', 'Xilinx Vivado'); + +% This is the base reference design that other RDs can build upon +hRD.ReferenceDesignName = sprintf('%s (%s)', upper(board), design); + +% Determine the board name based on the design +hRD.BoardName = sprintf('AnalogDevices CN0585 GPIO Control'); + +% Tool information +hRD.SupportedToolVersion = {'2023.2'}; + +% Get the root directories +rootDirExample = fileparts(strtok(mfilename('fullpath'), '+')); +tmp = strsplit(rootDirExample,filesep); + +if isunix + rootDir = fullfile(filesep,tmp{1:end-3}); +else + rootDir = fullfile(tmp{1:end-3}); +end +rootDirBSP = fullfile('hdl','vendor','AnalogDevices','vivado'); + +% Design files are shared +hRD.SharedRD = true; +hRD.SharedRDFolder = rootDir; + +%% Set top level project pieces +hRD.addParameter( ... + 'ParameterID', 'project', ... + 'DisplayName', 'HDL Project Subfolder', ... + 'DefaultValue', 'cn0585'); + +hRD.addParameter( ... + 'ParameterID', 'carrier', ... + 'DisplayName', 'HDL Project Carrier', ... + 'DefaultValue', 'zed'); + +%% Add custom design files +hRD.addCustomVivadoDesign( ... + 'CustomBlockDesignTcl', fullfile('pcx_examples', 'targeting', 'cn0585', 'cn0585_hdl', 'system_project_rxtx.tcl')); + +%% Standard reference design pieces +hRD.BlockDesignName = 'system'; + +% custom source files +hRD.CustomFiles = {... + fullfile('projects')..., + fullfile('library')..., + fullfile('scripts')..., + }; + +% custom source files +hRD.CustomFiles = {... + fullfile(rootDirBSP, 'scripts')..., + fullfile(rootDirBSP, 'library')..., + fullfile(rootDirBSP, 'library','xilinx')..., + fullfile(rootDirBSP, 'projects','common')..., + fullfile(rootDirBSP, 'projects','scripts')..., + fullfile(rootDirBSP, 'projects','cn0585')..., + fullfile(rootDirBSP, 'projects','cn0585', 'common')..., + fullfile(rootDirBSP, 'projects','cn0585', 'zed')..., + fullfile('pcx_examples', 'targeting', 'cn0585', 'cn0585_hdl')..., + }; + +hRD.addParameter( ... + 'ParameterID', 'ref_design', ... + 'DisplayName', 'Reference Type', ... + 'DefaultValue', lower(strrep(design, ' & ',''))); + +hRD.addParameter( ... + 'ParameterID', 'fpga_board', ... + 'DisplayName', 'FPGA Boad', ... + 'DefaultValue', upper(board)); + +hRD.addParameter( ... + 'ParameterID', 'preprocess', ... + 'DisplayName', 'Preprocess', ... + 'DefaultValue', 'on'); +hRD.addParameter( ... + 'ParameterID', 'preprocess_script', ... + 'DisplayName', 'Preprocess Script', ... + 'DefaultValue', fullfile('pcx_examples', 'targeting', 'cn0585','cn0585_hdl','fh_preprocess.tcl')); + +hRD.addParameter( ... + 'ParameterID', 'postprocess', ... + 'DisplayName', 'Postprocess', ... + 'DefaultValue', 'off'); + +%% Add IO +%AnalogDevices.add_io(hRD,'cn0585_led_sw_gpio_control_demo',board,design); + +%% Add interfaces +% add clock interface +hRD.addClockInterface( ... + 'ClockConnection', 'axi_clkgen/clk_0', ... + 'ResetConnection', 'sampling_clk_rstgen/peripheral_aresetn'); diff --git a/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/add_tx_io.m b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/add_tx_io.m new file mode 100644 index 0000000..a5c9ae0 --- /dev/null +++ b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/add_tx_io.m @@ -0,0 +1,107 @@ +function add_tx_io(hRD) + +% add AXI4 and AXI4-Lite slave interfaces +hRD.addAXI4SlaveInterface( ... + 'InterfaceConnection', 'axi_cpu_interconnect/M20_AXI', ... + 'BaseAddress', '0x43C00000', ... + 'MasterAddressSpace', 'sys_ps7/Data'); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Tx Reference design interfaces +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'IP Data 0 IN', ... + 'InterfaceType', 'IN', ... + 'PortName', 'axi_ltc2387_0_adc_data', ... + 'PortWidth', 16, ... + 'InterfaceConnection', 'axi_ltc2387_0/adc_data', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'IP Data 1 IN', ... + 'InterfaceType', 'IN', ... + 'PortName', 'axi_ltc2387_1_adc_data', ... + 'PortWidth', 16, ... + 'InterfaceConnection', 'axi_ltc2387_1/adc_data', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'IP Data 2 IN', ... + 'InterfaceType', 'IN', ... + 'PortName', 'axi_ltc2387_2_adc_data', ... + 'PortWidth', 16, ... + 'InterfaceConnection', 'axi_ltc2387_2/adc_data', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'IP Data 3 IN', ... + 'InterfaceType', 'IN', ... + 'PortName', 'axi_ltc2387_3_adc_data', ... + 'PortWidth', 16, ... + 'InterfaceConnection', 'axi_ltc2387_3/adc_data', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'IP Load Tx Data OUT', ... + 'InterfaceType', 'OUT', ... + 'PortName', 'axi_ad3552r_0_valid_in_a', ... + 'PortWidth', 1, ... + 'InterfaceConnection', 'axi_ad3552r_0/valid_in_a', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'IP Valid Tx Data IN', ... + 'InterfaceType', 'IN', ... + 'PortName', 'axi_ltc2387_0_adc_valid', ... + 'PortWidth', 1, ... + 'InterfaceConnection', 'axi_ltc2387_0/adc_valid', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'CN0585 DAC Data 0 OUT', ... + 'InterfaceType', 'OUT', ... + 'PortName', 'axi_ad3552r_0_data_in_a', ... + 'PortWidth', 16, ... + 'InterfaceConnection', 'axi_ad3552r_0/data_in_a', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'CN0585 DAC Data 1 OUT', ... + 'InterfaceType', 'OUT', ... + 'PortName', 'axi_ad3552r_0_data_in_b', ... + 'PortWidth', 16, ... + 'InterfaceConnection', 'axi_ad3552r_0/data_in_b', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'CN0585 DAC Data 2 OUT', ... + 'InterfaceType', 'OUT', ... + 'PortName', 'axi_ad3552r_1_data_in_a', ... + 'PortWidth', 16, ... + 'InterfaceConnection', 'axi_ad3552r_1/data_in_a', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'CN0585 DAC Data 3 OUT', ... + 'InterfaceType', 'OUT', ... + 'PortName', 'axi_ad3552r_1_data_in_b', ... + 'PortWidth', 16, ... + 'InterfaceConnection', 'axi_ad3552r_1/data_in_b', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'GPIO IN SW', ... + 'InterfaceType', 'IN', ... + 'PortName', 'xlslice_1_Dout', ... + 'PortWidth', 8, ... + 'InterfaceConnection', 'xlslice_1/Dout', ... + 'IsRequired', false); + +hRD.addInternalIOInterface( ... + 'InterfaceID', 'GPIO OUT LED', ... + 'InterfaceType', 'OUT', ... + 'PortName', 'xlconcat_1_In1', ... + 'PortWidth', 8, ... + 'InterfaceConnection', 'xlconcat_1/In1', ... + 'IsRequired', false); diff --git a/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/hdlcoder_ref_design_customization.m b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/hdlcoder_ref_design_customization.m new file mode 100644 index 0000000..350b2b3 --- /dev/null +++ b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/hdlcoder_ref_design_customization.m @@ -0,0 +1,20 @@ +function [rd, boardName] = hdlcoder_ref_design_customization +% Reference design plugin registration file +% 1. The registration file with this name inside of a board plugin folder +% will be picked up +% 2. Any registration file with this name on MATLAB path will also be picked up +% 3. The registration file returns a cell array pointing to the location of +% the reference design plugins +% 4. The registration file also returns its associated board name +% 5. Reference design plugin must be a package folder accessible from +% MATLAB path, and contains a reference design definition file + +% Copyright 2013-2014 The MathWorks, Inc. + +rd = {... + 'AnalogDevicesDemo.cn0585_led_sw_gpio_control_demo.zed.tx.plugin_rd', ... + }; + +boardName = 'AnalogDevicesDemo cn0585_led_sw_gpio_control AnalogDevies CN0585 GPIO Control (Tx)'; + +end diff --git a/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/plugin_board.m b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/plugin_board.m new file mode 100644 index 0000000..8e69678 --- /dev/null +++ b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/plugin_board.m @@ -0,0 +1,9 @@ +function hP = plugin_board() +% Zynq Platform PCore +% Use Plugin API to create board plugin object + +% Copyright 2015 The MathWorks, Inc. + +% Call the common board definition function +% hP = AnalogDevicesDemo.cn0585_led_sw_gpio_control_demo.common.plugin_board('AnalogDevies CN0585 GPIO Control ', 'Tx'); +hP = AnalogDevicesDemo.cn0585_led_sw_gpio_control_demo.common.plugin_board('AnalogDevies CN0585 GPIO Control'); \ No newline at end of file diff --git a/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/plugin_rd.m b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/plugin_rd.m new file mode 100644 index 0000000..f381dcf --- /dev/null +++ b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/+zed/+tx/plugin_rd.m @@ -0,0 +1,8 @@ +function hRD = plugin_rd +% Reference design definition + +% Copyright 2014-2015 The MathWorks, Inc. + +% Call the common reference design definition function +hRD = AnalogDevicesDemo.cn0585_led_sw_gpio_control_demo.common.plugin_rd('AnalogDevies CN0585 GPIO Control', 'Tx'); +AnalogDevicesDemo.cn0585_led_sw_gpio_control_demo.zed.tx.add_tx_io(hRD); diff --git a/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/hdlworkflow_cn0585_gpio_zed_tx.m b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/hdlworkflow_cn0585_gpio_zed_tx.m new file mode 100644 index 0000000..bd9e518 --- /dev/null +++ b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/hdlworkflow_cn0585_gpio_zed_tx.m @@ -0,0 +1,38 @@ +function out = hdlworkflow_cn0585_gpio_zed_tx(vivado) + +if nargin < 1 + vivado = '2022.2'; +end + +%-------------------------------------------------------------------------- +% HDL Workflow Script +% Generated with MATLAB 9.8 (R2020a) at 12:56:00 on 24/09/2020 +% This script was generated using the following parameter values: +% Filename : '/tmp/hsx-add-boot-bin-test/test/hdlworkflow_daq2_zcu102_rx.m' +% Overwrite : true +% Comments : true +% Headers : true +% DUT : 'testModel_Rx64Tx64/HDL_DUT' +% To view changes after modifying the workflow, run the following command: +% >> hWC.export('DUT','testModel_Rx64Tx64/HDL_DUT'); +%-------------------------------------------------------------------------- + +%% Load the Model +load_system('testModel_Tx16and8'); + +%% Restore the Model to default HDL parameters +hdlrestoreparams('testModel_Tx16and8/HDL_DUT'); + +%% Model HDL Parameters +%% Set Model 'testModel_Rx64Tx64' HDL parameters +hdlset_param('testModel_Tx16and8', 'HDLSubsystem', 'testModel_Tx16and8/HDL_DUT'); +hdlset_param('testModel_Tx16and8', 'ReferenceDesign', 'AnalogDevies CN0585 GPIO Control (TX)'); +hdlset_param('testModel_Tx16and8', 'SynthesisTool', 'Xilinx Vivado'); +hdlset_param('testModel_Tx16and8', 'SynthesisToolChipFamily', 'Zynq'); +hdlset_param('testModel_Tx16and8', 'SynthesisToolDeviceName', 'xc7z020-clg484-1'); +hdlset_param('testModel_Tx16and8', 'SynthesisToolPackageName', ''); +hdlset_param('testModel_Tx16and8', 'SynthesisToolSpeedValue', ''); +hdlset_param('testModel_Tx16and8', 'TargetDirectory', 'hdl_prj/hdlsrc'); +hdlset_param('testModel_Tx16and8', 'TargetLanguage', 'Verilog'); +hdlset_param('testModel_Tx16and8', 'TargetPlatform', 'AnalogDevices CN0585 GPIO Control'); +hdlset_param('testModel_Tx16and8', 'Workflow', 'IP Core Generation'); diff --git a/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/testModel_Tx16and8.slx b/pcx_examples/targeting/cn0585/+AnalogDevicesDemo/+cn0585_led_sw_gpio_control_demo/testModel_Tx16and8.slx new file mode 100644 index 0000000000000000000000000000000000000000..55d8cf32b77baf85b87b10565df283c148ff25e9 GIT binary patch literal 45619 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 RA_;5&9@OioQ})-|{{zK|@Z ../../../../hdl/vendor/AnalogDevices/vivado/library/axi_ad9361/axi_ad9361_delay.tcl diff --git a/pcx_examples/targeting/cn0585/cn0585_hdl/fh_preprocess.tcl b/pcx_examples/targeting/cn0585/cn0585_hdl/fh_preprocess.tcl new file mode 100644 index 0000000..38d8bcb --- /dev/null +++ b/pcx_examples/targeting/cn0585/cn0585_hdl/fh_preprocess.tcl @@ -0,0 +1,6 @@ +set ad_hdl_dir [pwd] + +#### Move files +file rename -force $ad_hdl_dir/hdl/vendor/AnalogDevices/vivado/scripts $ad_hdl_dir/scripts +file rename -force $ad_hdl_dir/hdl/vendor/AnalogDevices/vivado/projects $ad_hdl_dir/projects +file rename -force $ad_hdl_dir/hdl/vendor/AnalogDevices/vivado/library $ad_hdl_dir/library diff --git a/pcx_examples/targeting/cn0585/cn0585_hdl/matlab_processors.tcl b/pcx_examples/targeting/cn0585/cn0585_hdl/matlab_processors.tcl new file mode 100755 index 0000000..ece7ad2 --- /dev/null +++ b/pcx_examples/targeting/cn0585/cn0585_hdl/matlab_processors.tcl @@ -0,0 +1,138 @@ +proc preprocess_bd {project carrier rxtx} { + + puts "Preprocessing $project $carrier $rxtx" + + switch $project { + cn0585 { + # Disconnect the ADC PACK pins + delete_bd_objs [get_bd_nets axi_ltc2387_0_adc_data] + delete_bd_objs [get_bd_nets axi_ltc2387_1_adc_data] + delete_bd_objs [get_bd_nets axi_ltc2387_2_adc_data] + delete_bd_objs [get_bd_nets axi_ltc2387_3_adc_data] + + set sys_cstring "matlab $rxtx" + sysid_gen_sys_init_file $sys_cstring + + # Disconnect adc_valid + delete_bd_objs [get_bd_nets axi_ltc2387_0_adc_valid] + # Reconnect the adc_valid in the system + connect_bd_net [get_bd_pins axi_ltc2387_0/adc_valid] [get_bd_pins axi_ltc2387_dma/fifo_wr_en] + + if {$rxtx == "rx"} { + connect_bd_net [get_bd_pins axi_ltc2387_0/adc_data] [get_bd_pins axi_ad3552r_0/data_in_a] + connect_bd_net [get_bd_pins axi_ltc2387_1/adc_data] [get_bd_pins axi_ad3552r_0/data_in_b] + connect_bd_net [get_bd_pins axi_ltc2387_2/adc_data] [get_bd_pins axi_ad3552r_1/data_in_a] + connect_bd_net [get_bd_pins axi_ltc2387_3/adc_data] [get_bd_pins axi_ad3552r_1/data_in_b] + } + + if {$rxtx == "tx"} { + connect_bd_net [get_bd_pins axi_ltc2387_0/adc_data] [get_bd_pins util_ltc2387_adc_pack/fifo_wr_data_0] + connect_bd_net [get_bd_pins axi_ltc2387_1/adc_data] [get_bd_pins util_ltc2387_adc_pack/fifo_wr_data_1] + connect_bd_net [get_bd_pins axi_ltc2387_2/adc_data] [get_bd_pins util_ltc2387_adc_pack/fifo_wr_data_2] + connect_bd_net [get_bd_pins axi_ltc2387_3/adc_data] [get_bd_pins util_ltc2387_adc_pack/fifo_wr_data_3] + connect_bd_net [get_bd_pins axi_ltc2387_0/adc_valid] [get_bd_pins util_ltc2387_adc_pack/fifo_wr_en] + } + + if {$rxtx == "tx" || $rxtx == "rxtx"} { + + delete_bd_objs [get_bd_nets axi_ltc2387_0_adc_valid] + delete_bd_objs [get_bd_nets axi_ltc2387_1_adc_valid] + delete_bd_objs [get_bd_nets axi_ltc2387_2_adc_valid] + delete_bd_objs [get_bd_nets axi_ltc2387_3_adc_valid] + + # Connect dac valids together + connect_bd_net [get_bd_pins axi_ad3552r_0/valid_in_a] [get_bd_pins axi_ad3552r_0/valid_in_b] + connect_bd_net [get_bd_pins axi_ad3552r_0/valid_in_a] [get_bd_pins axi_ad3552r_1/valid_in_a] + connect_bd_net [get_bd_pins axi_ad3552r_0/valid_in_a] [get_bd_pins axi_ad3552r_1/valid_in_b] + + # Remove the gpio bd connections + delete_bd_objs [get_bd_nets gpio_i_1] + delete_bd_objs [get_bd_nets sys_ps7_GPIO_O] + # Split the input gpios into 3 to separate the switches + create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 xlslice_0 + set_property -dict [list \ + CONFIG.DIN_FROM {63} \ + CONFIG.DIN_TO {19} \ + CONFIG.DIN_WIDTH {64} \ + CONFIG.DOUT_WIDTH {45} \ + ] [get_bd_cells xlslice_0] + create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 xlslice_1 + set_property -dict [list \ + CONFIG.DIN_FROM {18} \ + CONFIG.DIN_TO {11} \ + CONFIG.DIN_WIDTH {64} \ + CONFIG.DOUT_WIDTH {8} \ + ] [get_bd_cells xlslice_1] + create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 xlslice_2 + set_property -dict [list \ + CONFIG.DIN_FROM {10} \ + CONFIG.DIN_TO {0} \ + CONFIG.DIN_WIDTH {64} \ + CONFIG.DOUT_WIDTH {11} \ + ] [get_bd_cells xlslice_2] + # Reconnect the input gpios + connect_bd_net [get_bd_ports gpio_i] [get_bd_pins xlslice_0/Din] + connect_bd_net [get_bd_ports gpio_i] [get_bd_pins xlslice_1/Din] + connect_bd_net [get_bd_ports gpio_i] [get_bd_pins xlslice_2/Din] + create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 xlconcat_0 + set_property CONFIG.NUM_PORTS {3} [get_bd_cells xlconcat_0] + set_property -dict [list CONFIG.IN2_WIDTH.VALUE_SRC USER CONFIG.IN1_WIDTH.VALUE_SRC USER CONFIG.IN0_WIDTH.VALUE_SRC USER] [get_bd_cells xlconcat_0] + set_property -dict [list \ + CONFIG.IN0_WIDTH {45} \ + CONFIG.IN1_WIDTH {8} \ + CONFIG.IN2_WIDTH {11} \ + ] [get_bd_cells xlconcat_0] + connect_bd_net [get_bd_pins xlslice_0/Dout] [get_bd_pins xlconcat_0/In0] + connect_bd_net [get_bd_pins xlslice_2/Dout] [get_bd_pins xlconcat_0/In2] + # Reconnect the input gpios to the ps7 + connect_bd_net [get_bd_pins sys_ps7/GPIO_I] [get_bd_pins xlconcat_0/dout] + # Split the output gpios into 3 to separate the leds + create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 xlslice_3 + set_property -dict [list \ + CONFIG.DIN_FROM {63} \ + CONFIG.DIN_TO {27} \ + CONFIG.DIN_WIDTH {64} \ + CONFIG.DOUT_WIDTH {37} \ + ] [get_bd_cells xlslice_3] + create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 xlslice_4 + set_property -dict [list \ + CONFIG.DIN_FROM {26} \ + CONFIG.DIN_TO {19} \ + CONFIG.DIN_WIDTH {64} \ + CONFIG.DOUT_WIDTH {8} \ + ] [get_bd_cells xlslice_4] + create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 xlslice_5 + set_property -dict [list \ + CONFIG.DIN_FROM {18} \ + CONFIG.DIN_TO {0} \ + CONFIG.DIN_WIDTH {64} \ + CONFIG.DOUT_WIDTH {19} \ + ] [get_bd_cells xlslice_5] + # Reconnect the output gpios + connect_bd_net [get_bd_pins sys_ps7/GPIO_O] [get_bd_pins xlslice_3/Din] + connect_bd_net [get_bd_pins sys_ps7/GPIO_O] [get_bd_pins xlslice_4/Din] + connect_bd_net [get_bd_pins sys_ps7/GPIO_O] [get_bd_pins xlslice_5/Din] + create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 xlconcat_1 + set_property CONFIG.NUM_PORTS {3} [get_bd_cells xlconcat_1] + set_property -dict [list CONFIG.IN2_WIDTH.VALUE_SRC USER CONFIG.IN1_WIDTH.VALUE_SRC USER CONFIG.IN0_WIDTH.VALUE_SRC USER] [get_bd_cells xlconcat_1] + set_property -dict [list \ + CONFIG.IN0_WIDTH {37} \ + CONFIG.IN1_WIDTH {8} \ + CONFIG.IN2_WIDTH {19} \ + ] [get_bd_cells xlconcat_1] + connect_bd_net [get_bd_pins xlslice_3/Dout] [get_bd_pins xlconcat_1/In0] + connect_bd_net [get_bd_pins xlslice_5/Dout] [get_bd_pins xlconcat_1/In2] + # Reconnect the output gpios to the output port + connect_bd_net [get_bd_ports gpio_o] [get_bd_pins xlconcat_1/Dout] + + } + switch $carrier { + zed { + set_property -dict [list CONFIG.NUM_MI {21}] [get_bd_cells axi_cpu_interconnect] + connect_bd_net [get_bd_pins axi_cpu_interconnect/M20_ACLK] [get_bd_pins axi_clkgen/clk_0] + connect_bd_net [get_bd_pins axi_cpu_interconnect/M20_ARESETN] [get_bd_pins sampling_clk_rstgen/peripheral_aresetn] + } + } + } + } +} diff --git a/pcx_examples/targeting/cn0585/cn0585_hdl/ports.json b/pcx_examples/targeting/cn0585/cn0585_hdl/ports.json new file mode 100755 index 0000000..f972fc3 --- /dev/null +++ b/pcx_examples/targeting/cn0585/cn0585_hdl/ports.json @@ -0,0 +1,176 @@ +{ + "cn0585": { + "chip": "CN0585", + "complex": "true", + "fpga": [ + "zed" + ], + "supported_rd": [ + "rx", + "tx", + "rx & tx" + ], + "ports": [ + { + "rx": [ + { + "input": "false", + "width": 1, + "name": "util_ltc2387_adc_pack/fifo_wr_en", + "type": "valid", + "m_name": "IP Data Valid OUT" + }, + { + "input": "false", + "width": 16, + "name": "util_ltc2387_adc_pack/fifo_wr_data_0", + "type": "data", + "m_name": "IP Data 0 OUT" + }, + { + "input": "false", + "width": 16, + "name": "util_ltc2387_adc_pack/fifo_wr_data_1", + "type": "data", + "m_name": "IP Data 1 OUT" + }, + { + "input": "false", + "width": 16, + "name": "util_ltc2387_adc_pack/fifo_wr_data_2", + "type": "data", + "m_name": "IP Data 2 OUT" + }, + { + "input": "false", + "width": 16, + "name": "util_ltc2387_adc_pack/fifo_wr_data_3", + "type": "data", + "m_name": "IP Data 3 OUT" + }, + { + "input": "true", + "width": 1, + "name": "axi_ltc2387_0/adc_valid", + "type": "valid", + "m_name": "IP Valid Rx Data IN" + }, + { + "input": "true", + "width": 16, + "name": "axi_ltc2387_0/adc_data", + "type": "data", + "m_name": "CN0585 ADC Data 0 IN" + }, + { + "input": "true", + "width": 16, + "name": "axi_ltc2387_1/adc_data", + "type": "data", + "m_name": "CN0585 ADC Data 1 IN" + }, + { + "input": "true", + "width": 16, + "name": "axi_ltc2387_2/adc_data", + "type": "data", + "m_name": "CN0585 ADC Data 2 IN" + }, + { + "input": "true", + "width": 16, + "name": "axi_ltc2387_3/adc_data", + "type": "data", + "m_name": "CN0585 ADC Data 3 IN" + } + ], + "tx": [ + { + "input": "true", + "width": 16, + "name": "axi_ltc2387_0/adc_data", + "type": "data", + "m_name": "IP Data 0 IN" + }, + { + "input": "true", + "width": 16, + "name": "axi_ltc2387_1/adc_data", + "type": "data", + "m_name": "IP Data 1 IN" + }, + { + "input": "true", + "width": 16, + "name": "axi_ltc2387_2/adc_data", + "type": "data", + "m_name": "IP Data 2 IN" + }, + { + "input": "true", + "width": 16, + "name": "axi_ltc2387_3/adc_data", + "type": "data", + "m_name": "IP Data 3 IN" + }, + { + "input": "true", + "width": 1, + "name": "axi_ltc2387_0/adc_valid", + "type": "valid", + "m_name": "IP Valid Tx Data IN" + }, + { + "input": "false", + "width": 16, + "name": "axi_ad3552r_0/data_in_a", + "type": "data", + "m_name": "CN0585 DAC Data 0 OUT" + }, + { + "input": "false", + "width": 16, + "name": "axi_ad3552r_0/data_in_b", + "type": "data", + "m_name": "CN0585 DAC Data 1 OUT" + }, + { + "input": "false", + "width": 1, + "name": "axi_ad3552r_0/valid_in_a", + "type": "valid", + "m_name": "IP Load Tx Data OUT" + }, + { + "input": "false", + "width": 16, + "name": "axi_ad3552r_1/data_in_a", + "type": "data", + "m_name": "CN0585 DAC Data 2 OUT" + }, + { + "input": "false", + "width": 16, + "name": "axi_ad3552r_1/data_in_b", + "type": "data", + "m_name": "CN0585 DAC Data 3 OUT" + }, + { + "input": "true", + "width": 8, + "name": "xlslice_1/Dout", + "type": "data", + "m_name": "IP Data 4 IN" + }, + { + "input": "false", + "width": 8, + "name": "xlconcat_1/In1", + "type": "data", + "m_name": "CN0585 DAC Data 4 OUT" + } + ] + } + ] + } +} diff --git a/pcx_examples/targeting/cn0585/cn0585_hdl/system_project_rxtx.tcl b/pcx_examples/targeting/cn0585/cn0585_hdl/system_project_rxtx.tcl new file mode 100644 index 0000000..d180513 --- /dev/null +++ b/pcx_examples/targeting/cn0585/cn0585_hdl/system_project_rxtx.tcl @@ -0,0 +1,35 @@ +set start_dir [pwd] +puts "Starting Precision Toolbox HDL build" + +if {$preprocess == "on"} { + source $preprocess_script +} + +cd projects/$project/$carrier +source ../../scripts/adi_make.tcl +adi_make::lib all + +set ::env(ADI_SKIP_SYNTHESIS) 1 +set ::env(SKIP_SYNTHESIS) 1 +set ::env(ADI_MATLAB) 1 +set ::env(MATLAB) 1 +set ::env(ADI_USE_OOC_SYNTHESYS) 1 +set ::env(ADI_IGNORE_VERSION_CHECK) 1 + +source ./system_project.tcl + +# Update block design to make room for new IP +source ../../scripts/matlab_processors.tcl +preprocess_bd $project $carrier $ref_design + +if {$postprocess == "on"} { + cd $start_dir + source $postprocess_script +} + +regenerate_bd_layout +save_bd_design +validate_bd_design + +# Back to root +cd $start_dir diff --git a/pcx_examples/targeting/cn0585/cn0585_led_sw_gpio_control_demo/testModel_Tx16and8.slx b/pcx_examples/targeting/cn0585/cn0585_led_sw_gpio_control_demo/testModel_Tx16and8.slx new file mode 100644 index 0000000000000000000000000000000000000000..55d8cf32b77baf85b87b10565df283c148ff25e9 GIT binary patch literal 45619 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 RA_;5&9@OioQ})-|{{zK|@Z