В данной статье демонстрируется, как использовать двухканальный высокоскоростной модуль АЦП DUAL_HD_ADC на плате Smart Artix для сбора сигналов и наблюдения формы собранных волн с помощью ILA.
Данный материал применим к основной плате Smart Artix
Демонстрация выполнена в среде Vivado версии 2018.3
В качестве примера в данной статье используется двухканальный модуль АЦП.
Фотография модуля:

Характеристики модуля:
Чип АЦП: 3PA1030
Скорость преобразования: 50 MSPS (50 миллионов выборок в секунду)
Разрядность данных: 10 бит
Интерфейс подключения: SMA × 2
Диапазон измерений: от -5 В до +5 В (погрешность диапазона ±0.2 В)
Схема модуля спроектирована так, что микросхема 3PA1030 работает в режиме CENTER SPAN. Центральное напряжение соответствует 1 В. Соотношение между входным напряжением и выходом АЦП следующее:
VI = +5 В → значение АЦП: 1023
VI = 0 В → значение АЦП: 512
VI = -5 В → значение АЦП: 0
Таким образом, формула пересчёта:
Напряжение V = (10 × ADC / 1023) – 5
1. Создание проекта в Vivado
Запустите Vivado и создайте новый проект. Нажмите «Create Project», как показано на рисунке ниже:

Нажмите «Next». Во втором окне укажите имя проекта в поле «Project name», выберите путь сохранения в «Project location», установите галочку «Create project subdirectory» (по умолчанию), затем нажмите «Next».
Выберите «RTL Project» и нажмите «Next»:

На шаге «Add Sources» оставьте поле пустым, нажмите «Next».
На шаге «Add Constraints» также оставьте поле пустым, нажмите «Next».
Выберите модель чипа. Плата использует чип XC7A50T, корпус FGG484. Выберите модель: XC7A50TFGG484-2

Подтвердите выбранные параметры и нажмите «Finish», чтобы завершить создание проекта.

После этого проект будет создан, и вы попадёте в рабочую среду Vivado:

2. Добавление тестового модуля ILA
Мы планируем добавить ILA для наблюдения результатов сбора данных с АЦП:

Выберите интерфейс Native, количество проб — 4. Глубину можно задать по желанию; в данном случае выбрано значение 8192.

Поскольку АЦП имеет разрядность 10 бит, установите ширину шины на 10. Для второго канала задайте ширину 1 — для наблюдения сигнала OVR (перегрузка). Так ка�� на плате установлены два чипа АЦП, создайте две такие группы проб. Нажмите «OK» для сохранения.

3. Добавление модуля тактового генератора для получения тактовой частоты 50 МГц
Примечание: Тактовый сигнал, поступающий на PL-часть платы Smart Zynq, уже равен 50 МГц, а частота дискретизации используемого модуля АЦП также составляет 50 МГц. Поэтому внутренний PLL-модуль можно не использовать. Однако, чтобы обеспечить совместимость проекта с другими частотами АЦП в будущем, мы добавляем внутренний тактовый модуль для удобства масштабирования.

Установите входную тактовую частоту 50 МГц:

Настройте выходную тактовую частоту на 50 МГц и нажмите «OK» для сохранения конфигурации:

4. Добавление верхнего уровня (top module)
Выберите «Add Sources», в появившемся окне выберите «Add or create design sources»:

Нажмите «Create File», укажите имя файла Verilog-модуля и нажмите «Finish»:

Дважды щёлкните по только что созданному файлу
ADC_TEST.vи добавьте следующий код:
`timescale 1ns / 1ps module ADC_TEST( input sys_clk , ///////////AD1///////////// input [9:0] ad1_data, input ad1_ovr, output ad1_clk, output ad1_oe, ///////////AD2///////////// input [9:0] ad2_data, input ad2_ovr, output ad2_clk, output ad2_oe ); wire clk_50m; assign ad1_oe = 1'b0; assign ad1_clk = ~clk_50m; assign ad2_oe = 1'b0; assign ad2_clk = ~clk_50m; clk_wiz_0 u_clk_wiz_0( .clk_out1(clk_50m), .reset(1'b0), .locked(), .clk_in1(sys_clk)); ila_0 u_ila_0 ( .clk(clk_50m), .probe0(ad1_ovr), .probe1(ad1_data), .probe2(ad2_ovr), .probe3(ad2_data) ); endmodule

Как видно из RTL-схемы, система очень проста — входные сигналы напрямую передаются в ILA для наблюдения:

5. Создание файла ограничений по выводам (constraints)
Поскольку используется много выводов, продемонстрируем процесс через создание файла ограничений (можно также использовать графический интерфейс).
Создайте новый файл ограничений:

В появившемся окне нажмите «Create File», укажите имя файла и нажмите «OK» и «Finish»:

Откройте файл ограничений, как показано на рисунке:

Добавьте в файл следующие ограничения (назначение выводов, стандарты, напряжения). Эти данные актуальны только для основных плат Smart ZYNQ SP, SP2 и SL. Для других плат изменяйте назначение выводов в соответствии с подключением:
set_property -dict {PACKAGE_PIN Y18 IOSTANDARD LVCMOS33} [get_ports sys_clk] set_property -dict {PACKAGE_PIN K21 IOSTANDARD LVCMOS33} [get_ports ad1_clk] set_property -dict {PACKAGE_PIN L19 IOSTANDARD LVCMOS33} [get_ports ad1_ovr] set_property -dict {PACKAGE_PIN L20 IOSTANDARD LVCMOS33} [get_ports ad1_oe] set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports {ad1_data[0]}] set_property -dict {PACKAGE_PIN H15 IOSTANDARD LVCMOS33} [get_ports {ad1_data[1]}] set_property -dict {PACKAGE_PIN H20 IOSTANDARD LVCMOS33} [get_ports {ad1_data[2]}] set_property -dict {PACKAGE_PIN G20 IOSTANDARD LVCMOS33} [get_ports {ad1_data[3]}] set_property -dict {PACKAGE_PIN H17 IOSTANDARD LVCMOS33} [get_ports {ad1_data[4]}] set_property -dict {PACKAGE_PIN H18 IOSTANDARD LVCMOS33} [get_ports {ad1_data[5]}] set_property -dict {PACKAGE_PIN J20 IOSTANDARD LVCMOS33} [get_ports {ad1_data[6]}] set_property -dict {PACKAGE_PIN J21 IOSTANDARD LVCMOS33} [get_ports {ad1_data[7]}] set_property -dict {PACKAGE_PIN J22 IOSTANDARD LVCMOS33} [get_ports {ad1_data[8]}] set_property -dict {PACKAGE_PIN H22 IOSTANDARD LVCMOS33} [get_ports {ad1_data[9]}] set_property -dict {PACKAGE_PIN K16 IOSTANDARD LVCMOS33} [get_ports ad2_oe] set_property -dict {PACKAGE_PIN L16 IOSTANDARD LVCMOS33} [get_ports ad2_ovr] set_property -dict {PACKAGE_PIN K17 IOSTANDARD LVCMOS33} [get_ports ad2_clk] set_property -dict {PACKAGE_PIN N22 IOSTANDARD LVCMOS33} [get_ports {ad2_data[0]}] set_property -dict {PACKAGE_PIN M22 IOSTANDARD LVCMOS33} [get_ports {ad2_data[1]}] set_property -dict {PACKAGE_PIN N20 IOSTANDARD LVCMOS33} [get_ports {ad2_data[2]}] set_property -dict {PACKAGE_PIN M20 IOSTANDARD LVCMOS33} [get_ports {ad2_data[3]}] set_property -dict {PACKAGE_PIN J19 IOSTANDARD LVCMOS33} [get_ports {ad2_data[4]}] set_property -dict {PACKAGE_PIN H19 IOSTANDARD LVCMOS33} [get_ports {ad2_data[5]}] set_property -dict {PACKAGE_PIN M18 IOSTANDARD LVCMOS33} [get_ports {ad2_data[6]}] set_property -dict {PACKAGE_PIN L18 IOSTANDARD LVCMOS33} [get_ports {ad2_data[7]}] set_property -dict {PACKAGE_PIN K18 IOSTANDARD LVCMOS33} [get_ports {ad2_data[8]}] set_property -dict {PACKAGE_PIN K19 IOSTANDARD LVCMOS33} [get_ports {ad2_data[9]}] # Определение периода тактового сигнала для 50 МГц create_clock -period 20.000 -name sys_clk -waveform {0.000 10.000} [get_ports sys_clk]
6. Компиляция и синтез проекта
Запустите процесс компиляции:

Выполните синтез и генерацию bit-файла:

7. Загрузка и онлайн-тестирование
Подключение оборудования: подключите модуль АЦП к разъёму J6 на плате Smart Artix. Подключите входы двух каналов АЦП с помощью переходника SMA-BNC к генератору сигналов (если нет генератора, можно использовать регулируемый источник питания). Убедитесь, что диапазон входного сигнала находится в пределах от -5 В до +5 В. Подключите плату к компьютеру (питание и программатор).
Выберите «Program Device» и укажите чип xc7a50t:

Нажмите «Program»:

Система загрузит конфигурацию во FPGA, после чего откроется окно отладки ILA:

Если сигналы не отображаются в ILA, нажмите значок «+» в интерфейсе:

Нажмите стрелку для запуска сбора данных:

Настройте отображение данных для удобства анализа. Например, установите тип данных как беззнаковое целое число, чтобы легче было читать значения АЦП:

Отображаемые значения — это сырые данные с АЦП. Напряжение можно рассчитать по формуле:
V = (10 × ADC / 1023) – 5

Можно также отобразить данные как аналоговый сигнал: Waveform Style → Analog. На изображении ниже видно, что один канал собирает синусоиду, другой — треугольную волну:

8. Проверка результатов наблюдения
Наблюдение 1: Сбор сигнала с генератора волн
Настроим генератор на синусоидальный сигнал:
VPP: 4.5 В, OFFSET: 0 В, частота: 1 МГц.
Учитывая, что выходное сопротивление генератора — 50 Ом, а вход АЦП — высокоомный, фактически измеряемый сигнал теоретически должен быть близок к удвоенному значению:
VPP: 9 В, OFFSET: 0 В (минимум -4.5 В, максимум +4.5 В).
Примечание: Из-за большого входного сопротивления при прямом подключении к источнику с 50-омным выходом измеряемый сигнал может быть почти вдвое больше. Это нормальное явление, которое можно наблюдать даже на обычном осциллографе. Поищите в интернете: «Почему осциллограф показывает сигнал в два раза больше, чем выдаёт генератор?». Современные осциллографы имеют переключатель 50 Ом / 1 МОм, что решает эту проблему.
Мы выбираем VPP = 4.5 В вместо 5 В для демонстрационных целей. При VPP = 5 В некоторые модули могут достигать предела диапазона, и сигнал OVR станет активным (равным 1). В этом случае рекомендуется немного понизить амплитуду (например, до 4.8 или 4.9 В). Также при измерении прямоугольного сигнала даже при установке 5 В могут наблюдаться выбросы на фронтах (видны на осциллографе), что также вызывает срабатывание OVR. Это нормально. Регулируйте уровень сигнала в зависимости от условий эксперимента.



После захвата сигнала с помощью ILA и настройки отображения в аналоговом виде (Waveform Style → Analog) видно, что входной сигнал — синусоида.
Расчёт:
Максимальное значение ≈ 971 → Напряжение = (971 / 1023) × 10 – 5 ≈ 4.491 В
Минимальное значение ≈ 52 → Напряжение = (52 / 1023) × 10 – 5 ≈ –4.491 В


Собранный сигнал соответствует удвоенной амплитуде исходного (задано 4.5 В, измерено около 4.49 × 2), что подтверждает корректность данных. Причина удвоения объяснена выше.
Наблюдение 2: Сбор постоянного напряжения с цифрового стабилизированного источника
Были протестированы напряжения: 4.5 В, 0.01 В и -3.0 В. Все результаты, пересчитанные через ILA, оказались корректными.
Интересующиеся могут проверить 5 В, но на некоторых модулях при 5 В может сработать OVR. В этом случае немного снизьте входное напряжение.
Измерение 4.5 В: значение колеблется около 971. Пересчёт: (971 / 1023) × 10 – 5 ≈ 4.49 В, близко к 4.5 В.

Измерение 0.01 В: значение около 511. Пересчёт: (511 / 1023) × 10 – 5 ≈ -0.0004 В, близко к 0.01 В.

Измерение отрицательного напряжения (-3 В): поскольку мой регулируемый источник выдаёт только положительные напряжения, я поменял местами провода, чтобы получить отрицательное напряжение.
Внимание: если одна пара проводов используется для питания платы, а другая — для подачи сигнала на АЦП, перемена полярности может привести к короткому замыканию и повреждению платы. Перед выполнением такой операции обязательно оцените безопасность подключения.
Значение около 203 →
Пересчёт: (203 / 1023) × 10 – 5 ≈ -3.01 В, близко к -3.00 В.

Вы можете продолжить эксперименты с другими значениями. Если сигнал OVR становится активным (равным 1), это означает, что входное напряжение вышло за пределы допустимого диапазона.