From 56b138ee24fcb2bdfab751d681c2f842cfb9e77b Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Thu, 15 Jun 2017 14:17:10 +0200 Subject: new documentation in z80upc.pdf --- doc/report/build.cmd | 4 - doc/report/build/notes.pdf | Bin 39689 -> 47404 bytes doc/report/build/z80uPC.pdf | Bin 29047 -> 970520 bytes doc/report/res/addrspace.pdf | Bin 6465 -> 7208 bytes doc/report/res/addrspace.svg | 83 ++--- doc/report/res/block_diagram.pdf | Bin 0 -> 23233 bytes doc/report/res/block_diagram.svg | 639 +++++++++++++++++++++++++++++++++++++++ doc/report/res/bus_displays.png | Bin 0 -> 7776 bytes doc/report/res/iospace.pdf | Bin 0 -> 6118 bytes doc/report/res/iospace.svg | 102 +++---- doc/report/res/logo_sam.pdf | Bin 0 -> 891254 bytes doc/report/z80uPC.tex | 290 +++++++++++++++++- 12 files changed, 1022 insertions(+), 96 deletions(-) delete mode 100644 doc/report/build.cmd create mode 100644 doc/report/res/block_diagram.pdf create mode 100644 doc/report/res/block_diagram.svg create mode 100644 doc/report/res/bus_displays.png create mode 100644 doc/report/res/iospace.pdf create mode 100755 doc/report/res/logo_sam.pdf diff --git a/doc/report/build.cmd b/doc/report/build.cmd deleted file mode 100644 index 3b4e8cd..0000000 --- a/doc/report/build.cmd +++ /dev/null @@ -1,4 +0,0 @@ -@echo off - - lualatex --output-directory=build notes.tex -pause \ No newline at end of file diff --git a/doc/report/build/notes.pdf b/doc/report/build/notes.pdf index b0f0ec4..6a70bd5 100644 Binary files a/doc/report/build/notes.pdf and b/doc/report/build/notes.pdf differ diff --git a/doc/report/build/z80uPC.pdf b/doc/report/build/z80uPC.pdf index 38b7bcd..6c5dd23 100644 Binary files a/doc/report/build/z80uPC.pdf and b/doc/report/build/z80uPC.pdf differ diff --git a/doc/report/res/addrspace.pdf b/doc/report/res/addrspace.pdf index 2689fca..96ac657 100644 Binary files a/doc/report/res/addrspace.pdf and b/doc/report/res/addrspace.pdf differ diff --git a/doc/report/res/addrspace.svg b/doc/report/res/addrspace.svg index 6af7e7f..0f73784 100644 --- a/doc/report/res/addrspace.svg +++ b/doc/report/res/addrspace.svg @@ -9,12 +9,12 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="210mm" - height="297mm" - viewBox="0 0 210 297" + width="180.64061mm" + height="257.56342mm" + viewBox="0 0 180.64061 257.56342" version="1.1" id="svg8" - inkscape:version="0.92.0 r" + inkscape:version="0.92.1 r" sodipodi:docname="addrspace.svg"> @@ -25,18 +25,22 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="0.47482464" - inkscape:cx="396.85039" - inkscape:cy="477.01822" + inkscape:zoom="0.33575172" + inkscape:cx="902.43963" + inkscape:cy="551.46623" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" showborder="false" - inkscape:window-width="1246" - inkscape:window-height="743" - inkscape:window-x="15" - inkscape:window-y="38" - inkscape:window-maximized="0" /> + inkscape:window-width="1266" + inkscape:window-height="763" + inkscape:window-x="5" + inkscape:window-y="28" + inkscape:window-maximized="0" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> @@ -52,7 +56,8 @@ + id="layer1" + transform="translate(52.640604,-39.436588)"> @@ -82,78 +87,80 @@ + y="44.92416" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.05277824px;font-family:'Roboto Mono';-inkscape-font-specification:'Roboto Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332" /> 0x0000 + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.05277824px;font-family:'Roboto Mono';-inkscape-font-specification:'Roboto Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:center;writing-mode:lr-tb;text-anchor:middle;stroke-width:0.26458332">0x0000 0x2000 0x4000 0x8000 0xFFFF + id="tspan4611" + x="-30.085047" + y="296.85013">0xFFFF 32KB RAM SPACE 8KB ROM + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + Z80CPU + + + ROM HIGH + + + ROM LOW + + + RAM + + + + D0-8 + + + A0-11 + + + MMU + + + A12-15 + + A12-15 + + CLKGenerators + + + + PIO + CTC + + + + + + + + + + + + + + + + + + + + + + + + + + USART + + MAX214 + + + + + + + + + + + + + + + + + + + + + + + + + + D0-3 + + + A0-1 + + A0-1 + + + diff --git a/doc/report/res/bus_displays.png b/doc/report/res/bus_displays.png new file mode 100644 index 0000000..941fa4f Binary files /dev/null and b/doc/report/res/bus_displays.png differ diff --git a/doc/report/res/iospace.pdf b/doc/report/res/iospace.pdf new file mode 100644 index 0000000..c1773fd Binary files /dev/null and b/doc/report/res/iospace.pdf differ diff --git a/doc/report/res/iospace.svg b/doc/report/res/iospace.svg index 750c51c..4438ed0 100644 --- a/doc/report/res/iospace.svg +++ b/doc/report/res/iospace.svg @@ -9,12 +9,12 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="210mm" - height="297mm" - viewBox="0 0 210 297" + width="152.99294mm" + height="262.63849mm" + viewBox="0 0 152.99294 262.63849" version="1.1" id="svg8" - inkscape:version="0.91 r13725" + inkscape:version="0.92.1 r" sodipodi:docname="iospace.svg"> @@ -25,18 +25,22 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="2.6860138" - inkscape:cx="135.42682" - inkscape:cy="112.15076" + inkscape:zoom="0.67150345" + inkscape:cx="420.75058" + inkscape:cy="512.06936" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" showborder="false" - inkscape:window-width="1920" - inkscape:window-height="1017" - inkscape:window-x="-8" - inkscape:window-y="-8" - inkscape:window-maximized="1" /> + inkscape:window-width="1266" + inkscape:window-height="763" + inkscape:window-x="5" + inkscape:window-y="28" + inkscape:window-maximized="0" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" /> @@ -45,14 +49,15 @@ image/svg+xml - + + id="layer1" + transform="translate(24.867916,-38.353672)"> - 0x4000 + y="236.93015" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;line-height:6.61000013;font-family:'Roboto Mono';-inkscape-font-specification:'Roboto Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start">0x4000 0x8000 + y="300.93015" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;line-height:6.61000013;font-family:'Roboto Mono';-inkscape-font-specification:'Roboto Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start">0x8000 0x6000 + id="tspan4159" + x="-25.317501" + y="268.93015" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;line-height:6.61000013;font-family:'Roboto Mono';-inkscape-font-specification:'Roboto Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start">0x6000 0x5000 + y="252.93015" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;line-height:6.61000013;font-family:'Roboto Mono';-inkscape-font-specification:'Roboto Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start">0x5000 0x7000 + id="tspan4227" + x="-25.317501" + y="284.93015" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;line-height:6.61000013;font-family:'Roboto Mono';-inkscape-font-specification:'Roboto Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start">0x7000 SERIAL + id="tspan4167" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.3499999px;line-height:6.61000013;font-family:'Roboto Mono';-inkscape-font-specification:'Roboto Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start">SERIAL diff --git a/doc/report/res/logo_sam.pdf b/doc/report/res/logo_sam.pdf new file mode 100755 index 0000000..b621307 Binary files /dev/null and b/doc/report/res/logo_sam.pdf differ diff --git a/doc/report/z80uPC.tex b/doc/report/z80uPC.tex index aa5d13c..5a4ec64 100644 --- a/doc/report/z80uPC.tex +++ b/doc/report/z80uPC.tex @@ -1,10 +1,296 @@ \documentclass[a4paper, 11pt, twoside]{article} +\usepackage{array} +\usepackage{float} +\usepackage{wrapfig} +% source code +\usepackage{listings} -\title{Z80 Single Board Computer Development} +% set correct hypenation +\usepackage[italian]{babel} + +% set margins +\usepackage[ + inner=2.5cm, + outer=2.5cm, + top=3cm, + bottom=3.75cm +]{geometry} + +% set headers +\usepackage{fancyhdr} +\pagestyle{fancyplain} +\fancyhf{} +\setlength{\headheight}{1.3cm} +\rhead{\includegraphics[height=1.25cm]{res/logo_sam}} +\lfoot{SAM 3E - Naoki Pross} +\rfoot{\thepage} + +% set font +\usepackage{fontspec} +\setmainfont{Roboto} +\setmonofont{Roboto Mono} + +% to fix macros +\usepackage{xspace} +% commands +% macro for project name +\newcommand{\prj}{Z80μPC\xspace} + +% invert signal (not, active low) +\newcommand{\inv}[1]{$\overline{\mbox{#1}}$} + +% metadata +\title{\vspace{-1cm}\texttt{\prj} Single Board \\ Computer Development } \author{Naoki Pross} +% document \begin{document} - \maketitle + +\maketitle +\begin{abstract} + Lo Zilog Z80 \`e un processore a 8 bit che fu introdotto nel 1976 che ebbe + un grandissimo successo nel mondo dell'elettronica e dell'informatica + nella fine del 20esimo secolo. In memoria di questo processore pioniere + dell'industria di sistemi embedded ho deciso di costruire un computer a + scopo generico intorno a questa piattaforma. L'obiettivo \`e di realizzare + una scheda programmabile con tutti i componenti necessari come ROM, RAM e + timers per far funzionare del software programmato se possibile sul + dispositivo stesso. +\end{abstract} + +\section{Specifiche tecniche dello Z80} +Lo Z80 \`e un processore molto minimalistico se paragonato a ci\`o che si +trova oggi sul mercato dei microcontrollori. Per il mio progetto ho deciso di +utilizzare il modello originale \texttt{Zilog Z8400} che non dispone di +sistemi integrati come i modelli SoC odierni. Le specifiche pi\`u importanti +sono elencate a seguire. + +\begin{itemize} + \item Architettura a 8 bit con bus a 16 bit con 64K indirizzi indirizzabili + \item Registri a 16 bit per {\tt SP,PC} e registri di utilizzo generico a + 8 bit {\tt A..F} combinabili a coppie {\tt AF,BC,..} per utilizzare + valori a 16 bit + \item Clock fino a 8 MHz + \item Segnali di controllo tra cui \texttt{\inv{RD}, \inv{WR}, + \inv{IOREQ}, \inv{MREQ}} e \texttt{\inv{RST}} + \item Interrupts mascherabili e non con vettore a 8 bit +\end{itemize} + +\section{Architettura di base} +Il minimo necessario per far funzionare un computer con lo Z80 sono una ROM e +una RAM, ma per il mio progetto ho scelto di aggiungere dell'hardware +aggiuntivo per lo sviluppo si sistemi pi\`u complessi per apprendere +conoscenze sia nel mondo dell'elettronica che dell'informatica. Per questa +ragione lo \prj possiede i seguienti componenti: + +\begin{center} +\begin{tabular}{ >{\tt}l >{\tt\bfseries}l p{.7\linewidth} } + % \hline \\ + ROM & M28C64 & EEPROM da 8KB x 8 bit (64K) per il BIOS / Bootloader / + OS installata doppia per avere 16KB \\ + RAM & HM62256B & SRAM da 32KB x 8bit (256K) \\ + CTC & Z8430 & Counter timer circuit ufficiale di Zilog a 4 canali che + permette di essere programmato \\ + PIO & Z8420 & Parallel input/output controller di Zilog per avere un + intefaccia digitale con due porte da 8 bit \\ + MMU & M4-32/32-15JC & CPLD programmabile che implementa una memory + management unit semplificata in grado di gestire i 5 + bit pi\`u significativi della linea di indirizzi \\ + USART & TL16C550C & Interfaccia USART per poter comunicare utilizzando il + protocollo RS232 +\end{tabular} +\end{center} + +Oltre a tutto ci\`o per uno scopo formativo lo \prj dispone anche di strumenti +da debug e analisi per comprendere ogni operazione del processore. Il modello +di Z80 scelto \`e in grado di utilizzare un clock fino a 8MHz, ma non +definisce un minimo dunque sono presenti 3 circuiti che generano 3 clock di +velocit\`a differenti. + +\begin{center} +\begin{tabular}{ >{\bfseries}r p{.8\linewidth} } + 0Hz & Questo clock \`e un bottone che permette di creare + manualmente le pulsazioni del clock, per poter analizzare + ogni istruzione \\ + 200Hz & Mediante un classico circuito con un LM555 si ha un clock da + 200Hz per eseguire i programmi a velocit\`a rallentata \\ + 4MHz & Clock per esecuzione a velocit\`a piena (normale) +\end{tabular} +\end{center} + +Una seconda disposizione per aiutare la comprensione del funzionamento del +processore \`e data da 6 display a 7 segmenti che durante l'esecuzione +rallentata o a step (bottone) visualizzano i bytes presenti sulla bus di +indirizzi a 16 bit e sul bus di dati a 8 bit. + +\begin{figure}[!h] \centering + \includegraphics[width=\linewidth]{res/bus_displays} + \caption{Display a 7 segmenti per visualizzare il flusso di dati della + CPU} +\end{figure} + +\section{Memory Management Unit} + +Alcuni modelli successori dello Z8400 implementavano una MMU SoC che +permetteva di indirizzare un address space di dimensione maggiore. Per lo \prj +non necessito di un indirizzamento pi\`u grande ma piuttosto sono interessato +dalle operazioni di gestione della memoria di una MMU simile a ci\`o che +accade nelle architetture X86. Nelle architetture odierne basate sull'X86/64 +\`e presente un sistema di traslazione di indirizzi di memoria da virtuale a +fisica. Con lo scopo di trarne solamente i vantaggi pi\`u fondamentali lo \prj +implementa nella CPLD MMU un sistema basilare di gestione di pagine di memoria +con traslazione di indirizzi in modo da poter allocare pi\`u programmi nella +RAM anche se il sistema non implementa il multitasking. + +% TODO: write about this in more details + +\subsection{Address Space} + +\begin{wrapfigure}{r}{.4\linewidth} \centering + \vspace{8mm} + \includegraphics[width=.9\linewidth]{res/addrspace} + \vspace{4mm} + \caption{Address space dello \prj} +\end{wrapfigure} +La funzione primaria della MMU \`e di mappare i dispositivi I/O e le memorie +nell'address space. Nell'implementazione reale la MMU controlla i segnali {\tt +\inv{CS}} seguendo una logica combinatoria molto semplice che controlla se +l'indirizzo sul bus si trova in una zona definita per un dispositivo. +L'address space si presenta dunque nella seguente maniera, per cui la ROM +occupa il primo quarto, i dispositivi mappabili il secondo quarto e la RAM la +met\`a restante. Essendo un progetto pensato per essere esteso 16KB sono +liberi per mappare dispositivi esterni collegati attraverso il connettore +DIN41612. + +% \begin{wrapfigure}{l}{.4\linewidth} \centering +% \includegraphics[width=.8\linewidth]{res/iospace} +% \end{wrapfigure} + +\subsection{Page Table} + +Per poter controllare la traslazione degli indirizzi la MMU dispone di una +Page Table a cui \`e possibile accedere attraversso un certo indirizzo +nell'I/O space. La page table di 5 bit permette la gestione delle regioni di +memoria da impostare per dei determinati processi. Questa funzione \`e +importante perch\`e permette la separazione dello stack e della memoria della +kernel dai programmi normali. Per lo \prj potrebbe sembrare eccessivo ma +essendo uno strumento per apprendere le fondamenta dell'elettronica e +dell'informatica \`e interessante implementare questa funzionalit\`a che +comunque se necessario pu\`o essere disabilitata. + +\section{Schema a blocchi} + +\begin{figure}[!h] \centering + \includegraphics[width=.85\linewidth]{res/block_diagram} +\end{figure} + +\section{Software / Sistema operativo} + +Negli sviluppi pi\`u recenti intorno allo Z80 esso veniva utilizzato come un +microcontrollore anzich\`e come processore da computer, per questa ragione non +sono presenti molti sistemi operativi per questa piattaforma. Dunque per lo +\prj il progetti implementa un sistema operativo soprannominato {\tt +HelvetiOS} con le funzioni minime necessarie come un interfaccia seriale a +comandi e un meccanismo per caricare i programmi. + +\subsection{Componenti di base} + +Per garantire un funzionamento minimo il sistema {\tt HelvetiOS} deve offrire +drivers e utility di base quali: + +\begin{center} +\begin{minipage}[t]{.4\linewidth} + \begin{itemize} + \item USART driver and API + \item PIO driver and API + \item CTC driver and API + \end{itemize} +\end{minipage}% +\begin{minipage}[t]{.4\linewidth} + \begin{itemize} + \item Bootloader + \item Program launcher + \item Shell-like interface + \end{itemize} +\end{minipage} +\end{center} + +\subsection{Interfacce dell'API} + +\subsubsection{USART} +\begin{lstlisting}[language=C, basicstyle=\ttfamily] +void usart_set_baudrate(uint16_t baudrate); +void usart_set_parity(int mode); +void usart_set_stop_bits(int count); +void usart_set_word_length(int length); +void usart_set_autoflow(int mode); + +inline void usart_init(uint16_t baudrate, int parity, int stop_bits); + +void usart_transmit(uint8_t data); +uint8_t usart_receive(); + +int usart_write(uint8_t *data, size_t size); +int usart_read(uint8_t *buffer, size_t count); +\end{lstlisting} + +% \subsection{PIO} + +\subsection{Toolchain per la compilazione} + +Per compilare il software del progetto si utilizza SDCC, un progetto +open-source che supporta la compilazione di binari per l'architettura dello +Z80. Nella mia configurazione utilizzo GNU make con il seguente makefile. + +\newpage +\begin{lstlisting}[language=make, numbers=left, basicstyle=\ttfamily] +#### +# Source code settings +# +OSNAME := helvetiOS + +CSOURCES := $(wildcard kernel/*.c) $(wildcard libc/*.c) +OBJECTS := $(patsubst %.c,build/%.rel,$(CSOURCES)) +HEXFILE := build/$(OSNAME).hex +BINARY := build/$(OSNAME).bin + +### +# Compiler settings + +CC := sdcc + +CFLAGS := -mz80 \ + -I kernel/include -I libc/include -DDEBUG + +LDFLAGS := -mz80 --no-std-crt0 crt0.rel \ + --code-loc 0x0800 --data-loc 0x8000 + +.PHONY: dirs dis clean +all: $(BINARY) + +# build binary +$(BINARY): $(OBJECTS) dirs + $(CC) $(LDFLAGS) $(OBJECTS) -o $(HEXFILE) + xxd -r -p $(HEXFILE) $(BINARY) + +$(OBJECTS): build/%.rel : %.c $(CSOURCES) dirs crt0.rel + $(CC) $(CFLAGS) -c $< -o $@ + +crt0.rel: crt0.s + sdasz80 -o $< + +dirs: + mkdir -p build build/kernel build/libc + +dis: $(BINARY) + z80dasm -a -g 0h $< -o $(OSNAME).s + +clean: + - rm -rd build/* + - rm $(OSNAME).s + - rm crt0.rel +\end{lstlisting} + \end{document} -- cgit v1.2.1