\documentclass{article}

\input{../common-preamble}
\input{../bmstu-preamble}
\input{../fancy-listings-preamble}
\author{Фёдоров Сергей Владимирович}
\title{Проектирование цифровых устройств на программируемых логических интегральных схемах}
\date{2022-09-05}

\begin{document}
\maketitle
\tableofcontents

\section{Введение (2022-09-12)}

\section{Конвейеризация на примере КИХ-фильтра в ц4}
Фактически, КИХ фильтр
\[ y_k = \sum_i h_i x_{k-i}\]
сложить и накопить результаты перемножений в аккумуляторе. Допусти, что x и h находится в памяти ПЛИС.

(1)

у ц4 частота 287(18х18) и 340МГц(9х9). Это означает, что если мы задействуем внутренние регистры, задержка будет около 3,4нс. у памяти тоже есть скорость например 315МГц это скорость между защёлкиванием адреса памяти и получением данных на выходном регистре памяти (около 3,1нс). Задержка аккумулятора - 5нс. Также существует задержка от памяти до умножителя на межсоединениях, например, 1,5-2нс. до аккумулятора тоже есть задержка, например 0,6нс.

(2)
Если не включать промежуточные регистры схема будет работать на 73,5МГц, общая задержка 13,6нс, 2 такта задержки.

Если использовать регистр перед аккумулятором - 5,6нс

С точки зрения баланса лучше использовать регистр перед умножителем, но проще с точки зрения кода поставить регистры на память и получится 3,1, 4,9, 5,6нс, скорость 178,5МГц и 4 такта задержки (глубокий конвейер). Чем глубже конвейер тем сложнее им управлять.

Если хотим 3 такта, задержка будет 8нс, то есть 125МГц. Схема, осуществляющая максимальную задержку называется \textbf{Критическим путём}.

В новых ПЛИС есть регистры межсоединений, что позволяет конвейеризовать даже их. По сути, ц2-4 это очень похожие архитектуры. У современных ПЛИС обычно несколько напряжений питания. В основном, выпускаются в корпусе BGA.

ФАПЧ:
PFD phase frequency detector, обратная связь от M это такая же частота и фаза с минимальным джиттером.
CP charge pump LF loop filter формирует сигнал по уровню которого ГУН стабилизирует схему.
VCO ГУН
У любого ФАПЧ есть время захвата, то есть время стабилизации схемы.

\section{Интеграция компонент в систему на кристалле}
Интерфейсы систем на кристалле и пользовательские модули.

Часто используются спецификации
\begin{itemize}
\item AXI - 4 от ARM
\item Wishbone (часто применяется в свободных системах)
\item Avalon (интел) - эти компоненты возможно соединять с ядром AXI. делится на два разных варианта обмена информацией
  \begin{itemize}
  \item MM - шинная (периферийные модули отображаются в единое пространство (карту памяти) мастера)
  \item ST - поточный (однонаправленный) интерфейс точка-точка.
  \end{itemize}
  Шину возможно расширить собственными инструкциями.
\end{itemize}

\subsection{Системная шина}
Соежинения компонентов - это не просто проводник, а система связывания по разным протоколам. Network-on-chip. Построена на принципах потоковой передачи точка-тока. Предусмотрено много режимов и подрежимов обмена. генерируется автоматически, от параметров будет зависеть, что именно будет скомпилировано. Такой большой объём потому что нужно осуществлять мультиплексирование данных. На транспорт занимается очень много метса из-за мультиплексирование данных. Чем больше устройств висит на шине, тем больше мультиплексирования.

Например, если есть модуль к окторому прикреплены шины данных, команд, ПДП, там точно понадобится арбитр. QSys реализует
\begin{itemize}
\item арбитраж
\item декодирование адреса
\item мультиплексирование данных
\item управление разрядностью
\item генерацию циклов ожидания
\item обработку сигналов прерывания
\end{itemize}

Смысл в том, что данные приходят в шину, преобразуются в потоки и затем снова приходят в шину ММ. Арбитраж осуществляется не на шине, а на каждом отдельном периферийном модуле.

\begin{itemize}
\item Интерфейс - это группа сигналов ММ или СТ, определяющая связи между компонентами
\item Компонент - логическое устройство с одним или более интерфейсом авалон
\item главное устройство (Мастер) - инициирует передачи
\item подчинённое устройство (Слейв) - отвечает на передачи
\item источник/приёмник - интерфейсы которые посылают/получают потоковые данные в системе
\item передача - чтение или запись блока данных
\end{itemize}

Если говорится Мастер выставляет сигнал на шину слейва, то на самом деле мастер отправил запрос в шину, а шина выставляет адрес на слейва.

Если в модуле есть блочная память и регистры - они разносятся по разным интерфейсам. В отдельные интерфейсы обычно формляются клок и ресет.
\subsection{Дополнительные режимы}
\subsection{Специальные инструкции}
Фактически, это Инструкции, которые могут добавляться в АЛУ процессора и расширять логику процессора. Если многотактовые инструкции - процессор приостановит конвейер.

Внутри таких модулей также можно сделать собственный сопроцессор. Все входы такого модуля обязательные (единственное, чего может не быть - это выхода done). Всего под код специальной инструкции выделено 256 значений. Можно все 256 инструкций засунуть в один модуль, это показывает параметр n.

Задействуются они также как другие инструкции на шине Avalon, их возомжно тактировать и сделать многотактовыми. После интеграции соединяем с \code{custom_instruction_master}. system.h сразу содержит макросы для доступа.
\subsection{Межсоединения Platform Designer}
поддержка переходов между доменами тактовых импульсов. ДТИ - это группа триггеров и связанная с ними логика, которая тактируется одним ТИ.

(1)
Иногда это не очень удобно. Есть два варианта в Platform Designer
\begin{itemize}
\item обмен с квитированием (Handshake)
\item обмен через FIFO (позволяет реализовать конвейерные передачи).
\end{itemize}
Если бы мы не использовали мост, была бы настройка по умолчанию. Обмен с квитированием - медленный обмен и для каждой операции записи/чтения требуется несколько тактов с каждой стороны. Хорошо подходит для регистров и требует мало ресурсов. Обмен через FIFO хорошо подходит для конвейерных передач, но требует памяти для реализации. Используется для обмена с памятью, ПДП, где большой поток на высокой частоте.

По-умолчанию, делается квитирование, чтобы не расзодовать ресурсы там, где это явно не требуется.

Обычно неприемлемо ограничивать частоту системы частотой межсоединений, по умолчанию можно на хэндшейк оставить 1 цикл. Если задержка в шине, можно добавить такт, получив б\'{о}льшую частоту, но латентность. и Верно структурировать эти мосты вручную, а не автоматически, добавляя их только там, где их нужно добавить.

Таким образом при помощи Pipeline Bridge возможно лучше структурировать межсоединения в системе. Желательно такое мостовое межсоединение делать по степени двойки.

\subsection{Порты MM-Slave}
Поддерживает дополнительные режимы обмена и сигналы, которые требуются этим режимам. Конвейеризованные и пакетные передачи.

КП поддерживается только для чтения, для записи они не нужны. КП увеличивают пропускную способность для подчинённых портов, которые требуют несколько тактов для формирования результата после первого доступа, но далее могут формировать результаты каждый такт. Если мы например работаем между ПДП и он-чипРАМ то в он-чипе вход с регистром, если хотим повысить скорость выход тоже снабжаем регистром. Если в межсоединении тоже ковейеризация - то ещё один такт. Такое поведение возможно в три раза ускорить - выставляем адрес, на следующем такте, не дожидаясь ответа выставляем следующие адреса, а данные выставляются на каждом такте, но с первоначальной задержкой. Есть фиксированные латентности или вспомогательные сигналы. Вспомогательные сигналы обычно используются с периферией с переменной латентностью, где мы можем ждать неизвестно сколько. При переменной латентности фазы чтения и передачи данных не совпадают.

ПП позволяют передать адрес и количество данных, а на слова запросы разбираются уже автоматизированно, то есть просто подряд читаем с автоинкрементом адресом. 

\section{Верификация проекта}
и настройка временн\'{ы}х требований. Большая часть времени уходит именно на этот этап. Методы верификации:
\begin{itemize}
\item временной анализ;
\item моделирование (отдельных модулей и системы в целом);
\item формальная верификация;
\item анализ энергопотребления;
\item анализ целостности сигналов;
\item внутрисхемное тестирование.
\end{itemize}

Основной метод для ПЛИС - функциональное моделирование и временной анализ. Если временн\'{ы}е требования выполнены и на тестбенче проект проходит верификацию, считается готовым\footnote{Для второй лабы нужно будет изменить тестбенч}.

Должны быть проанализированы все требования и все пути распространения сигналов. каждый временной путь имеет начальную и конечную точку. Мы описываем ТИ в точке входа микросхемы SDRAM. Важно понимать, где начинаются и заканчиваются пути. Есть пути ТИ, пути данных и асинхронные пути (но их чаще всего не рассматривают).

Запускающий и защёлкивающий фронт (Launch, latch edge) это фронты по которым срабатывает регистр-источник и по которому защёлкиваются данные (обычно считается следующий после запускающего).

\begin{tikztimingtable}
  clk  & cCCC \\
  data & U2DU \\
\end{tikztimingtable}

Setup and Hold. - время за сколько до ТИ нужно поменять данные и сколько после фронта ТИ нужно удерживать данные

Время прибытия данных - время поступления данных на синхронный вход регистра-приёмника.

Время прибытия ТИ.

Требуемое время предустановки данных - к какому моменту нужно установить на входе триггера. Аналогично нужно установить по удержанию. Схема удовлетворяет требованиям, когда все запасы по всем путям положительные (Setup slack). Разница между временем установки данных и временем установки для триггера. 

Setup slack = min setup - max hold.

новый ТИ должен прийти не раньше, чем холд тайм данных. Для асинхронных путей вводятся времена восстановления и снятия (Recovery and Removal). Асинхронный сигнал всегда главнее ТИ, триггер сбрасывается безусловно и сброс может быть подан в любой момент времени, а выводить в окрестности ТИ нежелательно. Асинхронный сброс в больших микросхемах нужно синхронизировать (2дтригера)

Анализ ввода-вывода с общим ТИ. То есть таким же образом мы можем анализировать синхронные внешние схемы, например, память.

Временн\'{ы}е модели (в современных ПЛИС 3). влияют техпроцесс, вариации техпроцесса, дефекты, напряжение питания, температура. При низкой температуре задержки могут увеличиваться. Важно при временных требованиях, что компилятор оптимизирует под них проект, а не просто проверяет валидность

\section{Avalon-ST}
Avalon Streaming. Потоковые передачи (в отличие от ММ - общей шины от мастера слейву) однонаправленные, типа точка-точка. Именно он обычно используется для аппаратной обработки, например, видео или Ethernet. Могут использоваться совместно с ММ. Часто в модулях есть оба интерфейса.

Основные сигналы (не все должны использоваться, могут использоваться только некоторые).
\begin{itemize}
\item data - данные;
\item valid - статус действительности данных (данные готовы);
\item ready - приёмник готов.
\item channel - определяет канал, в который передаются данные - возможно мультиплексировать данные так, как это нужно по задаче. Можно написать самостотельно, но есть готовые компоненты, решающие эти задачи. MUX, DEMUX, FIFO, преобразовательи разрядностей.
\item error - битовая маска на 256 бит. Позволяет сопровождать данные каким-то статусом.
\item startofpacket - для маркировки отсчётов в пакете.
\item endofpacket - для обозначения окончания пакета.
\item empty - чаще всего размер символа равен 8 бит, за одну передачу можно передать несколько символов. Если длина пакета не кратна числу символов, тогда число пустых символов передаётся в empty.
\end{itemize}

Возможна передача с поддержкой «backpressure» с задержкой. Фактически возможно осуществить задержку и сдвиг приёма/передачи. При сопряжении модулей с разными задержками готовности автоматически вставляется буфер согласования.

\section{TimeQuest}
des00 Embedders.org

Что можно и что нельзя делать? Design Assistant - средство проверки проекта на потенциально сбойные решения. Проверяет проект на надёжность (соответствие правилам) по нескольким группам. 

\begin{enumerate}
\item Проверка ТИ (Clock). Как надо?
  \begin{itemize}
  \item ТИ должен поступать на выделенный вход ТИ (С104)
  \item ТИ должен идти на триггеры либо напрямую по глобальной шине ТИ (на шину ТИ часто заводят также сигналы асинхронного сброса),
  \item ТИ заводится на ФАПЧ а с выхода ФАПЧ на входы ТИ триггеров. Для больших ПЛИС существуют также региональные шины ТИ. В самых последних ПЛИС деревья синтезируются и набираются в нужном месте ПЛИС, но это всё равно выделенные цепи ТИ. Одновременность срабатывания триггеров минимизирует вероятность нарушения времени удержания.
  \end{itemize}

  Вариант 1
\begin{lstlisting}[language=VHDL,style=VerilogStyle]
  input logic clk;
  always@(posedge clk or ...) begin
  //...
  end 
\end{lstlisting}

  Вариант 2
\begin{lstlisting}[language=VHDL,style=VerilogStyle]
  input logic clk;
  wire pll_out;
  mypll pll_inst (
   .clkin(clk),
   .c0(pll_out)
  );
  always_ff@(posedge pll_out or ...) begin
  //...
  end 
\end{lstlisting}

Ripple clock - задержки ТИ при делении тактовой частоты на триггерах. Очень высока вероятность нарушения по холд, если задержанный ТИ это приёмник. 1й вариант решения проблемы - сформировать эти ТИ на выходе ФАПЧ. 2й вариант - использование сигнала enable. 

Gated Clock - ТИ, который модифицируется на логике. Нельзя формировать ТИ после анализа шин. Сдвиг по фазе и тычки на ТИ будут зависеть от температуры, перекомпиляции, и так далее.
\begin{lstlisting}[language=VHDL,style=VerilogStyle]
  input logic clk;
  logic c0;
  assign c0 = clk && (level < trshld);
  always_ff@(posedge c0 or ...) begin
    //never do it
  end 
\end{lstlisting}

так бывает нужно, когда нужно, чтобы схема работала не на каждом такте. Это возможно сделать при помощи сигнала разрешения. Это часто нужно делать для формирования определённой скважности (переключений в дереве ТИ меньше и входные структуры триггеров переключаются реже, соответственно немного ниже потребление). 1. ФАПЧ. 2. clkctrl (фактически, это небольшой модуль, который контролирует вход на глобальную шину, позволяет делать мультиплексирование и разрешение). Так простой И вырезает нужные фронты (но проблемы сдвига фронта никуда не исчезают) если не использовать clkctrl.

\item Конфигурация сигналов сброса: Комб логика, которая используется как асинхронный сброс, должна быть синхронизирована (иначе комбинационная логика будет формировать глитчи и ресеты могут срабатывать не тогда, когда нужно). Кросс-доменные (тактовых доменов) сбросы необходимо синхронизировать.

  \begin{frm}
    Синхронизация асинхронных сигналов. АС - это сигнал, изменяющийся без привязки к ТИ. То есть АС может нарушать (и часто нарушает) время установки и время удержания относительно ТИ. В этом случае триггер попадает в метастабильное состояние. При попадании в МСС триггер не принимает значение 0 или 1 и переходит в устойчивое состояние с задержкой больше, чем $T_{co}$. Время установки определяется большим числом факторов. Классическая схема подавления метастабильности заключается в двух последовательных триггерах. Три триггера возможно понадобится для высоких частот. Больше обычно применяется для схем подавления дребезга.

    В фифошках счётчики обычно делают не в бинарных, а в коде Грея, где меняется только один разряд.
  \end{frm}

  Времена снятия и установления нормируются только для снятия сброса, потому что триггер может выйти из сброса и среагировать на ТИ, а может нет.

  СХЕМА у ВИКИ

  преимущество в скорости, сброс второго триггера мгновенный. используется для синхронизации только снятия сброса.

  В документации по проектированию возможно найти все эти правила, но там по входам всех триггеров ТИ инвертированы. Идея в том, что не важно, какая схема, так или иначе будет осуществлён сброс, если мы снимаем по переденму фронту, то сброс происходит близко к переднему фронту, а когда синхронизируем по заднему фронту, снятие произойдёт между фронтами всех остальных триггеров. Дело в задержке распространения сигнала. Если мы работаем локально 1-3 нс, если же сигнал сброса будет заведён на общие цепи ТИ, то задержка может доходить до 5нс, поэтому на скоростях выше 100МГц это может сформировать метастабильность.

  Поэтому инверсию ТИ для триггеров синхронизации сброса нужно ставить только если мы сбрасываем локальную группу триггеров или на малой скорости.

\item Timing Closure говорит о том, что если сигнал значительно разветвляется (написано 30, но фактически, 300) то его тоже следует передавать по глобальной шине.

\item Non-synchronous design structure
  \begin{itemize}
  \item в проекте не должно быть комбинационных обратных связей
  \item В проекте не должно быть асинхронных РС-триггеров
  \item не нужно синхронихировать триггеры по уровня
  \item не должно быть цепей задержки
  \end{itemize}
\item signal race например, когда одним сигналом разрешается и формируется выходной сигнал.
\item Asynchronous clock domains. определяет правила передачи данных между разными доменами ТИ. Домен ТИ - это тригеры и связанная с ними комбинационная логика, которая тактируется одним ТИ.
  двойной триггер не спасёт. есть вариант реализовать протокол обмена (фронт детектор)

  СХЕМА 2 у ВИКИ

  нужно формировать однобитный строб. данные не должны меняться на 3 и 4 фронте. строб и данные меняются как показано на диаграмме, и когда мы их защёлкиваем на 3 или 4 такте, они будут точно неизменные.
\begin{lstlisting}[style=VerilogStyle]
  input logic stb;
  input logic [7:0] din;
  input logic c2;
  
  logic[2:0] stb_z;
  logic ena;

  always_ff @(posedge c2) stb_z < {stb_z[1:0], stb};
  assign ena = ~stb_z[2] & stb_z[1];
  always_ff @(posedge c2) if (ena) dreg < din;

\end{lstlisting}
\end{enumerate}
1. расширить разрядность памяти хранения до 32 бит и на запись и на чтение, чтобы на лампочках было видно.
2. добавить регистр (помимо ктл и дивайдер) если там 0 то пусть работает как работало, а если 1, подключается режим моргающего жёлтого с длительностью которая берётся из грин ((грин+1)-0-(грин-1)-0)
\newpage
\appendix
\setcounter{secnumdepth}{2}
\setcounter{tocdepth}{2}
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}
\subsection{Семинар 1 (2022-09-05)}
Классификация ПЛИС.

Архитектура функциональных преобразователей влияет на быстродействие комбинационных схем. МУКС - это логика, которая требует достаточно большой объём и мультиплексирование большого кол-ва сигналов может снижать быстродействие. мукс32ч по 32 разряда это 1024 ЛЭ и 6 слоёв логики

(1)
4вх LUT для вычисления функции от 8 параметров нужны 3-31 таких LE. фактически на 10 входо нужно 5 слоёв логики.

(2)
В пятых циклонах и новее ALM (адаптивные логические модули) архитектура сложнее, чем 1 4вх таблицы перекодировки. и фактически возможно сделать 6тивходовую функцию. делается 4 мультиплексора с двухразрядным выбором, получится всего два слоя логики.

Дополнительные функциональные модули, влияющие на выбор ПЛИС:
\begin{itemize}
\item встроенная блочная память
\item аппаратные умножители (LUT в этом вопросе работают неэффективно)
\item модули ФАПЧ
\item контроллеры памяти (всегда есть выбор реализовать самостоятельно на LUT)
  \begin{itemize}
  \item поддержка стандартов ввода-вывода
  \item аппаратные контроллеры
  \end{itemize}
\item контроллеры интерфейсов
  \begin{itemize}
  \item физический уровень
  \item уровень доступа к среде
  \end{itemize}
\item процессорные ядра (SoC)
\end{itemize}

\begin{figure}[H]
  \centering
  \includegraphics[width=12cm]{03-fpga-00-01-cycloneV.png}
\end{figure}

В циклон5 каждый светло-серый квадратик это 10 ALM, серая это встроенная память, чёрные это DSP-blocks аппаратные умножители с бонусом, по периметру ввод-вывод, есть высокоскоростные. зелёным отмечен PCIe.

\subsubsection{Встроенная блочная память}
\begin{itemize}
\item Статическая ОЗУ (с точки зрения архитектуры, внешняя обычно динамическая)
\item Типичный объём 4-20 кбит/блок. циклон4=9кбит, циуклон5=10кбит, стратикс5=20кбит.
\item Конфигурируемая глубина и разрядность. зачем настройка на 9 разрядов? они называют его битом контроля чётности, хотя аппаратного контроля чётности нет. Также для представления данных большей разрядности и точности (родные умножители 9х9 и 18х18). Сопровождение данных служебной информацией. зачем 10 разрядов? не только детектирование, но и восстановление ошибки. АМД практикует блоки большего объёма (18 и 36 кбит), у этого есть и плюсы и минусы - данные обрабатываются параллельно, чем больше объём модуля тем меньше нужно модулей, но тем больше к ним будет попыток одновременных обращений и тем самым увеличить производительность. часто собираются памяти большего объёма из таких блоков, быстродействия падает линейно от величины блока.

  В последнее время часть делают блоки разных объёмов, то есть помимо аппаратных блоков статического ОЗУ делают ещё и ОЗУ на LUT. некоторые блоки из ALM сконфигурировать как модули памяти если нужны небольшие блоки памяти (MLAB до 640бит у циклона больше 5го) у зайлинкса можно набирать из слайсов по 32 бита исторически.
\item возможность инициализации при включении (при прошивке)
\item регистровые входы (синхронная запись, чтение происходит с задержкой в 1 или более тактов).

  мы работаем по тактам
  (3)
  поэтому важно, что при защёлкивании данных регистром всегда будет задержка на такт.
  
\item в некоторых семействах есть возможность реализовать боки меньшего объёма, используя таблицы перекодировки (ALM)
\item обычно вся память двухпортовая, и появляется возможность полная независимость одновременной записи и чтения 
\end{itemize}

На памяти часто делается не только память, но и буферы ФИФО.

\subsubsection{Аппаратные умножители}
типичные разрядности 9х9, 18х18, 27х27. могут поддерживаться другие разрядности.

поддержка знакового и беззнакового умножения. в допкоде эти процессы отличаются, поэтому в мегафункции возможно указать знаковость.

отличий в блоках умножителей больше, чем даже в блоках памяти в ц4 умножитель примитивен. иногда приходится выбирать камень не по ЛЭ а по наличию умножителей и другой периферии.

в ц5 умножители имеют другое название и значительно отличаются как по количеству, так и по дополнительных возможностях. Например, возможно сохранить до восьми коэффициентов, но при этом важно понимать, что вся функциональность расставляется квартусом, поэтому информация из таблиц работает не всегда. Такая усложнённая архитектура нужна в основном для ЦОС. например, в НЦ отсчёты симметричны, а для ВЦ антисимметричны, поэтому нам нужны как умножитель+сумматор или сумматор+умножитель. за один такт мы можем делать сразу 4 18-разрядных MAC (multiply and accumulate).

в квартусе мы работаем с умножителями не напрямую, а через функции, например, «multiply adder intel fpga».

Дополнительные возможности:
\begin{itemize}
\item предсумматоры
\item аккумуляторы
\item встроенные коэффициенты
\item поддержка операций с плавающей запятой (10-е поколение)
\end{itemize}

у зайлинкса немного отличается. в одном блоке один умножитель и есть предсумматор. есть возможность над результатом умножения делать какую-то операцию (мини АЛУ с умножителем).

\subsubsection{Модули формирования частоты на основе ФАПЧ (PLL)}
\begin{itemize}
\item умножение, деление и сдвиг фазы входной частоты
\item несколько выходов с разными делителями и сдвигом фазы
\item возможность переконфигурации во время работы.
\end{itemize}

Петля Костаса

задействуется также через мастер мегафункций

\subsubsection{Контроллеры памяти}
SDRAM (DDR 2,3,4, LPDDR 2,3, DDR3L),RLDRAM 2,3, QDR 2,2+,4SRAM
иногда приходится делать контроллеры памяти на логике, но тоже писать самостоятельно не надо, есть мегафункции, которые могут синтезироваться как в логику, так и в использование аппаратного контроллера. в супер-новых есть также поддержки памяти с низкой латентностью

\subsubsection{Контроллеры интерфейсов}
\begin{itemize}
\item физический уровень (при проектировании важно определить поддержку стандартов и проверить, что возможно назначение выводов). дифференциальные и недифференциальные стандарты, стандарты для интерфейсов памяти, гигабитные приёмопередатчики. используется большое число интерфейсов с разными напряжениями питания и поэтому нужно убедиться, что в принципе, скомпилируется в выбранном камне.
\item уровень доступа к среде (PCI, PCIe, Ethernet MAC)
\end{itemize}

\subsubsection{Процессорные ядра}
\begin{itemize}
\item аппаратные ядра
  \begin{itemize}
  \item ARM Cortex A
  \item ARM Cortex M
  \end{itemize}
\item программные ядра
  \begin{itemize}
  \item Nios II
  \item Nios V (основан на архитектуре RISC V)
  \end{itemize}
\end{itemize}

Программные ядра весьма оптимизированы, чтобы работать на б\'{о}льших частотах и занимать меньше памяти.

Если есть реализация аппаратного ядра это обычно отдельные линейки продуктов, обозначаются как FPGA/SoC.

\subsubsection{Архитектура межсоединений}
(ц4ХБ 33(31))
в ц4 ЛЭ формируются в блоки по 16. в ц5 АЛМ формируются в блоки по 10

в состав блока помимо лэ входит также локальная матрица соединений (она соединяет сигналы входа и вход ЛЭ и также туда уходит выход из ЛЭ) их не сотни а тысячи или десятки. между собой связаны глобальной матрицей соединений

ГМС состоит из строки столбцов. данные могут поступать в ЛМС как со строк так и со столбцов. выходы ЛЭ возможно скоммутировать сразу на глобальную матрицу.

Фактически, мы не особо влияем на распределение сигналов по межсоединениям.

директлинк позволяет перескочить ГМС если лэ соединяется с каким-то ЛЭ из соседнего блока. ИО связаны с торцами столбцами и строками глобальной матрицы ввода-вывода.

\subsection{Семинар 4 (2022-10-17)}
асинхронный сброс возможно сделать тремя способами.
невозможно сделать два управления одним сигналом на входе тригера
делать общующину сброса - плохая идея
По подтверждению сброса ран можно сделать квитирование
\subsection{Семинар 5 (2022-10-31)}
Элемента ввода-вывода. это функциональные блоки для связи со внешним миром.
Если планируется работа с вводом-выводом, кроме Handbook важно на сайте intel скачать Pin connection guidelines, pin information и использовать их. Информация сохраняется в файл с расширением QSF.
Выводы ПЛИС в ц4 8 банков (банк это набор элементов ввода-вывода со своим напряжением питания):
\begin{itemize}
\item питание, земля
  \begin{itemize}
  \item питание ядра VCCINT. например, C-IV 1,2В;
  \item питание элементов ввода-вывода VCCIO (для поддержки стандартов периферии обычно 1,2-3,3В.);
  \item у самых современных вроде ц5 есть отдельное напряжение предрайвера VCCPD;
  \item вспомогательные напряжения VCC\_AUX (например для ФАПЧ).
  \end{itemize}
\item служебные выводы
  \begin{itemize}
  \item конфигурация
  \item JTAG энергозависимое конфигурирование
  \item конфигураторы конфигураций
  \end{itemize}
\item Пользовательские элементы ввода-вывода
  \begin{itemize}
  \item выводы двойного назначения (могут быть пользовательские, но возможно и использование специальной функции ПЛИС, которую возможно запросить у квартуса).
  \item входы тактовых импульсов
  \item Поддерживается большое число как дифференциальных, так ине дифференциальных стандартов. Недифф работают по порогам напряжения LVTTL, LLCMOS. Также бывают недифференциальные с опорой (например HSTL, SSTL для памяти DDR2, DDR3) 0 и 1 определяется по некоторому среднему значению. Дифференциальные интерфейсы в основном LVDS (low voltage differential signaling) используется две линии. Дифференциальные пары надёжнее поскольку даже если будет наводка, разница напряжений не изменится.
  \item назначение выводов часто нетривиальная задача: в одном банке должно быть одно напряжение. В банке с дифференциальными выводами не рекомендуется размещать не дифференциальные ВЫводы. 
  \item истинный LVDS есть только в двух банках, остальное можно сделать, но будет работать хуже.
  \end{itemize}
\item Интерфейсы внешней памяти (поддерживаются SDR, DDR, DDR2 SDRAM) существуют как аппаратные так и программные поддержки. Для них подключаются некоторые специфические ядра, например, автокалибровки и автоподстройки интерфейсов памяти (ALTMEMPHY) поскольку нужна не только начальная калибровка, но и подгонка в процессе работы в зависимости от температуры устройства.
\end{itemize}

Сам по себе элемент ИО - это элемент с пятью триггерами внутри. Зачем: для экономии внутренних триггеров (защёлкивание входящих сигналов). 2 - управление временн\'{ы}ми характеристиками (с задержками по входам-выходам). У элементов ИО есть дополнительные настроки, например,
\begin{itemize}
\item подтягивающие регистры,
\item Bus Hold
\item Настройка тока выхода. (если есть стандарт, там есть настройка, какой сигнал трактовать как 0 а какой как 1. когда ток растёт, нагрузочная характеристика меняется, и сигнал может просесть ниже уровня определения логики). в КМОП технике полевые транзисторы можно включать параллельно. Чтобы выходную нагрузку регулировать запараллеливают транзисторы на инвертороподобной структуре на выходе, снижая суммарное сопротивление канала.
\item Последовательное терминирование
\item Управление скоростью нарастания
\item Ограничивающий диод PCI
\item Режим открытого коллектора
\item Программируемые выводы земли
\item Поддержка горячего включения
\end{itemize}

Выводы могут быть программируемой мощности. При этом желательно не ставить в цепь снаружи резистор, поскольку автоматически поставленный в ПЛИС диод не будет включен в схему до включения ПЛИС и есть вероятность сжечь элемент ввода-вывода. Для обеспечения совместимости 5В нужно использовать внешние буферы.

\subsection{Семинар 6 (2022-11-14)}
\textbf{Настройка временн\'{ы}х требований}
При любой работе с периферией квартус не можетзнать, сколько будет времени задержка у внешних устройств. Поэтому мы должны изучить спеку на внешнее устройство и установить временные настройки сетап и холд. Требования настраиваются с помощью языка TCL. При настройке таймингов нужно вычислить задержки распространения сигналов по плате и указать в наносекундах (по-умолчанию, 150пс/дюйм). Для корректного формирования задержек мы должны заложить задержки на ТИ от генератора, входные задержки максимальные и минимальные (для памяти это, например, параметр CAS Latency). Данные от памяти выставляются за какое-то время, и это значение всегда находится в некотором диапазоне, конкретное время мы никогда не знаем, в том числе разные биты одной шины могут меняться в разное время, оэтому максимум (например 6+0,6 и минимум 2,7+0,4). Далее в настройке указывается куда применяется эта настройка.

\begin{verbatim}
# create clocks
create_clock -period 20 [get_ports CLOCK_50]
create_clock -period 20 [get_ports CLOCK2_50]
create_clock -period 20 [get_ports CLOCK3_50]

# use generated
derive_pll_clocks

# set uncertainty
derive_clock_uncertainty

set sdram_clk u0|altpll|sd1|pll7|clk[2]
create_generated_clock -name sdram_clk_pin -source $sdram_clk -offset 0.5 \
    [get_ports {DRAM_CLK}]

set_input_delay -clock sdram_clk_pin -max [expr 6 + 0.6] \
    [get_ports {DRAM_DQ[*]}]
set_input_delay -clock sdram_clk_pin -min [expr 2.7 + 0.4] \
    [get_ports {DRAM_DQ[*]}]

set_output_delay -clock sdram_clk_pin -max [expr 1.5 + 0.6] \
    [get_ports {DRAM_RAS_N DRAM_CKE DRAM_DQ[*] DRAM_CAS_N DRAM_DQM[*] DRAM_CS_N \
        DRAM_WE_N DRAM_ADDR[*] DRAM_BA[*]}]
set_output_delay -clock sdram_clk_pin -min [expr -0.8 + 0.4] \
    [get_ports {DRAM_RAS_N DRAM_CKE DRAM_DQ[*] DRAM_CAS_N DRAM_DQM[*] DRAM_CS_N \
        DRAM_WE_N DRAM_ADDR[*] DRAM_BA[*]}]

set_multicycle_path -from [get_clocks {sdram_clk_pin}] -to [get_clocks {u0|altpll|sd1|pll7|clk[2]}] -setup -end 2
\end{verbatim}

\subsection{Семинар 7 (2022-11-28)}
\textbf{Временной анализ (продолжение)}.

Компилятор может переставлять логику регистров, чтобы выравнивать время задержки между триггерами (ретайминг регистров). При понижении температуры чаще всего задержки уменьшаются.

формат SDC подразумевает некоторые термины:
cell - ячейка
pin - вывод cell
net - соединение
port - физический вывод микросхемы.

нетлисты отличаются по внешнему виду.

\code{get_ports} искать физические узлы
\code{get_pins} узлы селлов
\code{get_clocks} искать ТИ по набору параметров. В квартусе есть специальный интерфейс сопоставления портов пинов и текста Name Finder. 


Основные настройки и ограничения
\begin{itemize}
\item Clocks - настройка повторяющегося периодического сигнала который может быть задан для любой точки в проекте. Есть два типа - настройка ТИ и настройка относительного ТИ (Generated Clock). \textbf{По умолчанию, считается, что все ТИ связаны}. То есть чтобы верно анализировать нужно разделить проект на тактовые домены при помощи исключений. Если сгенерированы ФАПЧем нужно описывать многотактовые цепи.
  
  \code{create_clock [-name] -preiod [-waveform{RaiseTime FallTime}, <targets>, -add]}

-add нужен, чтобы добавлять настройки и явно указать, что предыдущие настройки не должны быть перетёрты.

\code{create_denerated_clock} значительно больше параметров (это может быть ТИ который формируется на ФАПЧ или методом деления, может быть ТИ, учитывающим задержки по схеме и снаружи). для ТИ на выходе ФАПЧ обычно не создают руками, а пишут \code{derive_pll_clocks}. Делитель на основе регистра - это плохая иедя (ripple clock) из-за задержек сигнала на триггерах и инверторах.

Для повышения точности моделирования возможно задать \code{set_clock_latency} которая водит дополнительную задержку и внутренний джиттер (clock uncertainty) по сетапу и холду \code{derive_clock_uncertainty}.

\item IO. Задержки могут быть как от регистра к регистру, так и в комбинационной логике. \code{set_max_delay}, \code{set_min_delay} где мы нормируем максимальное и минимальное время распространения сигнала через ПЛИС.
  
\item async paths (skipped)
  
\item false paths \code{set_false_path} - исключает группу цепей из анализа, \code{set_clock_groups} - описывает связанные группы ТИ, между несвязанными группами все переходы исключаются из анализа. Обязательно указываем какую цепь рвём. Можно исключить задержки по холду и сетапу. Или например не надо анализировать какую-то тестовую логику, тогда это тоже фолс пути.
  сетКлокГрупс группы можно добавить с ключом -exclusive это исключение одновременного присутствия ТИ, а asyncronous могут.
  
\item multicycle paths обязательно нужно прописывать, что если на ФАПЧ есть сдвиг фазы, то защёлкивающий такт не следующий фронт, а через один. Или если у нас есть сложная логика, которая не успевает отработать за такт, тогда надо установить холд на первом такте, а сетап на втором такте.
\end{itemize}

\subsection{Проектирование ПЛИС}

\end{document}
