77 lines
3 KiB
TeX
77 lines
3 KiB
TeX
|
\documentclass[../Diplomschrift.tex]{subfiles}
|
||
|
\begin{document}
|
||
|
|
||
|
\part{A short introduction to VHDL}
|
||
|
|
||
|
Designing a processor is a big task, and it's easiest to start very small. With software projects, this is usually in the form of a ``Hello World'' program - we will be designing a hardware equivalent of this.
|
||
|
|
||
|
\section{Prerequisites}
|
||
|
|
||
|
Other than a text editor, the following Free Software packages have to be installed:
|
||
|
|
||
|
\begin{savenotes}
|
||
|
\begin{description}
|
||
|
\item[\icode{ghdl}\cite{ghdl}] to analyze, compile, and simulate the design
|
||
|
\item[\icode{gtkwave}\cite{gtkwave}] to view the simulation waveform files
|
||
|
\item[\icode{yosys}\cite{yosys}] to synthesize the design
|
||
|
\item[\icode{ghdlsynth-beta}\cite{yosys}] to synthesize the design
|
||
|
\item[\icode{nextpnr-xilinx}\cite{nextpnr-xilinx}] to place and route the design
|
||
|
\item[\icode{Project X-Ray}\cite{prjxray}] for FPGA layout data and bitstream tools
|
||
|
\item[\icode{openFPGALoader}\cite{open-fpga-loader}] to load the bitstream onto the FPGA
|
||
|
\end{description}
|
||
|
\end{savenotes}
|
||
|
|
||
|
\section{Creating a design}
|
||
|
|
||
|
A simple starting design is an up/down counter. The following VHDL code describes the device:
|
||
|
|
||
|
\lstinputlisting[style=vhdlstyle,title=\texttt{counter.vhd}]{vhdl/counter.vhd}
|
||
|
|
||
|
In order to test this design, a test bench has to be created:
|
||
|
|
||
|
\lstinputlisting[style=vhdlstyle,title=\texttt{counter_tb.vhd}]{vhdl/counter_tb.vhd}
|
||
|
|
||
|
\section{Simulating a design}
|
||
|
|
||
|
\begin{lstlisting}[style=terminal]
|
||
|
# analyze the design files
|
||
|
ghdl -a --std=08 *.vhd
|
||
|
# elaborate the test bench entity
|
||
|
ghdl -e --std=08 counter_tb
|
||
|
# run the test bench, saving the signal trace to a GHW file
|
||
|
ghdl -r --std=08 counter_tb --wave=counter_tb.ghw
|
||
|
# open the trace with gtkwave (using the view configuration in counter_tb.gtkw)
|
||
|
gtkwave counter_tb.ghw counter_tb.gtkw
|
||
|
\end{lstlisting}
|
||
|
|
||
|
\begin{figure}
|
||
|
\includegraphics[width=\textwidth]{counter_gtkwave.png}
|
||
|
\caption{Screenshot of the resulting waveform in GTKWave}
|
||
|
\end{figure}
|
||
|
|
||
|
\section{Synthesizing a design}
|
||
|
|
||
|
An additional Xilinx Design Constraints (XDC) file is required to assign the signals to pins on the FPGA:
|
||
|
|
||
|
\lstinputlisting[title=\texttt{counter.xdc}]{vhdl/counter.xdc}
|
||
|
|
||
|
\begin{lstlisting}[style=terminal]
|
||
|
# synthesize with yosys
|
||
|
yosys -m ghdl.so -p '
|
||
|
ghdl --std=08 counter.vhd -e counter;
|
||
|
synth_xilinx -flatten;
|
||
|
write_json counter.json'
|
||
|
# place and route the design with nextpnr
|
||
|
nextpnr-xilinx --chipdb xc7a35tcsg324-1.bin --xdc counter.xdc --json counter.json --fasm counter.fasm
|
||
|
# convert the FPGA assembly to frames
|
||
|
fasm2frames.py --part xc7a35tcsg324-1 counter.fasm counter.frames
|
||
|
# convert the frames to a bitstream
|
||
|
xc7frames2bit --part-name xc7a35tcsg324-1 --frm-file counter.frames --output-file counter.bit
|
||
|
# upload the bitstream to the FPGA
|
||
|
openFPGALoader -b arty counter.bit
|
||
|
\end{lstlisting}
|
||
|
|
||
|
The current value of the counter is displayed in binary on the eight LEDs on the board. When switch 0 (enable) is in the high position, the counter can be advanced using button 0, with the direction set by switch 1. Button 1 resets the counter to zero.
|
||
|
|
||
|
\end{document}
|