Введение
В прошлой статье я попытался с генерировать тактирующий сигнал в ПЛИС на разных примитивах. Из всех рассмотренных вариантов генерации сигнала, самым адекватным получился клок с генерированный на блоках LUT.
Цель. В этот раз я хочу сгенерировать клок не на одном примитиве, а на цепочке примитивов. Допустим возьмем один инвертирующий LUT и некоторое количество LUT-повторителей для создания задержки сигнала. Так же хочется посмотреть как будет меняться частота сигнала в зависимости от температуры кристалла.
Исходные данные
В свое время приобрел с Китая плату EBAZ4205, с ПЛИС ZYNQ7010.
Как оказалось, некоторая часть компонентов была выпаяна(или не впаяна): диод по питанию, тактирующий кварц для ПЛИСовой части, пины подключения программатора и UART, слот под SD-карту. Изначально я планировал использовать встроенный XADC для определения температуры кристалла, но по закону подлости он так же оказался не подключенным. На рисунке я отметил пины которые требуются для работы встроенного XADC. Пины по питанию J9 и J10 замкнуты сами на себя через конденсатор, а пины VREF вовсе не подключены.
Таким образом температуру померить внутренним XADC не получится. А это значит что набор для эксперимента дополняется мультиметром с термопарой, струбциной и парой проводов).
Эксперимент
Первая часть. С прошлого раза я понял, что замкнуть на себя цепочку лутов просто так не получится, придется писать различные ограничения, поэтому было решено пустить эту цепочку через внешние пины ПЛИС. Для того чтобы оценить влияние внешнего проводника(да и просто ради эксперимента), была набросана такая схема:
Сигнал CLK выдает 100 МГц и тактирует свой счетчик. Пины in_pin, out_pin снаружи замкнуты сами на себя проводником, а внутри соединены через инверсию. Длину этого проводника буду менять. И так, вот результаты этого этапа:
73.118 МГц | 14 см |
55.914 МГц | 49 см |
41.840 МГц (прямой провод) | 92 см |
51.417 МГц (катушка с сердечником) | |
38.710 МГц (катушка без сердечника) | |
37.830 МГц | 170 см |
Первое что меня удивило в данном этапе, что сердечник увеличил частоту схемы, хотя я ожидал что ситуация будет обратной, все таки индуктивность увеличилась. Вот как это выглядело:
Вторая часть. Во второй части я хочу посмотреть как меняется частота в зависимости от количество лутов, т.е. в этом эксперименте инверсию заменим на цепочку лутов в которой один из лутов инвертирующий. Структурная схема немного изменилась но не сильно, я добавил в проект клок визард чтобы управлять опорной частотой, для более точного измерения.
А вот и результаты, при внешнем проводе 14 см( +1 лут - это тот самый инвертирующий лут):
4+1 лут. Базовая частота 100 МГц | 68.230 МГц |
100+1 лут. Базовая частота 100 МГц | 13.881 МГц |
1000 + 1 лут. Базовая частота 100 МГц | 1.466 МГц |
1000 + 1 лут. Базовая частота 10 МГц Подключил провод 170 см. результат не сильно изменился | 1.496 МГц 1.476 МГц(с проводом 170 см) |
5000 + 1 лут. Базовая частота 10 МГц | 0.274 МГц |
11000 + 1лут Базовая частота 5 МГц. | Не получилось собрать. Ругался на длинную цепочку лутов. |
8000 + 1 лут. Базовая частота 5 МГц. | Собралось, но чипскоп ни как не загружал данные из ПЛИС. |
8000 + 1 лут.Базовая частота 10 МГц. | 0.166 МГц |
*Базовая частота эта та частота относительно которой я считал частоту, она же была частотой для ChipScope
Третья часть. И так, из проведенных предыдущих экспериментов, можно определиться с оптимальными параметра для третьего эксперимента, чтобы оценить зависимость частоты от температуры. Я возьму 8000 лутов и внешний провод 14 см. Доработав проект, получаю вот такую схему:
Блок gen_trig генерирует сигнал каждую секунду, так же сигнал trig потребуется в чипскопе для сбора статистики. Блок cnt_lut считает такты с генерированные цепочкой лутов, по сигналу rst(непонятно почему он считает его инверсным) сбрасывается счетчик. А вот как заполнен кристалл данным проектом. Желтым отмечены все 8000 лутов, маджентой отмечены блоки чипскопа. Так же отметил где находятся пины на внешний проводник.
А вот как выглядит собраный макет эксперимента:
На ПЛИС положил термопару, капнул термопасты, накрыл пленкой и прижал струбциной через несколько слоев картона. Картон нужен чтобы струбцина не стала радиатором. Кристалл максимум греется до 47 градусов при 17 минутах работы. Поэтому чипскоп настраиваю на захват 1024 окна по два отсчета, на каждый сигнал триггера, который предусмотрен в проекте. И так, результат эксперимента:
На графике видим изменение частоты каждую секунду. Частота меняется от 165217 Гц до 165589 Гц, при изменении температуры 25-46 градусов. В целом хотелось бы нагреть кристалл до 85 градусов.
Первое, что меня удивило, так это повышение частоты с повышением температуры. Я ожидал, что частота станет меньше, либо в вообще меняться не будет, но я ни как не ожидал, что частота поднимется вместе с температурой.
Заключение
В статье продемонстрировал результат трех экспериментов, по которым можно сделать следующие выводы:
Зависимость частоты от длины проводника не линейная. Возможно потому, что задержка внутри плис и задержка на проводнике приблизительно равны.
Зависимость частоты от количества лутов так же не линейна. Причем слишком уж сильно не линейна.
Тут пара графиков зависимостей частоты от количества лутов(ось Y - значение частоты).
Сырые данные последнего графика если кому надо:
5 | 68,23 |
6 | 52,33 |
21 | 32,285 |
41 | 24,326 |
56 | 19,663 |
71 | 15,657 |
86 | 16,056 |
96 | 13,277 |
101 | 13,881 |
121 | 10,499 |
141 | 10,104 |
161 | 6,443 |
181 | 7,268 |
201 | 6,331 |
301 | 4,484 |
401 | 3,315 |
501 | 2,791 |
601 | 2,49 |
701 | 2,042 |
801 | 1,753 |
901 | 1,629 |
1001 | 1,496 |
1401 | 1,029 |
1801 | 0,797 |
2201 | 0,655 |
2601 | 0,537 |
3. Зависимость частоты от температуры оценить трудно, так как не получается однозначно сопоставить значение частоты и температуре. Для этого нужен XADC.
nerudo
logic clk;
STARTUPE3 STARTUPE3_inst (
.CFGMCLK(clk) );