В данной статье демонстрируется, как использовать двухканальный высокоскоростной модуль АЦП 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), это означает, что входное напряжение вышло за пределы допустимого диапазона.
