| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422 |
- % !TeX root = index.tex
- \iffalse
- This chapter lays out your approach.
- What did you actually do to reach your goal, or attempt to reach your goal?
- What equipment did you use?
- How did you build the device?
- How did you set up the simulation: what mesh values, for example, did you use?
- Provide enough detail that your work can be duplicated by someone else.
- Be precise and use the correct units.
- \fi
- This section describes methods and design choices used to construct two processors.
- \subsection{Machine Code}\label{subsec:machine_code}
- \subsubsection{RISC}
- As the aim of instruction size to be as minimal as possible, RISC instruction decided to be 8bits with optional additional immediate value from 1 to 3 bytes. Immediate values are explained in section \ref{subsec:imm_values}.
- Decision was made to have instruction compose of operation code two operands - source/destination and source, which is similar to x86 architecture rather than MIPS. Three possible combinations of register address sizes are possible in such case from one to three bits. Two was selected as it allow having four general purpose registers which is sufficient for most applications, and allow four bits for operation code - allowing up to 16 instructions.
- Due to small amount of available operation codes and not all instructions requiring two operands (for example \texttt{JUMP} instruction may not need any operands or could use one operand to have address offset), other two type instructions are added to the design - with one and zero operands. See figure \ref{fig:risc_machinecode}. This enabled processor to have 45 different instructions while maintaining minimal instruction size. Final design has:
- \begin{description}[labelindent=1cm, labelsep=1em]
- \item[$\bullet$ \textbf{8 }] 2-operand instructions
- \item[$\bullet$ \textbf{32}] 1-operand instructions
- \item[$\bullet$ \textbf{5 }] 0-operand instructions
- \end{description}
- Full list of RISC instructions are listed in table \ref{tab:risc_instructions} in \nameref{sec:appendix} section.
- \begin{blockpage}
- \begin{gather*}
- \scalebox{0.8}{2 operands:}~
- \underbrace{
- \colorbox{c1}{0}\,
- \colorbox{c1}{1}\,
- \colorbox{c1}{2}\,
- \colorbox{c1}{3}
- }_\text{op. code}
- \underbrace{
- \colorbox{c2}{4}\,
- \colorbox{c2}{5}
- }_\text{dst.}
- \underbrace{
- \colorbox{c3}{6}\,
- \colorbox{c3}{7}
- }_\text{src.}
- \\
- \scalebox{0.8}{1 operand:}~
- \underbrace{
- \colorbox{c1}{0}\,
- \colorbox{c1}{1}\,
- \colorbox{c1}{2}\,
- \colorbox{c1}{3}
- }_\text{op. code}
- \underbrace{
- \colorbox{c2}{4}\,
- \colorbox{c2}{5}
- }_\text{dst.}
- \underbrace{
- \colorbox{c1}{6}\,
- \colorbox{c1}{7}
- }_\text{op. c.}\\
- \scalebox{0.8}{0 operands:}~
- \underbrace{
- \colorbox{c1}{0}\,
- \colorbox{c1}{1}\,
- \colorbox{c1}{2}\,
- \colorbox{c1}{3}\,
- \colorbox{c1}{4}\,
- \colorbox{c1}{5}\,
- \colorbox{c1}{6}\,
- \colorbox{c1}{7}
- }_\text{operation code}
- \end{gather*}
- \begin{center}
- \captionof{figure}{\textit{RISC instructions composition. Number inside box represents bit index. Destination (dst.) bits represents of source and destination register address.}}
- \label{fig:risc_machinecode}
- \end{center}
- \end{blockpage}
- \subsubsection{OISC}
- As OISC requires only a single instruction, composition of instruction mainly requires two parts - source and destination. To allow higher instruction flexibility a immediate bit has been added to replace source address by immediate value. Composition of finalised machine code is shown in figure \ref{fig:oisc_machinecode}.
- \begin{blockpage}
- \begin{gather*}
- \underbrace{
- \colorbox{c1}{0}
- }_\text{imm.}
- \underbrace{
- \colorbox{c2}{1}\,
- \colorbox{c2}{2}\,
- \colorbox{c2}{3}\,
- \colorbox{c2}{4}\,
- }_\text{destination}
- \underbrace{
- \colorbox{c3}{5}\,
- \colorbox{c3}{6}\,
- \colorbox{c3}{7}\,
- \colorbox{c3}{8}\,
- \colorbox{c3}{9}\,
- \colorbox{c3}{10}\,
- \colorbox{c3}{11}\,
- \colorbox{c3}{12}
- }_\text{source}
- \end{gather*}
- \begin{center}
- \captionof{figure}{\textit{OISC instruction composition. Number inside box represents bit index.}}
- \label{fig:oisc_machinecode}
- \end{center}
- \end{blockpage}
- Decision was made to have source address to be eight bits to allow it be replaced with immediate value. Destination address was chosen to be as minimal as possible, leaving only four bits or 16 possible destinations. Final design has \textbf{15} destination and \textbf{41} source addresses. This is not the most space efficient design as 41 source addresses would require only six bits for address, wasting two bits every time non-immediate source is used.
- Full list of OISC sources and destinations are listed in table \ref{tab:oisc_instructions} in \nameref{sec:appendix} section.
- \begin{landscape}
- \subsection{Data flow} \label{sec:dataflow}
- \subsubsection{RISC Datapath} \label{subsec:datapath}
- \begin{figure}[h!]
- \centering
- \includegraphics[width=\linewidth]{../resources/datapath.eps}
- \caption{Digital diagram of RISC datapath}
- \label{fig:datapath}
- \end{figure}
-
- Figure \ref{fig:datapath} above represents partial RISC datapath. Program counter, Stack pointer and Immediate Override logics are represented in figures \ref{fig:risc_pc}, \ref{fig:risc_stack} and \ref{fig:risc_imo} respectively. CDI (Control-Data Interface) is HDL concept that connects datapath and control unit. Immediate value to datapath is provided by IMO block described in section \ref{subsec:imo}.\\
- Data to register file is selected and saved with \textit{MUX0}. This data is delayed 1 cycle with \textit{R2} to match timing that of data is taken from memory. If \texttt{LWLO} or \texttt{LWHI} is executed, \textit{MUX1} select high or low byte from memory to read. To compensate for timing as value written to register file is delayed by 1 cycle, register file has internal logic that outputs \textit{wr\_data} to \textit{rd\_data1} or/and \textit{rd\_data2} immediately if \textit{wr\_en} is high and \textit{rd\_addr1} or/and \textit{rd\_addr2} matches \textit{wr\_addr}.\\
- \end{landscape}
- \subsubsection{OISC Datapath} \label{subsec:oisc_cells}
- OISC datapath only consists of instruction and data buses, and small circuit that connect them to logic blocks that process the data. These logic blocks can represent ALU operation combinational logic, or any other part of a processor.
- Figure \ref{fig:oisc_cell_in} represents common destination circuit. It checks if particular block destination matches one on instruction bus, then enables latch and also sets flag to further logic.
- \begin{colfigure}
- \centering
- \includegraphics[width=\linewidth]{../resources/oisc_cell_in.eps}
- \captionof{figure}{OISC processor data bus to destination connection logic}
- \label{fig:oisc_cell_in}
- \end{colfigure}
- Similarly Figure \ref{fig:oisc_cell_out} represents source circuit connecting output of logic block. As logic block may only involve combinational logic a register is placed at the output of it. Buffer is used to connect data in register to data bus. This ensures that only one bus driver is present, ensuring do data collision.
- \begin{colfigure}
- \centering
- \includegraphics[width=\linewidth]{../resources/oisc_cell_out.eps}
- \captionof{figure}{OISC processor data bus to source connection logic}
- \label{fig:oisc_cell_out}
- \end{colfigure}
- The general timing is designed so that the information at the source is immediately ready in data bus at rise of the processor clock. The source is connected to the destination connection where combinational logic is present.
- \subsubsection{OISC Datapath Implementation Problems} \label{subsec:oisc_cell_issue}
- The complete implementation using latches for destination was not successful. Latches did not operate correctly when synthesised on FPGA. This issue might be caused by some timing problem between some source and destination logic combination. Exact cause was not resolved.
- As a quick solution, latches at destination has been replaced with a clocked register that is triggered at opposite to source register clock edge (negative). This resolved this issue, however it effectively reduce period that data can propagate though logic blocks between source and destination by two.
- \subsection{Stack} \label{subsec:stack}
- This section describes RISC and OISC dedicated logic for stack pointer control. Stack pointer starts from the highest memory address value and "stacks" to lower memory address values. Both designs were simplified to only operate on two byte addresses, meaning that stack pointer has a constant \texttt{0xFF} value at least significant byte.
- \subsubsection{RISC Stack}
- RISC processor implements the stack pointer that is used in \texttt{PUSH}, \texttt{POP}, \texttt{CALL} and \texttt{RET} instructions. The stack pointer's initial address starts at the highest memory address (\texttt{0xFFFF}) and subtracts 1 when data is put to stack. Figure \ref{fig:risc_stack} represents the digital diagram for stack pointer. Note that the stack is only 16bit in size and the most significant byte is set to \texttt{0xFF}. The stack pointer circuit also supports \textit{pc\_halted} signal from program counter to prevent the stack pointer from being added by 1 twice during \texttt{RET} instruction.
- One of the problems with the current stack pointer implementation is 8bit data stored in 16bit memory address, wasting a byte. This can be avoided by adding a high byte register, however then it would cause problems when a 16bit program pointer is stored with \texttt{CALL} instruction. This can still be improved with a more complex circuit, or by using memory cache with 8bit data input. However with current implementation this does not affect processor comparison, it only increases stack size in memory.
- \begin{figure*}
- \centering
- \includegraphics[width=\linewidth]{../resources/risc_stack.eps}
- \caption{Digital diagram of RISC stack pointer logic}
- \label{fig:risc_stack}
- \end{figure*}
- \subsubsection{OISC Stack}
- Stack pointer in OISC is very similar to RISC. In basic operation, when reset, push or pop flags are set, it changes the state of stack pointer by adding or subtracting its value by one, or resetting it to default. Logic diagram is shown in Figure \ref{fig:oisc_stack}
- \begin{figure*}[b]
- \centering
- \includegraphics[scale=0.4]{../resources/oisc_stack.eps}
- \caption{Digital diagram of OISC stack pointer logic}
- \label{fig:oisc_stack}
- \end{figure*}
- Logic diagram of stack control unique to OISC processor is shown in Figure \ref{fig:oisc_stack_2}. Push and pop flags are taken from source and destination logic. A cached value of last stored value is kept, so that it would be immediately available on source request. Pop flag is delayed by one cycle which ensures that once popped, lower stack value is written to cache during next cycle.
- \begin{figure*}
- \centering
- \includegraphics[scale=0.4]{../resources/oisc_stack_2.eps}
- \caption{Digital diagram of OISC stack control logic}
- \label{fig:oisc_stack_2}
- \end{figure*}
- \subsection{Program Counters} \label{subsec:pc}
- In this subsection, program counter and their differences will be described.
- \subsubsection{RISC Program Counter}
- \begin{figure*}[h!]
- \centering
- \includegraphics[width=\linewidth]{../resources/risc_pc.eps}
- \caption{Digital diagram of RISC program counter}
- \label{fig:risc_pc}
- \end{figure*}
- Figure \ref{fig:risc_pc} represents the digital diagram for program counter. There are a few key features about this design: it can take values from memory for \texttt{RET} instruction; immediate value (\textit{PC\_IMM2} is shifted by 1 byte to allow \texttt{BEQ}, \texttt{BGT}, \texttt{BGE} instructions as first immediate byte used as ALU source B); can jump to interrupt address; produces \textit{pc\_halted} signal when memory is read (\texttt{RET} instruction takes 2 cycles, because cycle one fetches the address from stack and second cycle fetches the instruction from the instruction memory).
- \subsubsection{OISC Program Counter}\label{subsec:oisc_pc}
-
- OISC program counter is much simpler than RISC, as it does not have variable length instruction, delay flags instructions, or logic for selecting branch source address.
-
- \begin{colfigure}
- \centering
- \includegraphics[width=\linewidth]{../resources/oisc_pc.eps}
- \captionof{figure}{Digital diagram of OISC program counter}
- \label{fig:oisc_pc}
- \end{colfigure}
- Looking at Figure \ref{fig:oisc_pc} bottom, the basic operation is to just add one to previous program counter with \textit{ADDER1} and \textit{REG1}, reset it to zero at reset with \textit{MUX2}. Two destination logic blocks are used as accumulators to store branch address. Once instruction with BRZ destination is executed, \textit{EQ2} check if data bus value is zero, which enables \textit{MUX1} and overrides program counter to address stored in \texttt{BR0} and \texttt{BR1} accumulators. Unlike in RISC however, it requires three instructions to set new address and jump. Similarly, \textit{CALL} and \textit{RET} requires five and three instructions respectively. These RISC equivalent instructions are show in Listing \ref{code:oisc_jump}.
- \begin{blockpage}
- \begin{lstlisting}[frame=single, emph={JUMP, CALL, RET, return}, label=code:oisc_jump, caption={OISC assembly code emulating RISC \texttt{JUMP}, \texttt{CALL} and \texttt{RET} instructions.}]
- %macro JUMP 1
- BR1 %1 @1
- BR0 %1 @0
- BRZ 0x00
- %endmacro
- %macro CALL 1
- BR1 %1 @1
- BR0 %1 @0
- STACK %%return @1
- STACK %%return @0
- BRZ 0x00
- %%return:
- %endmacro
- %macro RET 0
- BR0 STACK
- BR1 STACK
- BRZ 0x00
- %endmacro
- \end{lstlisting}
- \end{blockpage}
- \subsection{Arithmetic Logic Unit}\label{subsec:alu}
- \begin{figure*}[b]
- \centering
- \includegraphics[scale=0.35]{../resources/oisc_alu.eps}
- \caption{Digital diagram of OISC partial ALU logic}
- \label{fig:oisc_alu}
- \end{figure*}
- This section will discuss ALU implementations of both processors. For fair comparison between OISC and RISC, ALU in both system will have the same capabilities described in table \ref{tab:alu_set}.
- \begin{blockpage}
- \arrayrulecolor{black}
- \begin{tabular}{| c | p{0.75\linewidth} |} \hline
- \rowcolor[rgb]{0.82,0.82,0.82}
- Name & Description \\\hline
- \arrayrulecolor[rgb]{0.82,0.82,0.82}
- ADD & Arithmetic addition (inc. carry) \\\hline
- SUB & Arithmetic subtraction (inc. carry) \\\hline
- AND & Bitwise AND \\\hline
- OR & Bitwise OR \\\hline
- XOR & Bitwise XOR \\\hline
- SLL & Shift left logical \\\hline
- SRL & Shift right logical \\\hline
- ROL & Shifted carry from previous SLL \\\hline
- ROR & Shifted carry from previous SRL \\\hline
- MUL & Arithmetic multiplication \\\hline
- DIV & Arithmetic division \\\hline
- MOD & Arithmetic modulus \\
- \arrayrulecolor[rgb]{0,0,0}\hline
- \end{tabular}
- \captionof{table}{\textit{Supported ALU commands for both processors}}
- \label{tab:alu_set}
- \end{blockpage}
- \subsubsection{OISC ALU}
- Due to the structure of OISC processor, ALU source A and B are two latches that are written into when \texttt{ALU0} or \texttt{ALU1} destination address is present. ALU sources are connected with every ALU operator and performed in single clock cycle. This value is stored in register so that it would immediately available in a next clock cycle as a source data. Figure \ref{fig:oisc_alu} represents logic diagram of ALU with only addition and multiplication operators present. Note that output of \textit{EQ3} is connected to enable of \textit{REG3}, enabling output of carry to be only read after \texttt{ADD} source is requested. This previous source memory is also used for \texttt{SUB}, \texttt{ROL} and \texttt{ROR} operations. This allows processor to perform other operations such as store or load values, before accessing carry bit, or carried byte for \texttt{ROL} and \texttt{ROR} operations.
- \subsubsection{RISC ALU}
- RISC processor has very similar structure to OISC with two exceptions. Inputs to ALU comes from logic router that decided how to route data in datapath. Output buffers are replaced by one multiplexer that selects single output from all ALU operations. Another point is that RISC ALU output is 16bit, higher byte saved in "ALU high byte register" for \texttt{MUL}, \texttt{MOD}, \texttt{ROL} and \texttt{ROR} operations. This register is accessible with \texttt{GETAH} instruction.
- \subsection{Program Memory}\label{subsec:memory}
- This section describes how instruction memory (ROM) is implemented for both processors.
- \begin{figure*}[b]
- \centering
- \includegraphics[scale=0.35]{../resources/risc_mem.eps}
- \caption{Digital diagram of RISC sliced ROM memory logic}
- \label{fig:risc_mem}
- \end{figure*}
- \subsubsection{RISC Program Memory}
- In order to allow dynamic instruction size from one to four bytes a special memory arrangement is made. A system was required to access word (8bits) from memory and next three words. To achieve this four ROM blocks been utilised, each containing one fourth of sliced original data. Input address is offset by adders \textit{ADDER1-3} and further divided by four by removing two least significant bits at \textbf{addr0-3}.
- Before concatenating output of each ROM block into final four bytes, ROM outputs \textbf{q0-3} are rearranged depending on \textbf{ar} signal. Note that \textit{MUX1-4} each input is different, this may be better visualised with Verilog code in listing \ref{code:rom_switch}.
- \begin{blockpage}
- \begin{lstlisting}[frame=single, language=Verilog, caption={RISC sliced ROM memory multiplexer arrangement Verilog code}, emph={ar, data}, label=code:rom_switch]
- case(ar)
- 2'b00: data={q3,q2,q1,q0};
- 2'b01: data={q0,q3,q2,q1};
- 2'b10: data={q1,q0,q3,q2};
- 2'b11: data={q2,q1,q0,q3};
- endcase
- \end{lstlisting}
- \end{blockpage}
- \subsubsection{OISC Program Memory}
- OISC instructions are fixed 13 bits, which causes different problems to RISC sliced memory - non-standard memory word size. To implement ROM in FPGA, Altera Cyclone IV M9K memory configurable blocks were used. Each blocks as 9kB of memory each allowing 1024x9bit configuration. Combining three of such blocks together yields 27bits if readable data in single clock cycle. To store instruction code to such configuration, pairs of instruction machine code sliced into three parts plus one bit for parity check, see figure \ref{fig:oisc_memory_slice}. Circuit extracting each instruction is fairly simple, shown in figure \ref{fig:oisc_mem}.
- \begin{figure*}[t]
- \begin{gather*}
- \overunderbraces{&\br{1}{ROM0}&\br{2}{ROM1}&\br{2}{ROM2}}%
- {&
- \colorbox{c1}{\scalebox{0.75}{00}}\,
- \colorbox{c1}{\scalebox{0.75}{01}}\,
- \colorbox{c1}{\scalebox{0.75}{02}}\,
- \colorbox{c1}{\scalebox{0.75}{03}}\,
- \colorbox{c1}{\scalebox{0.75}{04}}\,
- \colorbox{c1}{\scalebox{0.75}{05}}\,
- \colorbox{c1}{\scalebox{0.75}{06}}\,
- \colorbox{c1}{\scalebox{0.75}{07}}\,
- \colorbox{c1}{\scalebox{0.75}{08}}\,&
- \colorbox{c1}{\scalebox{0.75}{09}}\,
- \colorbox{c1}{\scalebox{0.75}{10}}\,
- \colorbox{c1}{\scalebox{0.75}{11}}\,
- \colorbox{c1}{\scalebox{0.75}{12}}\,&
- \colorbox{c2}{\scalebox{0.75}{13}}\,
- \colorbox{c2}{\scalebox{0.75}{14}}\,
- \colorbox{c2}{\scalebox{0.75}{15}}\,
- \colorbox{c2}{\scalebox{0.75}{16}}\,
- \colorbox{c2}{\scalebox{0.75}{17}}\,&
- \colorbox{c2}{\scalebox{0.75}{18}}\,
- \colorbox{c2}{\scalebox{0.75}{19}}\,
- \colorbox{c2}{\scalebox{0.75}{20}}\,
- \colorbox{c2}{\scalebox{0.75}{21}}\,
- \colorbox{c2}{\scalebox{0.75}{22}}\,
- \colorbox{c2}{\scalebox{0.75}{23}}\,
- \colorbox{c2}{\scalebox{0.75}{24}}\,
- \colorbox{c2}{\scalebox{0.75}{25}}\,&
- \colorbox{c3}{\scalebox{0.75}{26}}\,&
- }%
- {&\br{2}{InstrA}&\br{2}{InstrB}&\br{1}{parity}}
- \end{gather*}
- \caption{OISC three memory words composition. Number inside box represents bit index.}
- \label{fig:oisc_memory_slice}
- \end{figure*}
- \begin{figure*}[t]
- \centering
- \includegraphics[scale=0.4]{../resources/oisc_mem.eps}
- \caption{Digital diagram of OISC instruction ROM logic}
- \label{fig:oisc_mem}
- \end{figure*}
- \subsection{Instruction decoding}\label{subsec:imm_values}
- This section describes RISC and OISC differences between instruction decoding and immediate value handling.
- \subsubsection{RISC} \label{subsec:imo}
- Already described in previous section \ref{subsec:memory}, instruction from memory comes as 4 bytes. Least significant byte is sent to control block, other three bytes are sent to immediate override block (IMO) shown in figure \ref{fig:risc_imo}. These three bytes are labelled as \textbf{immr}.
- \begin{figure*}
- \centering
- \includegraphics[scale=0.4]{../resources/risc_imo.eps}
- \caption{Digital diagram of RISC immediate override system}
- \label{fig:risc_imo}
- \end{figure*}
- IMO block is a solution to change immediate value which enabled dynamically calculated memory pointers, branches dependant on register value or any other function that needs instruction immediate value been replaced by calculated register value. IMO is controlled by control block and \textbf{cdi.imoctl} signal, which is changed by \texttt{CI0}, \texttt{CI1} and \texttt{CI2} instructions. When signal is \texttt{0h}, this block is transparent connecting \textbf{immr} directly to \textbf{imm}. When any of \texttt{CI} instructions executed, one of IMO register is overridden by \textit{reg1} value from register file. In order to override two or three bytes of immediate, \texttt{CI} instructions need to be executed in order. Only for one next instruction after last \texttt{CI} will have immediate bytes changed depending on what are values in \textit{IMO} registers.
- \\This circuit has two disadvantages:
- \begin{enumerate}
- \item Overriding immediate bytes takes one or more clock cycles,
- \item At override, \textbf{immr} bytes are ignored therefore they are wasting instruction memory space.
- \end{enumerate}
- Second point can be resolved by designing a circuit that would subtract the amount of overridden IMO bytes from \textit{pc\_off} signal (program counter offset that is dependant on i-size value) at the program counter, thus effectively saving instruction memory space. This solution however would introduce a complication with the assembler as additional checks would need to be done during compiling to check if IMO instruction are used.
- \subsubsection{OISC}
- OISC immediate value is set in instruction decoder shown in figure \ref{fig:oisc_decoder}. Decoder operation is simple - instruction machine code is split into three parts as described in \ref{fig:oisc_machinecode}. If instruction source address is \texttt{00h}, connect data bus with constant 0 via \textit{MUX2}. If immediate bit is 1, set source address to \texttt{00h} (to make sure no other buffer source connects to data bus), and connect instruction source address (immediate value) to databus via \textit{MUX2} and \textit{BUF1}.
- \begin{figure*}
- \centering
- \includegraphics[scale=0.4]{../resources/oisc_decoder.eps}
- \caption{Digital diagram of OISC instruction decoder}
- \label{fig:oisc_decoder}
- \end{figure*}
- \subsection{Assembly}\label{subsec:assembly}
- There are two steps between assembly code and its execution on a processor. First it needs to be converted to binary machine code. Secondly, binary data needs to be sliced to different parts described in section \ref{subsec:memory}. These slices also need to be converted into appropriate formats, as simulation, HDL synthesis and flashing memory directly to FPGA memory, all use different formats.
- A universal assembler was implemented with python for both processors. Flowchart in figure \ref{fig:assembler} represents general structure of assembler process. It splits assembly file into three parts - sections, definitions and macros. Definitions are keywords mapped to values which are saved in global label dictionary. Macros are a chunk of assembly code and is used as templates.
- There are only two sections implemented in assembler - \texttt{.text} and \texttt{.data}. Section \texttt{.text} contains all machine instructions which will be stored in program ROM memory. Section \texttt{.data} is used for global and static data, and it will be written into RAM memory. This section contains values such as strings and structures uninitialised data as labels which data is RAM memory location.
- Section \texttt{.text} is processed line by line. Each has label, instruction name and instruction arguments. Label however is optional, if line contains it, label is saved to global label dictionary with program address. If line instruction name is a macro, line is replaces by macro and instruction arguments are used as macro arguments. Otherwise instruction name is decoded and stored in instruction list with original arguments.
- After all instruction lines are completed, each stored instruction arguments are processed, labels are replaced with binary values, any other processing is done such as addition by constant, byte selection, etc. Completed list is then saved as raw binary. Similarly, \texttt{.data} section labels also replaced and it is saved as binary data.
- \begin{colfigure}
- \centering
- \includegraphics[scale=0.4]{../resources/assembler.eps}
- \captionof{figure}{Flow chart of assember converting assembly code into machine code and memory binary.}
- \label{fig:assembler}
- \end{colfigure}
- \subsection{System setup}\label{subsec:setup}
- \colorbox{yellow}{\parbox{\columnwidth}{Description to be added. Include FPGA used, makefile, how programs are flashed into memory via JTAG and debugging tools}}
|