203 lines
15 KiB
TeX
203 lines
15 KiB
TeX
\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}
|