\documentclass[a4paper,fontsize=14bp]{article} \input{settings/common-preamble} \input{settings/fancy-listings-preamble} \input{settings/bmstu-preamble} \setcounter{secnumdepth}{4} \numerationTop \begin{document} \thispagestyle{empty} \makeBMSTUHeader \makeReportTitle{лабораторной}{4}{Проектирование цифрового синтезатора}{Проектирование цифровых устройств на \\ программируемых логических интегральных схемах (ПЛИС)}{}{С.В. Фёдоров} \newpage \pagestyle{fancy} \section{Цель} Осуществить полный цикл проектирования цифрового устройства на ПЛИС на языке SystemVerilog. Реализовать генератор периодических функций на основе метода прямого цифрового синтеза на микросхеме семейства Cyclone IV E. \section{Задачи} \begin{itemize} \item Реализовать модули «Накопителя фазы», «Просмотровой таблицы», «Сигма-Дельта модулятора». \item Реализовать синтезатор по схеме (рис. \hrf{pic:synth-scheme}), используя разработанные модули. \begin{figure}[H] \centering \fontsize{14}{1}\selectfont \includesvg[scale=1.01]{pics/03-fpga-lab-04-01-synth.svg} \caption{Схема цифрового синтезатора} \label{pic:synth-scheme} \end{figure} \item Осуществить моделирование каждого этапа разработки. \item В рамках самостоятельной подготовки провести расчёт значений $u_n$,$x_n$,$y'_n$ и $\varepsilon_n$ для 5 тактов работы дельта-сигма модулятора. Приведите значения для каждого такта и график выходного сигнала $y_n$. \end{itemize} \section{Выполнение работы} \subsection{Самостоятельная подготовка} Вариант 9 для первой группы $x_n = 9 * 3 - 21 = 6$. \begin{figure}[H] \centering \resizebox{\textwidth}{!}{\input{pics/03-fpga-04-sigdel.pgf}} \caption{Пошаговая иллюстрация работы сигма-дельта модулятора} \label{pic:sig-del-handjob} \end{figure} Регистр $u_{-1}$ по низкому уровню сигнала сброса инициализируется нулём, поэтому значение $y_{-1}$ становится равным 127, как следствие, $\varepsilon_{-1} = 0$. Далее, значения изменяются по следующим формулам: \begin{equation*} \begin{gathered} x = 6;\\ u_n = x - y'_{n-1}\\ \varepsilon_n = y'_n - u_n \end{gathered} \end{equation*} Несколько шагов алгоритма приведены в расчётах ниже. Из ручного прохождения алгоритма (и графика на рис \hrf{pic:sig-del-handjob}) очевидно, что постоянное малое значение на входе модулятора формирует переходы $y$ от -128 до 127 на каждом такте линии задержки, как если бы это было при входящем значении нуля, и изредка удерживает $y$ в значении 127 (примерно, один раз в 20 отсчётов). \begin{enumerate} \item $x = 6, u_{1} = 6, y'_{0} = 127, \varepsilon_{1} = 121$ \item $x = 6, u_{2} = -115, y'_{1} = 127, \varepsilon_{2} = -13$ \item $x = 6, u_{3} = 19, y'_{2} = -128, \varepsilon_{3} = 108$ \item $x = 6, u_{4} = -102, y'_{3} = 127, \varepsilon_{4} = -26$ \item $x = 6, u_{5} = 32, y'_{4} = -128, \varepsilon_{5} = 95$ \item $x = 6, u_{6} = -89, y'_{5} = 127, \varepsilon_{6} = -39$ \item $x = 6, u_{7} = 45, y'_{6} = -128, \varepsilon_{7} = 82$ \item $x = 6, u_{8} = -76, y'_{7} = 127, \varepsilon_{8} = -52$ \item $x = 6, u_{9} = 58, y'_{8} = -128, \varepsilon_{9} = 69$ \item $x = 6, u_{10} = -63, y'_{9} = 127, \varepsilon_{10} = -65$ \item $x = 6, u_{11} = 71, y'_{10} = -128, \varepsilon_{11} = 56$ \item $x = 6, u_{12} = -50, y'_{11} = 127, \varepsilon_{12} = -78$ \item $x = 6, u_{13} = 84, y'_{12} = -128, \varepsilon_{13} = 43$ \item $x = 6, u_{14} = -37, y'_{13} = 127, \varepsilon_{14} = -91$ \item $x = 6, u_{15} = 97, y'_{14} = -128, \varepsilon_{15} = 30$ \item $x = 6, u_{16} = -24, y'_{15} = 127, \varepsilon_{16} = -104$ \item $x = 6, u_{17} = 110, y'_{16} = -128, \varepsilon_{17} = 17$ \item $x = 6, u_{18} = -11, y'_{17} = 127, \varepsilon_{18} = -117$ \item $x = 6, u_{19} = 123, y'_{18} = -128, \varepsilon_{19} = 4$ \item $x = 6, u_{20} = 2, y'_{19} = 127, \varepsilon_{20} = 125$ \item $x = 6, u_{21} = -119, y'_{20} = 127, \varepsilon_{21} = -9$ \item $x = 6, u_{22} = 15, y'_{21} = -128, \varepsilon_{22} = 112$ \end{enumerate} \subsection{Разработка модулей} \subsubsection{Накопитель фазы} \textbf{Интерфейс модуля} \begin{frm} \begin{itemize} \item [] \textbf{Входы:} \item [] \code{phinc[7:0]} -- величина приращения фазы за один период тактового сигнала; \item [] \code{clk} -- тактовый сигнал; \item [] \code{clr_n} -- вход асинхронного сброса; \item [] \textbf{Выходы:} \item [] \code{phase[7:0]} -- 8 старших значащих битов выхода накопителя; \item [] \textbf{Параметры:} \item [] \code{WIDTH} -- разрядность накопителя фазы (значение по умолчанию -- 14). \end{itemize} \end{frm} \textbf{Принцип действия} Накопитель фазы -- это классический аккумулятор, который сохраняет накопленную сумму в регистре и использует её в качестве одного из операндов сумматора на каждом такте. Второй операнд поступает с входа и определяет величину приращения фазы. Разрядность аккумулятора должна быть параметризирована. Входные значения складываются с младшими битами регистра аккумулятора, а на выход поступают старшие 8 разрядов аккумулятора, поэтому при разрядности аккумулятора M и значении N на входе приращения фазы выход фазы будет увеличиваться на единицу один раз в $2^{(M-8)}/N$ тактов. \lstinputlisting[language=Verilog,style=VerilogStyle,caption={Накопитель фазы},label={lst:phacc}]{src/phacc.sv} \lstinputlisting[language=Verilog,style=VerilogStyle,caption={Тестовый стенд накопителя фазы},label={lst:inc_lut}]{src/inc_lut_tb.sv} \subsubsection{Просмотровая таблица} Просмотровая таблица реализована на ПЗУ, шина адреса которого управляется входным значением фазы сигнала, а ячейки содержат соответствующие значения сигнала. Для реализации использован модуль ROM: 1-PORT с файлом инициализации памяти sine256.mif прилагавшемся в исходных файлах для лабораторной работы. \begin{figure}[H] \centering \includegraphics[width=0.9\textwidth]{03-fpga-lab-04-02-phacc.png} \caption{Результат симуляции работы накопителя фазы и просмотровой таблицы} \label{pic:phacc-lut} \end{figure} \subsubsection{Дельта-сигма модулятор} \textbf{Интерфейс модуля} \begin{frm} \begin{itemize} \item [] \textbf{Входы:} \item [] \code{val[7:0]} - входные данные модулятора; \item [] \code{clk} – тактовый сигнал; \item [] \code{clr_n} – вход асинхронного сброса. \item [] \textbf{Выход:} \item [] \code{daco} - однобитная выходная последовательность. \end{itemize} \end{frm} \textbf{Принцип действия} На вход поступают 8-разрядные отсчеты $x_n$ (рис. \hrf{pic:sigdel-1}). Выход $y_n$ -- двухуровневый дискретизированный с большой частотой. Частота изменения отсчетов сигнала, выбираемых из памяти, ниже частоты работы модулятора. Это обеспечивает передискретизацию и возможность представления сигнала в аналоговом виде после НЧ фильтрации последовательности нулей и единиц. \begin{figure}[H] \centering \fontsize{12}{1}\selectfont \includesvg[scale=1.01]{pics/03-fpga-lab-04-01-sigdel.svg} \caption{Схема дельта-сигма модулятора первого порядка} \label{pic:sigdel-1} \end{figure} Если в работе модулятора использовать 8-разрядный регистр $u_n$ периодически в работе модулятора будут появляться переполнения и будет наблюдаться некорректное поведение, проявляющееся в смене фазы выходного сигнала (рис. \hrf{pic:unoverflow}). Переполнение регистра возможно наблюдать при моделировании достаточно большого числа шагов алгоритма (рис. \hrf{pic:unover-model}). \begin{figure}[H] \centering \includegraphics[width=0.9\textwidth]{03-fpga-lab-04-02-unoverflow.png} \caption{Смена фазы выходного сигнала} \label{pic:unoverflow} \end{figure} \begin{figure}[H] \centering \includegraphics[width=0.9\textwidth]{03-fpga-lab-04-02-unover-model.png} \caption{Переполнение значения регистра} \label{pic:unover-model} \end{figure} \lstinputlisting[language=Verilog,style=VerilogStyle,caption={Код дельта-сигма модулятора},label={lst:phacc}]{src/sdmod.sv} \lstinputlisting[language=Verilog,style=VerilogStyle,caption={Тестовый стенд дельта-сигма модулятора},label={lst:inc_lut}]{src/lut_mod_tb.sv} \subsubsection{Реализация синтезатора} \lstinputlisting[language=Verilog,style=VerilogStyle,caption={Код дельта-сигма синтезатора},label={lst:phacc}]{src/sigdel.sv} \begin{figure}[H] \centering \includegraphics[width=0.9\textwidth]{03-fpga-lab-04-02-correct.png} \caption{Моделирование работы синтезатора} \label{pic:synth-model} \end{figure} \subsection{Контрольные вопросы} \begin{itemize} \item Почему именно за это время из памяти выбирается один период синуса? Столько тратит времени 14-разрядный регистр накапливающий значения в 8 нижних разрядах так, чтобы изменилось значение в 8 верхних, отдаваемых аккумулятором. \item Какая разрядность накопителя фазы требуется для формирования синусоидального сигнала в диапазоне частот от единиц до сотен Герц при изменении инкремента фазы от 1 до 255 (период синуса содержит 256 отсчетов, частота тактового импульса -- 50МГЦ)? В данной работе использовался коэффициент накопления 16 при той же частоте ТИ, то есть на каждом такте значение в аккумуляторе менялось на 1 в 5м разряде. Это тоже самое, что если коэфициент будет равен единице, а разрядность снижена на 5. Один период синуса проходил за 20мкс. Таким образом можно сделать вывод, что при коэффициенте 16 и разрядности накопителя 20 период одного синуса будет составлять около 760мс, при разрядности 21 -- около 1,5сек. \item Дельта-сигма модулятор первого порядка. Позволяет снизить шум квантования относительно ШИМ, за счёт увеличения частоты выходного сигнала. \item Конфигурация ПЛИС Altera на основе статической памяти. Конфигурация ПЛИС хранится ячейках статической памяти, изготовленной по стандартной технологии. Достоинство этой технологии -- возможность многократного перепрограммирования ПЛИС. Недостатки -- не самое высокое быстродействие, поскольку после включения питания прошивку нужно вновь загружать из памяти. На плате необходимо дополнительно устанавливать загрузчик, специальная микросхема FLASH или микроконтроллер. \item Язык SystemVerilog. Языки описания схемотехники (HDL -- hardware design language) позволяют значительно сократить время описания схемотехнических решений и значительно повысить качество за счёт переиспользования кода, б\'{о}льших возможностей по моделированию и тестированию готовых схем. Также повышается переносимость решений. Язык SystemVerilog отличается от VHDL (Very High Speed Integrated Circuit HDL) лаконичностью описания, а от Verilog расширенными возможностями работы с абстракциями более верхнего уровня (не только сигналы, регистры и шины, но и знаковые переменные, матрицы и прочие). \end{itemize} \section{Выводы} \newpage \appendix \setcounter{secnumdepth}{4} \section{Приложения} \subsection{Исходные коды проекта} \label{appendix:src} \end{document}