URL
https://opencores.org/ocsvn/ion/ion/trunk
Subversion Repositories ion
[/] [ion/] [trunk/] [doc/] [src/] [tex/] [usage.tex] - Rev 221
Compare with Previous | Blame | View Log
\chapter{Usage}
\section{Main Modules}
\label{main_modules}
The core is split in three main modules:
\begin{enumerate}
\item The CPU (mips\_cpu.vhdl).
\item The cache+memory controller (mips\_cache.vhdl).
\item A 'SoC' entity which combines CPU+Cache (mips\_soc.vhdl).
\end{enumerate}
The entity you should use in your projects is the SoC module. The project
includes a 'hardware demo' built around this module (see section
~\ref{pregenerated_demo}) which is meant as an usage example.\\
\section{Bootstrap Code}
\label{bootstrap_code}
Though the core is meant to run mostly from off-chip memory, the current version
of the SoC module includes a small ROM implemented as FPGA BRAM and called
'bootstrap BRAM'. In the current version of the core, this BRAM can be loaded
with arbitrary code and its size can be configured by using generics, but it
can't be removed from the SoC. Even though the memory map can be modified to
boot from external FLASH and not use a BRAM at all, a BRAM will still be
inferred within the SoC -- subsequent versions will fix this.
As can be seen in table~\ref{tab_soc_memory_map}, the internal BRAM is mirrored
all over a wide area starting at \texttt{0xb8000000}. In practice, this means
the BRAM will be mapped at the CPU reset address (\texttt{0xbfc00000}) and thus
the bootstrap code should be placed there.
Unless the bootstrap BRAM is very small, it will span over the interrupt vector
address too (\texttt{0xbfc00180}).
For example, the 'Adventure' demo included with the project uses bootstrap
code included in file \texttt{/src/common/bootstrap.s}. This bootstrap code
is fairly incomplete (interrupt response code is mostly a stub) yet it's enough
to boot most applications.
Note that the C startup code, which deals with things like initializing the
static variables on the data segment, etc. is not part of this bootstrap code.
It can be found in file \texttt{/src/common/c\_startup.s}
So, in short, the code loaded onto the startup BRAM should include the most
basic system initialization (cache initialization at least) and the entry point
for the interrupt response code; plus a jump to the main program entry address.
Anyone trying to build some application on this core is advised to use the code
samples as starting points, specially the makefiles.
\subsection{Loading Bootstrap Code on the SoC Module}
\label{loading_bootstrap_code}
Once the code that is to be loaded on the bootstrap BRAM has been built, you
need to load it onto the bootstrap BRAM within the FPGA.
As you probably already know, there are several possible ways to deal with this
and most of them involve using \emph{'Memory Initialization Files'} of
some sort. This project is different.
So far, this project does not include any support for using IMF
files of any kind. Instead, the bootstrap BRAM is inferred and initialized
using regular VHDL constructs and a constant passed to the SoC module as a
generic.
This scheme has a big drawback: every time the object code within the FPGA
changes, the whole synthesis needs to be re-run. This drawback is manageable
as long as the core is not used in any big project or if the bootstrap code
does not change often.
On the other hand, I see some big advantages in using regular BRAM inference in
this stage of the project:
\begin{enumerate}
\item The whole scheme is totally vendor agnostic.
\item Object code embedded on VHDL constants can very easily be used in both simulation and synthesis.
\end{enumerate}
So, whatever object code is to be used to initialize the SoC bootstrap BRAM has
to be passed to the SoC module instance as a generic constant (see section
~\ref{soc_generics}). The constant must be of type \texttt{t\_obj\_code}, which
is defined in package \emph{mips\_pkg}.
\subsection{Building the Bootstrap Initialization Constant}
\label{boot_code_conversion}
The project includes a python script (\texttt{/tools/build\_pkg/build\_pkg.py})
whose purpose is to build an VHDL \texttt{t\_obj\_code} constant out of a
\emph{binary} object code file.
This script will read one or more big-endian, binary object files and will
produce a VHDL package file that will contain initialization constants for
the bootstrap BRAM and for some other memories that are only used in the
simulation test bench.
The package can optionally include too some simulation and synthesis
configuration constants -- such as the size of the bootstrap BRAM.
The makefiles included in the code samples invoke this script twice: once
to generate a package called \emph{sim\_params\_pkg} and used in the
simulation test bench; and once to build a package called
\emph{bootstrap\_code\_pkg} used for synthesis.
Please refer to the makefiles for usage examples, and read the script source
for more detailed usage instructions.
