| 1 |
2 |
jsauermann |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
| 2 |
|
|
"http://www.w3.org/TR/html4/strict.dtd">
|
| 3 |
|
|
<HTML>
|
| 4 |
|
|
<HEAD>
|
| 5 |
|
|
<TITLE>html/Introduction_and_Overview</TITLE>
|
| 6 |
|
|
<META NAME="generator" CONTENT="HTML::TextToHTML v2.46">
|
| 7 |
|
|
<LINK REL="stylesheet" TYPE="text/css" HREF="lecture.css">
|
| 8 |
|
|
</HEAD>
|
| 9 |
|
|
<BODY>
|
| 10 |
|
|
<P><table class="ttop"><th class="ttop"></th><th class="ttop"><a href="toc.html">Table of Content</a></th><th class="tnxt"><a href="02_Top_Level.html">Next Lesson</a></th></table>
|
| 11 |
|
|
<hr>
|
| 12 |
|
|
|
| 13 |
|
|
<H1><A NAME="section_1">1 INTRODUCTION AND OVERVIEW</A></H1>
|
| 14 |
|
|
|
| 15 |
|
|
<P>This lecture describes in detail how you can design a CPU (actually
|
| 16 |
|
|
an embedded system) in VHDL.
|
| 17 |
|
|
|
| 18 |
|
|
<P>The CPU has an instruction set similar to the instruction set of the
|
| 19 |
|
|
popular 8-bit CPUs made by <STRONG>Atmel</STRONG>. The instruction set is described in
|
| 20 |
|
|
<A HREF="http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf">http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf</A>. We use
|
| 21 |
|
|
an existing CPU so that we can reuse a software tool chain (<STRONG>avr-gcc</STRONG>)
|
| 22 |
|
|
for this kind of CPU and focus on the hardware aspects of the design.
|
| 23 |
|
|
At the end of the lecture, however, you will be able to design your own
|
| 24 |
|
|
CPU with a different instruction set.
|
| 25 |
|
|
|
| 26 |
|
|
<P>We will not implement the full instruction set; only the fraction needed
|
| 27 |
|
|
to explain the principles, and to run a simple "Hello world" program (and
|
| 28 |
|
|
probably most C programs) will be described.
|
| 29 |
|
|
|
| 30 |
|
|
<H2><A NAME="section_1_1">1.1 Prerequisites</A></H2>
|
| 31 |
|
|
|
| 32 |
|
|
<P>Initially you will need two programs:
|
| 33 |
|
|
|
| 34 |
|
|
<UL>
|
| 35 |
|
|
<LI><STRONG>ghdl</STRONG> from <A HREF="http://ghdl.free.fr">http://ghdl.free.fr</A> (a free VHDL compiler and simulator) and
|
| 36 |
|
|
<LI><STRONG>gtkwave</STRONG> from <A HREF="http://gtkwave.sourceforge.net">http://gtkwave.sourceforge.net</A> (a free visualization tool
|
| 37 |
|
|
for the output of ghdl).
|
| 38 |
|
|
</UL>
|
| 39 |
|
|
<P>These two programs allow you to design the CPU and simulate its functions.
|
| 40 |
|
|
|
| 41 |
|
|
<P>Later on, you will need a FPGA toolchain for creating FPGA design files
|
| 42 |
|
|
and to perform timing simulations. For this lecture we assume that the
|
| 43 |
|
|
free <STRONG>Xilinx Webpack</STRONG> tool chain is used (<A HREF="http://www.xilinx.com">http://www.xilinx.com</A>).
|
| 44 |
|
|
The latest version of the Xilinx Webpack provides ISE 11 (as of Nov. 2009)
|
| 45 |
|
|
but we used ISE 10.1 because we used an FPGA board providing a good old
|
| 46 |
|
|
Spartan 2E FPGA (actually an xc2s300e device) which is no longer supported
|
| 47 |
|
|
in ISE 11.
|
| 48 |
|
|
|
| 49 |
|
|
<P>Once the CPU design is finished, you need a C compiler that generates code
|
| 50 |
|
|
for the AVR CPU. For downloading <STRONG>avr-gcc</STRONG>, start here:
|
| 51 |
|
|
|
| 52 |
|
|
<P><A HREF="http://www.avrfreaks.net/wiki/index.php/Documentation:AVR_GCC#AVR-GCC_on_Unix_and_Linux">http://www.avrfreaks.net/wiki/index.php/Documentation:AVR_GCC#AVR-GCC_on_Unix_and_Linux</A>
|
| 53 |
|
|
|
| 54 |
|
|
<P>In order to try out the CPU, you will need some FPGA board
|
| 55 |
|
|
and a programming cable. We used a Memec "Spartan-IIE LC Development Kit"
|
| 56 |
|
|
board and an Avnet "Parallel Cable 3" for this purpose.
|
| 57 |
|
|
These days you will want to use a more recent development environment.
|
| 58 |
|
|
When the hardware runs, the final thing to get is a software toolchain,
|
| 59 |
|
|
for example <STRONG>avr-gcc</STRONG> for the instruction set and memory layout
|
| 60 |
|
|
used in this lecture. Optional, but rather helpful, is <STRONG>eclipse</STRONG>
|
| 61 |
|
|
(<A HREF="http://www.eclipse.org">http://www.eclipse.org</A>) with the AVR plugin.
|
| 62 |
|
|
|
| 63 |
|
|
<P>Another important prerequisite is that the reader is familiar with
|
| 64 |
|
|
VHDL to some extent. You do not need to be a VHDL expert in order
|
| 65 |
|
|
to follow this lecture, but you should not be a VHDL novice either.
|
| 66 |
|
|
|
| 67 |
|
|
<H2><A NAME="section_1_2">1.2 Other useful links.</A></H2>
|
| 68 |
|
|
|
| 69 |
|
|
<P>A good introduction into VHDL design with open source tools can
|
| 70 |
|
|
be found here:
|
| 71 |
|
|
|
| 72 |
|
|
<P><A HREF="http://www.armadeus.com/wiki/index.php?title=How_to_make_a_VHDL_design_in_Ubuntu/Debian">http://www.armadeus.com/wiki/index.php?title=How_to_make_a_VHDL_design_in_Ubuntu/Debian</A>
|
| 73 |
|
|
|
| 74 |
|
|
<H2><A NAME="section_1_3">1.3 Structure of this Lecture</A></H2>
|
| 75 |
|
|
|
| 76 |
|
|
<P>This lecture is organized as a sequence of lessons. The first lessons will
|
| 77 |
|
|
describe the VHDL files of the CPU design in a top-down fashion.
|
| 78 |
|
|
|
| 79 |
|
|
<P>Then follows a lesson on how to compile, simulate and build the design.
|
| 80 |
|
|
|
| 81 |
|
|
<P>Finally there is a listing of all design files with line numbers.
|
| 82 |
|
|
Pieces of these design files will be spread over
|
| 83 |
|
|
the different lessons and explained there in detail. In the end, all code
|
| 84 |
|
|
lines in the appendix should have been explained, with the exception of
|
| 85 |
|
|
comments, empty lines and the like. Repetitions such as the structure
|
| 86 |
|
|
of VHDL files or different opcodes that are implemented in the same way,
|
| 87 |
|
|
will only be described once.
|
| 88 |
|
|
|
| 89 |
|
|
<P>All source files are provided (without line numbers) in a tar file
|
| 90 |
|
|
that is stored next to this lecture.
|
| 91 |
|
|
|
| 92 |
|
|
<H2><A NAME="section_1_4">1.4 Naming Conventions</A></H2>
|
| 93 |
|
|
|
| 94 |
|
|
<P>In all lessons and in the VHDL source files, the following conventions
|
| 95 |
|
|
are used:
|
| 96 |
|
|
|
| 97 |
|
|
<P>VHDL entities and components and VHDL keywords are written in <STRONG>lowercase</STRONG>.
|
| 98 |
|
|
Signal names and variables are written in <STRONG>UPPERCASE</STRONG>.
|
| 99 |
|
|
Each signal has a prefix according to the following rules:
|
| 100 |
|
|
|
| 101 |
|
|
<TABLE>
|
| 102 |
|
|
<TR><TD>I_</TD><TD>for inputs of a VHDL entity.
|
| 103 |
|
|
</TD></TR><TR><TD>Q_</TD><TD>for outputs of a VHDL entity.
|
| 104 |
|
|
</TD></TR><TR><TD>L_</TD><TD>for local signals that are generated by a VHDL construct (e.g. by a signal assignment).
|
| 105 |
|
|
</TD></TR><TR><TD>x_</TD><TD>with an uppercase x for signals <STRONG>generated</STRONG> by an instantiated entity.
|
| 106 |
|
|
</TD></TR>
|
| 107 |
|
|
</TABLE>
|
| 108 |
|
|
<P>For every instantiated component we choose an uppercase letter x (other than
|
| 109 |
|
|
I, L, or Q). All signals driven by the component then get the prefix <STRONG>Q_</STRONG>
|
| 110 |
|
|
(if the instantiated component drives an output of the entity being defined)
|
| 111 |
|
|
or the prefix <STRONG>x_</STRONG> (if the component drives an internal signal).
|
| 112 |
|
|
|
| 113 |
|
|
<P>Apart from the prefix, we try to keep the name of a signal the
|
| 114 |
|
|
same across different VHDL files. Unless the prefix matters, we will
|
| 115 |
|
|
use the signal name <STRONG>without its prefix</STRONG> in our descriptions.
|
| 116 |
|
|
|
| 117 |
|
|
<P>Another convention is that we use one VHLD source file for every
|
| 118 |
|
|
entity that we define and that the name of the file (less the
|
| 119 |
|
|
.vhd extension) matches the entity name.
|
| 120 |
|
|
|
| 121 |
|
|
<H2><A NAME="section_1_5">1.5 Directory Structure</A></H2>
|
| 122 |
|
|
|
| 123 |
|
|
<P>Create a directory of your choice. In that directory, <STRONG>mkdir</STRONG> the following
|
| 124 |
|
|
sub-directories:
|
| 125 |
|
|
|
| 126 |
|
|
<TABLE>
|
| 127 |
|
|
<TR><TD>app</TD><TD>for building the program that will run on the CPU (i.e. <STRONG>hello.c</STRONG>)
|
| 128 |
|
|
</TD></TR><TR><TD>simu</TD><TD>for object files generated by <STRONG>ghdl</STRONG>
|
| 129 |
|
|
</TD></TR><TR><TD>src</TD><TD>for VHDL source files of the CPU and <STRONG>avr_fpga.ucf</STRONG>
|
| 130 |
|
|
</TD></TR><TR><TD>test</TD><TD>for a VHDL testbench
|
| 131 |
|
|
</TD></TR><TR><TD>tools</TD><TD>for tools <STRONG>end_conv</STRONG> and <STRONG>make_mem</STRONG>
|
| 132 |
|
|
</TD></TR><TR><TD>work</TD><TD>working directory for <STRONG>ghdl</STRONG>
|
| 133 |
|
|
</TD></TR>
|
| 134 |
|
|
</TABLE>
|
| 135 |
|
|
<P>Initially the directory should look like this:
|
| 136 |
|
|
|
| 137 |
|
|
<pre class="cmd">
|
| 138 |
|
|
|
| 139 |
|
|
# ls -R .
|
| 140 |
|
|
./app:
|
| 141 |
|
|
hello.c
|
| 142 |
|
|
|
| 143 |
|
|
./simu:
|
| 144 |
|
|
|
| 145 |
|
|
./src:
|
| 146 |
|
|
alu.vhd
|
| 147 |
|
|
avr_fpga.ucf
|
| 148 |
|
|
avr_fpga.vhd
|
| 149 |
|
|
baudgen.vhd
|
| 150 |
|
|
common.vhd
|
| 151 |
|
|
COPYING
|
| 152 |
|
|
cpu_core.vhd
|
| 153 |
|
|
data_mem.vhd
|
| 154 |
|
|
data_path.vhd
|
| 155 |
|
|
io.vhd
|
| 156 |
|
|
opc_deco.vhd
|
| 157 |
|
|
opc_fetch.vhd
|
| 158 |
|
|
prog_mem_content.vhd
|
| 159 |
|
|
prog_mem.vhd
|
| 160 |
|
|
reg_16.vhd
|
| 161 |
|
|
register_file.vhd
|
| 162 |
|
|
segment7.vhd
|
| 163 |
|
|
status_reg.vhd
|
| 164 |
|
|
uart_rx.vhd
|
| 165 |
|
|
uart_tx.vhd
|
| 166 |
|
|
uart.vhd
|
| 167 |
|
|
|
| 168 |
|
|
./test:
|
| 169 |
|
|
RAMB4_S4_S4.vhd
|
| 170 |
|
|
test_tb.vhd
|
| 171 |
|
|
|
| 172 |
|
|
./tools:
|
| 173 |
|
|
end_conv.cc
|
| 174 |
|
|
make_mem.cc
|
| 175 |
|
|
|
| 176 |
|
|
./work:
|
| 177 |
|
|
|
| 178 |
|
|
</pre>
|
| 179 |
|
|
<P>
|
| 180 |
|
|
|
| 181 |
|
|
<H2><A NAME="section_1_6">1.6 Other Useful Tools</A></H2>
|
| 182 |
|
|
|
| 183 |
|
|
<P>This lecture was prepared with 3 excellent tools:
|
| 184 |
|
|
|
| 185 |
|
|
<UL>
|
| 186 |
|
|
<LI><STRONG>vim</STRONG> 7.1.38 for preparing the text of the lecture,
|
| 187 |
|
|
<LI><STRONG>txt2html</STRONG> 2.46 for converting the text into html, and
|
| 188 |
|
|
<LI><STRONG>dia</STRONG> 0.5 for drawing the figures.
|
| 189 |
|
|
</UL>
|
| 190 |
|
|
<P><hr><BR>
|
| 191 |
|
|
<table class="ttop"><th class="ttop"></th><th class="ttop"><a href="toc.html">Table of Content</a></th><th class="tnxt"><a href="02_Top_Level.html">Next Lesson</a></th></table>
|
| 192 |
|
|
</BODY>
|
| 193 |
|
|
</HTML>
|