From 0a5c9862bef6ea68e05213f3d097de90e85f0087 Mon Sep 17 00:00:00 2001 From: prot Date: Thu, 11 Mar 2004 21:54:51 +0000 Subject: . --- 2004/n/fpga/doc/dossierconception/Makefile | 18 + 2004/n/fpga/doc/dossierconception/image.png | Bin 0 -> 18419 bytes .../fpga/doc/dossierconception/images/rxserie.pdf | Bin 0 -> 14895 bytes .../fpga/doc/dossierconception/images/txserie.pdf | Bin 0 -> 15083 bytes 2004/n/fpga/doc/dossierconception/io.c | 171 +++++++++ 2004/n/fpga/doc/dossierconception/io.h | 15 + 2004/n/fpga/doc/dossierconception/ov6620.fig | 200 +++++++++++ 2004/n/fpga/doc/dossierconception/ovcam.c | 47 +++ 2004/n/fpga/doc/dossierconception/ovcam.tex | 120 +++++++ 2004/n/fpga/doc/dossierconception/ovcam1.fig | 67 ++++ 2004/n/fpga/doc/dossierconception/ovcam2.fig | 140 ++++++++ 2004/n/fpga/doc/dossierconception/portserie.tex | 392 +++++++++++++++++++++ 2004/n/fpga/doc/dossierconception/rapport.tex | 68 ++++ 2004/n/fpga/doc/dossierconception/rdcam.c | 124 +++++++ 2004/n/fpga/doc/dossierconception/rdcam.h | 18 + 15 files changed, 1380 insertions(+) create mode 100644 2004/n/fpga/doc/dossierconception/Makefile create mode 100644 2004/n/fpga/doc/dossierconception/image.png create mode 100644 2004/n/fpga/doc/dossierconception/images/rxserie.pdf create mode 100644 2004/n/fpga/doc/dossierconception/images/txserie.pdf create mode 100644 2004/n/fpga/doc/dossierconception/io.c create mode 100644 2004/n/fpga/doc/dossierconception/io.h create mode 100644 2004/n/fpga/doc/dossierconception/ov6620.fig create mode 100644 2004/n/fpga/doc/dossierconception/ovcam.c create mode 100644 2004/n/fpga/doc/dossierconception/ovcam.tex create mode 100644 2004/n/fpga/doc/dossierconception/ovcam1.fig create mode 100644 2004/n/fpga/doc/dossierconception/ovcam2.fig create mode 100644 2004/n/fpga/doc/dossierconception/portserie.tex create mode 100644 2004/n/fpga/doc/dossierconception/rapport.tex create mode 100644 2004/n/fpga/doc/dossierconception/rdcam.c create mode 100644 2004/n/fpga/doc/dossierconception/rdcam.h (limited to '2004/n/fpga/doc') diff --git a/2004/n/fpga/doc/dossierconception/Makefile b/2004/n/fpga/doc/dossierconception/Makefile new file mode 100644 index 0000000..221bd36 --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/Makefile @@ -0,0 +1,18 @@ +SUBDIR= + +all: ovcam2.pdf ov6620.pdf + for i in $(SUBDIR); do (cd $$i; $(MAKE) all); done + $(MAKE) rapport.pdf + +%.pdf: %.tex + pdflatex $< + pdflatex $< + pdflatex $< + +%.pdf: %.fig + fig2dev -L pdf -p dummy $< $@ + +clean: + for i in $(SUBDIR); do (cd $$i; $(MAKE) clean); done + rm -f *.dvi *.aux *.log *.toc *.eps *.pdf *.ps + diff --git a/2004/n/fpga/doc/dossierconception/image.png b/2004/n/fpga/doc/dossierconception/image.png new file mode 100644 index 0000000..130b1f4 Binary files /dev/null and b/2004/n/fpga/doc/dossierconception/image.png differ diff --git a/2004/n/fpga/doc/dossierconception/images/rxserie.pdf b/2004/n/fpga/doc/dossierconception/images/rxserie.pdf new file mode 100644 index 0000000..0606476 Binary files /dev/null and b/2004/n/fpga/doc/dossierconception/images/rxserie.pdf differ diff --git a/2004/n/fpga/doc/dossierconception/images/txserie.pdf b/2004/n/fpga/doc/dossierconception/images/txserie.pdf new file mode 100644 index 0000000..4a2f3b9 Binary files /dev/null and b/2004/n/fpga/doc/dossierconception/images/txserie.pdf differ diff --git a/2004/n/fpga/doc/dossierconception/io.c b/2004/n/fpga/doc/dossierconception/io.c new file mode 100644 index 0000000..0fd6d21 --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/io.c @@ -0,0 +1,171 @@ +/* io.c contient la procedure pour configurer la camera + * (I2C) + */ + +#include "io.h" +#include + +#include +#include + +#define I2CCLK BITN(3) +#define I2CDATA BITN(4) + +void +i2c_init (void) +{ + // 1 ---> ouput + // 0 ---> input + // configuration des lignes en sortie + _io_ports[M6811_DDRA] = I2CCLK | I2CDATA; + // mise à 1 des lignes dans (libération du bus + _io_ports[M6811_PORTA] |= I2CCLK |I2CDATA; +} + +/* + * Start procedure + * Data ---------------\________________ + * Clk --------------------\___________ + * + */ + +void +i2c_start(void) +{ + _io_ports[M6811_PORTA] &= ~I2CDATA; + wait_2v5us(); + _io_ports[M6811_PORTA] &= ~I2CCLK; + wait_2v5us(); +} +/* + * End procedure + * Data ___________________/----- + * Clk _________/--------------- + * + */ + +void +i2c_end(void) +{ + _io_ports[M6811_PORTA] |= I2CCLK; + wait_2v5us(); + _io_ports[M6811_PORTA] |= I2CDATA; + wait_2v5us(); +} + + void +wait_2v5us(void) +{ + unsigned char i; + for (i=0;i<200;i++) + { + __asm__("nop"); + } +} + +void +i2c_send_charnl (unsigned char data) +{ + unsigned char cmpt; + for (cmpt=0;cmpt<8;cmpt++) + { + if (data & 0x80) // si le bit de poids fort est 1, il faut mettre 1 sur la ligne + { + _io_ports[M6811_PORTA] |= I2CDATA; + } + else + { + _io_ports[M6811_PORTA] &= ~I2CDATA; + } + wait_2v5us(); + wait_2v5us(); + // on s'occupe de produire un front d'horloge + _io_ports[M6811_PORTA] |= I2CCLK; + wait_2v5us(); + _io_ports[M6811_PORTA] &= ~I2CCLK; + wait_2v5us(); + _io_ports[M6811_PORTA] &= ~I2CDATA; + /* Nous avons traité le bit de poid le plus fort + * continuons */ + data = data << 1; + } + wait_2v5us(); + _io_ports[M6811_PORTA] |= I2CCLK; + wait_2v5us(); + _io_ports[M6811_PORTA] &= ~I2CCLK; + wait_2v5us(); +} + +unsigned char +i2c_read_char (void) +{ + char cmpt; + unsigned char data = 0; + // configuration de la ligne data en entré + _io_ports[M6811_DDRA] &= ~I2CDATA; + for (cmpt=0; cmpt<8;cmpt++) + { + _io_ports[M6811_PORTA] |=I2CCLK; + wait_2v5us(); + _io_ports[M6811_PORTA]; + if (_io_ports[M6811_PORTA] & I2CDATA) //si ligne data est à 1 + data++; + wait_2v5us(); + _io_ports[M6811_PORTA] &=~I2CCLK; + wait_2v5us(); + data = data<<1; + } + // traitement de l'ack dans le cas d'une derniere lecture + _io_ports[M6811_DDRA] |= I2CDATA; + _io_ports[M6811_PORTA] |= I2CDATA; + wait_2v5us(); + _io_ports[M6811_PORTA] |= I2CCLK; + wait_2v5us(); + _io_ports[M6811_PORTA] &= ~I2CCLK; + wait_2v5us(); + _io_ports[M6811_PORTA] &= ~I2CDATA; + return data; +} + +void +i2c_send (unsigned char reg,unsigned char data) +{ + // on déclanche un procedure de start + i2c_start(); + // C0 est l'adresse d'ecriture de l'ov6620 + i2c_send_charnl(0xc0); + // On specifie le registre + i2c_send_charnl(reg); + // on donnee la valeur + i2c_send_charnl(data); + // procedure de stop + i2c_end(); +} + +unsigned char +i2c_recv(unsigned char reg) +{ + unsigned char data; + + /* pour lire un registre particulié, il faut commencer par + * ecrire le registre que l'on veut lire + */ + + i2c_start(); + i2c_send_charnl(0xc0); + i2c_send_charnl(reg); + i2c_end(); + + + i2c_start(); + i2c_send_charnl(0xC1); + data = i2c_read_char(); + i2c_end(); + return data; + +} + +void +i2c_dump(unsigned char * tab) +{ +} diff --git a/2004/n/fpga/doc/dossierconception/io.h b/2004/n/fpga/doc/dossierconception/io.h new file mode 100644 index 0000000..8ea9221 --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/io.h @@ -0,0 +1,15 @@ +#ifndef IO_H +#define IO_H + +#define BITN(x) (1<<(x)) + +void i2c_init (void); +void i2c_send_charnl (unsigned char mot); +unsigned char i2c_read_char (void); +void i2c_start (void); +void i2c_end (void); +void wait_2v5us (void); +void i2c_send (unsigned char reg, unsigned char data); +unsigned char i2c_recv ( unsigned char reg); +void i2c_dump (unsigned char * tab); +#endif diff --git a/2004/n/fpga/doc/dossierconception/ov6620.fig b/2004/n/fpga/doc/dossierconception/ov6620.fig new file mode 100644 index 0000000..bd11f82 --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/ov6620.fig @@ -0,0 +1,200 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +0 32 #c6b694 +0 33 #eff7ff +0 34 #decba5 +0 35 #424142 +0 36 #848284 +0 37 #bdbebd +0 38 #dedfde +0 39 #8c8e8c +0 40 #adaaad +0 41 #525552 +0 42 #424142 +0 43 #848284 +0 44 #bdbebd +0 45 #848284 +0 46 #bdbebd +0 47 #dedfde +0 48 #8c8e8c +0 49 #8c8e8c +0 50 #424142 +0 51 #848284 +0 52 #bdbebd +0 53 #dedfde +0 54 #424142 +0 55 #848284 +0 56 #bdbebd +0 57 #dedfde +0 58 #848284 +0 59 #bdbebd +0 60 #dedfde +0 61 #c6b694 +0 62 #eff7ff +0 63 #decba5 +0 64 #c6b694 +0 65 #eff7ff +0 66 #decba5 +0 67 #adaaad +0 68 #525552 +0 69 #8c8e8c +0 70 #d6d7d6 +0 71 #8c8e8c +0 72 #424142 +0 73 #848284 +0 74 #bdbebd +0 75 #dedfde +0 76 #adaead +0 77 #424142 +0 78 #848284 +0 79 #bdbebd +0 80 #dedfde +0 81 #848284 +0 82 #bdbebd +0 83 #dedfde +0 84 #424142 +0 85 #848284 +0 86 #bdbebd +0 87 #adaead +0 88 #8c8e8c +0 89 #8c8e8c +0 90 #8c8e8c +0 91 #424142 +0 92 #bdbebd +0 93 #dedfde +0 94 #424142 +0 95 #848284 +0 96 #bdbebd +0 97 #8c8e8c +0 98 #424142 +0 99 #848284 +0 100 #bdbebd +0 101 #dedfde +0 102 #424142 +0 103 #848284 +0 104 #bdbebd +0 105 #dedfde +0 106 #bdbebd +0 107 #525152 +0 108 #e7e3e7 +0 109 #00004a +0 110 #525152 +0 111 #bdbebd +0 112 #7b797b +0 113 #313431 +0 114 #525152 +0 115 #bdbebd +0 116 #7b797b +0 117 #313431 +0 118 #525152 +0 119 #424142 +0 120 #c6b694 +0 121 #bdbebd +0 122 #7b797b +0 123 #313431 +0 124 #525152 +0 125 #313431 +0 126 #525152 +0 127 #8c8e8c +0 128 #424542 +0 129 #8c8e8c +0 130 #bdbebd +0 131 #7b797b +0 132 #313431 +0 133 #525152 +0 134 #bdbebd +0 135 #7b797b +0 136 #313431 +0 137 #525152 +0 138 #7b797b +0 139 #313431 +0 140 #525152 +0 141 #424142 +0 142 #848284 +0 143 #bdbebd +0 144 #dedfde +0 145 #c6c3c6 +0 146 #6b6d6b +0 147 #c6c3c6 +0 148 #6b6d6b +0 149 #424542 +0 150 #8c8e8c +0 151 #6b6d6b +0 152 #8c8e8c +0 153 #737173 +0 154 #adaead +0 155 #313431 +0 156 #949294 +0 157 #737173 +0 158 #525552 +0 159 #b5b2b5 +0 160 #c6c3c6 +0 161 #424542 +0 162 #6b6d6b +0 163 #424542 +0 164 #6b6d6b +0 165 #c6c3c6 +0 166 #6b6d6b +0 167 #424542 +0 168 #8c8e8c +0 169 #c6c3c6 +0 170 #6b6d6b +0 171 #c6c3c6 +0 172 #424542 +0 173 #8c8e8c +# Camcorder +# drawn by W. Chimiak +6 1275 2400 2250 3675 +6 1504 2963 1952 3400 +1 2 0 1 -1 7 2 0 0 0.000 1 0.0000 1728 3182 224 219 1504 2963 1952 3400 +-6 +1 4 0 1 -1 7 0 0 20 0.000 1 0.0000 1839 3262 238 238 1814 3026 1864 3499 +1 4 0 1 -1 150 1 0 20 0.000 1 0.0000 1837 3262 338 338 1499 2924 2175 3600 +2 3 0 1 -1 149 4 0 20 0.000 0 0 -1 0 0 5 + 2015 3475 2015 2794 1462 2794 1459 3475 2015 3475 +2 3 0 1 0 148 4 0 20 0.000 0 0 -1 0 0 5 + 2015 2798 1455 2798 1275 2438 1775 2438 2015 2798 +2 3 0 1 0 7 4 0 20 0.000 1 0 -1 0 0 5 + 1463 2794 1283 2442 1283 3072 1465 3470 1463 2794 +2 2 0 1 -1 7 3 0 5 0.000 0 0 -1 0 0 5 + 1515 2918 1965 2918 1965 3371 1515 3371 1515 2918 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 600 1800 3000 1800 3000 4350 600 4350 600 1800 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 1800 825 1800 1800 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 1575 5775 1575 4350 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 3000 2625 4200 2625 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 3000 3075 4200 3075 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 3000 3525 4125 3525 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 3000 3900 4200 3900 +4 0 0 50 -1 0 12 0.0000 4 135 1950 750 2025 Carte d'\351valuation ov6620\001 +4 0 0 50 -1 0 12 0.0000 4 135 225 1950 825 5V\001 +4 0 0 50 -1 0 12 0.0000 4 180 1260 1725 5175 configuration via\001 +4 0 0 50 -1 0 12 0.0000 4 135 270 1725 5400 I2C\001 +4 0 0 50 -1 0 12 0.0000 4 180 900 3225 3450 Vsync_cam\001 +4 0 0 50 -1 0 12 0.0000 4 180 750 3225 3000 Href_cam\001 +4 0 0 50 -1 0 12 0.0000 4 180 735 3225 2550 Pclk_cam\001 +4 0 0 50 -1 0 12 0.0000 4 180 1140 3225 3825 data_cam [7-0]\001 +4 0 0 50 -1 0 12 0.0000 4 180 5490 4575 2550 L'horloge, \340 chaque front montant les donn\351es sur data_cam sont valides\001 +4 0 0 50 -1 0 12 0.0000 4 180 4950 4575 3000 L'orsque c'est 1 \340 chaque Pclk_cam correspond un pixel d'un ligne\001 +4 0 0 50 -1 0 12 0.0000 4 180 2835 4575 3375 Passe \340 1 lorsque l'on change d'image\001 +4 0 0 50 -1 0 12 0.0000 4 135 2295 4575 3825 donn\351e de la camera sur 8 bits\001 diff --git a/2004/n/fpga/doc/dossierconception/ovcam.c b/2004/n/fpga/doc/dossierconception/ovcam.c new file mode 100644 index 0000000..f5ddfd8 --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/ovcam.c @@ -0,0 +1,47 @@ +/* Programme ovcam.c pour 68hc11f1 + * compile avec gcc pour 68HC11 et la librairy GEL + */ + +#include +#include +#include +#include "io.h" +#include "rdcam.h" + +int main (void); + +void +_start (void) +{ + set_bus_expanded (); + _io_ports[M6811_CSCTL] &= 1<<3; + main(); +} + +unsigned char tab[25344]; + +int +main (void) +{ + int i, j, k; + + serial_init (); + i2c_init(); + cam_init(); + /*configuration*/ + i2c_send(0x12,0x80); + i2c_send(0x11,0x3f); + //i2c_send(0x12,0x26); + cam_skip_frames (2); + /*attrappe l'image et l'envoie*/ + for (i = 0; i < 4; i++) + { + for(j=0;j<25344;j++) + tab[j] = 0; + cam_get(tab, i); + for(j=0;j<25344;j++) + serial_send (tab[j]); + } + while(1); + return 0; +} diff --git a/2004/n/fpga/doc/dossierconception/ovcam.tex b/2004/n/fpga/doc/dossierconception/ovcam.tex new file mode 100644 index 0000000..b686b02 --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/ovcam.tex @@ -0,0 +1,120 @@ + +\section{Gestion de la caméra} +u + +\subsection{Comment fonctionne la caméra ?} + +La camera produit un flot de donnée incessant. elle fournit aussi des +signaux de synchronisation. Ceux-ci nous permettent de savoir quand est-ce +qu'une nouvelle image commence, quand est-ce que l'on change de ligne. De +cette manière nous pouvons reconstitué une information cohérente avec +notre vision. + +\begin{figure}[htbp] +\caption{La camera} +\includegraphics[width=\textwidth]{ov6620.pdf} +\label{schema1} +\end{figure} + +Pour vérifier que nous avions bien compris le fonctionnement de la camera, +nous avons écrit un programme pour micro-contrôleur qui saisie une image. + +Pour réaliser cette application teste, nous avons utilisé une carte à base +de 68HC11F1 à 8MHz doté de 64Ko de mémoire. Voici le résultat: figure +\ref{image_test} page \pageref{image_test}. + +\begin{figure}[htbp] +\caption{L'image test} +\includegraphics[]{image.png} +\label{image_test} +\end{figure} + +Pour obtenir cette image nous avons écrit un programme en C avec gcc pour +68HC11. Ce programme prend 72 lignes d'une première image puis les envoie +à l'ordinateur à 9600 baud (c'est très lent) puis attend une nouvelle +image, saute les 72 premières lignes et enregistre les 72 lignes +suivantes puis les envoie. Ainsi de suite 4 fois par image car Le +microcontroleur n'a pas assez de mémoire pour enregistrer l'image entière. +Il faut donc la "tronçonner". En effet l'image fait normalement 352 +par 288 pixel et chaque pixel est codé sur 8 bits. + +La caméra dispose d'un réglage de gain automatique c'est pour cela que les 4 +parties ont des contrastes différents. + +Bien que l'on ait ralenti au maximum la fréquence de Pclk, nous +n'arrivons à obtenir que 72 point par lignes au lieu de 288. +Comme l'image reste "compréhensible" nous pouvons croire que le +microcontroleur n'est pas assez rapide pour lire plus de points. Et du +coups il fait un "sample régulié" de la ligne, ce qui nous donne cette +impression d'image comprimé en largeur. + +Tout ceci nous laisse croire que nous maitrisons la capture d'une image. + +\subsection{Comment implémenter la récupération d'image dans un fpga ?} + +Le principe utilisé est simple, il s'agit de remplir une mémoire avec les +données provenant de la caméra. Un compteur peut incrémenté l'adresse et +ainsi parcourir la mémoire. Nous allons utilisé les macros que fournit +Xilinx pour réaliser des DPRAMs : qui sont des mémoires ram à double +ports, permettant une lecture et une écriture sur deux ports differents. + +Nous utiliserons 2 DPRAM afin que l'ordinateur puisse lire un bank mémoire +alors que l'automate de récupartion de donnée caméra en remplit un autre. + +\begin{figure}[htbp] +\caption{Synopitque d'implémentation} +\includegraphics[width=\textwidth]{ovcam2.pdf} +\label{ovcam} +\end{figure} + +Ce système est ordonné par un séquenceur. Cette machine d'état aura la +charge de choisir le bank à remplir, la gestion de la ligne d'interruption +( moyen d'avertir d'ordinateur pour qu'il vienne lire) et le registre de +contrôle avec ses quelques bits: +\begin{itemize} +\item Un bit disant quel bank doit être lu. +\item Un bit disant si l'interruption est levé, c'est dire si le bit +précédant est valide. +\item Un bit disant s'il y a eu un écrasement d'un bank, dans le cas ou +l'ordinateur ne serait pas venu suffsament tôt. +\item un bit de reset pour remettre à zero la machine d'état les diffrents +compteurs et convertisseur. +\item Un bit servant à dire que l'odinateur va bientot lire un bank et +donc, que le sequenceur doit baissé sa ligne d'interruption. Cette +dernière fonction pourrait être remplacer par un système qui détecte la +lecture du bank. +\end{itemize} + + +D'autres indicateurs pourraient être donné, par exemple : un flag pourrait se +levé pour marqué que le bank de remplissage est déjà à moitier rempli. + +\subsection{Le driver} + +Avec le fonctionnement décrit si dessus, Le driver devra réaliser la +sous-routine suivante: +\begin{itemize} +\item Détecter une interruption camera +\item Lire le registre de la camera pour savoir si il y a bien eu une +interruption, et connaitre le bank à lire. +\item Ecrire dans le registre le bit correspondant à "lecture imminante" +\item Lire le bank, le placé en mémoire, incrémenté une variable. Lorsque +cette variable sera égal à 50, l'ordinateur aura récupéré une image +complete. +\end{itemize} + +Bien sûr, si la cadence des images est trop rapproché dans le temps, Une +fois que l'on a récupérer une image complete, on peut ne pas écrire le bit +"lecture imminante", ce qui aura pour conséquence de ne pas baissé la +ligne d'interruption et de ne plus être déranger. +Pour reprendre la capture, il suffit de faire un reset avec le bit prévu +dans le registre de controle. +\pagebreak + +\section{Réalisation de la carte } + +La principale difficulté provient du logiciel. Toutes fois cela avance, +à en voir les documents produits. Ceux-ci encore tres incomplet. Toutes +fois ils permettent de déceller les premières grosses erreurs. + + diff --git a/2004/n/fpga/doc/dossierconception/ovcam1.fig b/2004/n/fpga/doc/dossierconception/ovcam1.fig new file mode 100644 index 0000000..8fb8bb4 --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/ovcam1.fig @@ -0,0 +1,67 @@ +#FIG 3.2 +Portrait +Flush left +Metric +A4 +100.00 +Single +-2 +1200 2 +2 2 0 1 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 1425 1200 3325 1200 3325 2138 1425 2138 1425 1200 +2 2 0 1 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 1438 2375 3313 2375 3313 3313 1438 3313 1438 2375 +2 2 0 1 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 6637 4013 8287 4013 8287 6151 6637 6151 6637 4013 +2 2 0 1 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 6625 1400 8275 1400 8275 3538 6625 3538 6625 1400 +2 2 0 1 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 1438 4025 4025 4025 4025 6375 1438 6375 1438 4025 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 3338 1888 6613 1888 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 5450 1913 5450 4725 6638 4725 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 250 1888 1438 1888 1425 1888 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 3313 2825 6638 2825 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 1 + 5200 2838 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 5200 2813 5200 5175 6638 5175 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 238 1425 1425 1425 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 250 4263 1438 4263 1425 4275 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 238 4725 1425 4725 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 225 5200 1438 5200 1413 5200 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 1886 4013 1886 3322 1894 3322 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 2833 3330 2833 4013 2833 4028 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 5 + 1545 4005 1545 3648 1094 3648 1094 2010 1413 2010 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 248 2833 1428 2833 1335 2724 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1420 2833 1343 2934 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1420 1420 1343 1327 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1420 1428 1358 1521 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1413 1878 1343 1762 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1413 1894 1343 1948 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1428 4253 1312 4145 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1428 4261 1319 4346 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1420 4727 1343 4626 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1413 4735 1327 4789 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1428 5192 1327 5076 diff --git a/2004/n/fpga/doc/dossierconception/ovcam2.fig b/2004/n/fpga/doc/dossierconception/ovcam2.fig new file mode 100644 index 0000000..beb374d --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/ovcam2.fig @@ -0,0 +1,140 @@ +#FIG 3.2 +Portrait +Flush left +Metric +A4 +100.00 +Single +-2 +1200 2 +0 32 #636163 +0 33 #cecbce +0 34 #cecbce +0 35 #6b6d6b +# Right brace +6 8370 2206 8910 9405 +3 4 0 1 0 7 50 0 -1 0.000 0 0 0 7 + 8370 9405 8640 9405 8640 5806 8910 5806 8640 5806 8640 2206 + 8370 2206 + 0.000 1.000 1.000 0.000 1.000 1.000 0.000 +-6 +2 2 0 1 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 1425 1200 3325 1200 3325 2138 1425 2138 1425 1200 +2 2 0 1 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 1438 2375 3313 2375 3313 3313 1438 3313 1438 2375 +2 2 0 1 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 6637 4013 8287 4013 8287 6151 6637 6151 6637 4013 +2 2 0 1 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 6625 1400 8275 1400 8275 3538 6625 3538 6625 1400 +2 2 0 1 0 7 50 0 -1 4.000 0 0 7 0 0 5 + 1438 4025 4025 4025 4025 6375 1438 6375 1438 4025 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 3338 1888 6613 1888 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 5450 1913 5450 4725 6638 4725 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 3313 2825 6638 2825 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 1 + 5200 2838 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 5200 2813 5200 5175 6638 5175 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 238 1425 1425 1425 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 250 4263 1438 4263 1425 4275 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 238 4725 1425 4725 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 225 5200 1438 5200 1413 5200 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 1886 4013 1886 3322 1894 3322 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 2833 3330 2833 4013 2833 4028 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 5 + 1545 4005 1545 3648 1094 3648 1094 2010 1413 2010 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 248 2833 1428 2833 1335 2724 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1420 2833 1343 2934 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1420 1420 1343 1327 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1420 1428 1358 1521 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1413 1878 1343 1762 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1413 1894 1343 1948 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1428 4253 1312 4145 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1428 4261 1319 4346 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1420 4727 1343 4626 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1413 4735 1327 4789 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 2 + 1428 5192 1327 5076 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 4050 4365 6615 3105 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 4050 5580 6615 5580 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 315 5805 1395 5805 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 3 + 0 0 1.00 60.00 120.00 + 2430 6390 2430 9900 4320 9900 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3015 6615 7830 6615 7830 8865 3015 8865 3015 6615 +2 1 0 1 0 7 50 0 -1 4.000 0 0 0 0 0 3 + 250 1845 1438 1845 1425 1845 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 1620 765 1620 1215 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 765 2475 1440 2475 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 630 6165 1440 6165 +2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 3 + 1440 5220 1260 5355 1260 5400 +4 0 0 50 -1 0 12 0.0000 4 135 1110 1575 1440 Convertisseur \001 +4 0 0 50 -1 0 12 0.0000 4 135 1125 1575 1665 8bits to 16 bits\001 +4 0 0 50 -1 0 12 0.0000 4 180 735 450 1305 Pclk_cam\001 +4 0 0 50 -1 0 12 0.0000 4 180 1110 1800 2745 compteur 1024\001 +4 0 0 50 -1 0 12 0.0000 4 180 780 3915 1800 data[15-0]\001 +4 0 0 50 -1 0 12 0.0000 4 180 690 4230 2745 addr[9-0]\001 +4 0 0 50 -1 0 12 0.0000 4 135 480 6885 1935 Bank0\001 +4 0 0 50 -1 0 12 0.0000 4 135 660 6885 2385 DPRAM\001 +4 0 0 50 -1 0 12 0.0000 4 135 630 6885 2610 1024x16\001 +4 0 0 50 -1 0 12 0.0000 4 135 870 1890 4320 sequenceur\001 +4 0 0 50 -1 0 12 0.0000 4 135 480 6975 4320 Bank1\001 +4 0 0 50 -1 0 12 0.0000 4 135 660 6975 4770 DPRAM\001 +4 0 0 50 -1 0 12 0.0000 4 135 630 6975 4995 1024x16\001 +4 0 0 50 -1 0 12 0.0000 4 180 750 4410 5490 En_bank1\001 +4 0 0 50 -1 0 12 0.0000 4 180 600 1890 3510 enb_cpt\001 +4 0 0 50 -1 0 12 0.0000 4 135 390 2880 3780 carry\001 +4 0 0 50 -1 0 12 0.0000 4 180 735 405 4185 Pclk_cam\001 +4 0 0 50 -1 0 12 0.0000 4 180 750 405 4590 Href_cam\001 +4 0 0 50 -1 0 12 0.0000 4 180 900 405 5130 Vsync_cam\001 +4 0 0 50 -1 0 12 0.0000 4 180 1530 3105 6840 Registre de controle\001 +4 0 0 50 -1 0 12 0.0000 4 180 2175 3105 7290 BK : bit indique le bank \340 lire\001 +4 0 0 50 -1 0 12 0.0000 4 180 3525 3105 7515 INT : indique qu'il y a un bank \340 lire. bit est \340 1 \001 +4 0 0 50 -1 0 12 0.0000 4 180 3225 3105 7740 lorsque la ligne d'interruption est \340 1.\001 +4 0 0 50 -1 0 12 0.0000 4 180 3555 3105 7965 ERR : indique qu'il y a eu ecrasement d'un bank\001 +4 0 0 50 -1 0 12 0.0000 4 180 3090 3105 8190 RST : permet de faire un reset du system\001 +4 0 0 50 -1 0 12 0.0000 4 180 4620 3105 8415 RDB : doit etre mis \340 1 avant de lire un bank. Le sequenceur \001 +4 0 0 50 -1 0 12 0.0000 4 180 4470 3105 8640 utilisera ce signal pour baisser la ligne d'interruption.\001 +4 0 0 50 -1 0 12 0.0000 4 180 885 2610 9810 Interruption\001 +4 0 0 50 -1 0 12 0.0000 4 135 360 8865 4680 BUS\001 +4 0 0 50 -1 0 12 0.0000 4 135 300 8865 5130 ISA\001 +4 0 0 50 -1 0 12 0.0000 4 180 2010 4545 9900 Gestionnaire d'interruption\001 +4 0 0 50 -1 0 12 0.0000 4 180 1095 180 1800 data_cam[7-0]\001 +4 0 0 50 -1 0 12 0.4363 4 180 720 4320 4140 en_bank0\001 +4 0 0 50 -1 0 12 0.0000 4 180 660 450 5760 Chip_clk\001 +4 0 0 50 -1 0 12 0.0000 4 180 735 315 2790 Pclk_cam\001 +4 0 0 50 0 0 12 0.0000 4 135 270 1665 900 Rst\001 +4 0 0 50 0 0 12 0.0000 4 135 270 720 2430 Rst\001 diff --git a/2004/n/fpga/doc/dossierconception/portserie.tex b/2004/n/fpga/doc/dossierconception/portserie.tex new file mode 100644 index 0000000..944ed60 --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/portserie.tex @@ -0,0 +1,392 @@ +\section{Le TXserie} +\subsection{Cahier des charges} +Le cahier des charges du transmetteur série est le suivant : + +\begin{itemize} +\item Transmission série 8 bits, 1 start, 2 stop +\item Vitesse : paramétrable 9600 et 115200 bauds +\item Fifo de stockage avant transmision +\item Interruption activable signalant que la pile est pleine +\end{itemize} + + +\subsection{Schéma-bloc} + +\begin{figure}[htbp] +\caption{Schéma-bloc du TXserie} +\includegraphics[width=\textwidth]{images/txserie.pdf} +\label{schematxserie} +\end{figure} + +Le schéma modulaire est visible sur la figure \ref{schematxserie} page \pageref{schematxserie}. + +\subsection{Descritpion des modules} +\label{descriptmodules} + +\subsubsection{La fifo} + +C'est une fifo générée avec coregen. Elle contient des mots de 8 bits en +mémoire distribuée (car les BRAMs du FPGA seront utilisés à d'autres fins). + +Elle possède une entrée avec son horloge ckin, une sortie avec son horloge +ckout, et un pannel de flags en sortie. + +L'entrée ckin est la combinaison du csData et de la clock du bus. Ainsi, dès +qu'on écrit à son adresse mémoire, la fifo charge la donnée présente sur le +bus. + + +\subsubsection{Le TXcever} + +C'est un transmetteur série qui reçoit en entrée les données provenant de la +fifo. Dès qu'il est vide, il agit sur le signal ckout de la fifo, ce qui +dépile un élément, et le charge dans le transmetteur, qui peut alors le +transmettre. + +\subsubsection{Le générateur de clock} + +C'est un prédiviseur de la fréquence d'horloge du fpga. Il a pour but de +fournir l'horloge de référence pour le transmetteur (égale à 16 fois le +baudrate). + +Il est paramétrable, pour pouvoir choisir la fréquence utilisée parmis les 4 +baudrates disponibles. + +Pour avoir la bonne fréquence en sortie, on doit avoir en entrée une fréquence +multiple de 16 fois 115200 (le baudrate maxi). Les quartz qui sont utilisables +sont : 14.7456MHz, 29.4912MHz (14.7456*2), et 44.2368MHz (14.7456*3), + +\subsubsection{Registre config} + +C'est un registre de 8 bits branché sur le bus, en lecture/écriture, dans +lequel le PC vient déposer les bits de configuration du port série. +La sortie du registre controle le générateur de clock (pour fixer le +baudrate), et le gestionaire d'IRQ. + +\subsubsection{Registre flag} + +C'est un registre de 8 bits branché sur le bus en lecture seule dans lequel le +PC vient lire l'état des flags de la fifo. Son entrée est branchée sur les +sorties flag de la fifo. + +\subsubsection{IRQ} + +Le gestionaire d'IRQ est tout simplement un activateur d'interruptions. Il +déclenche des IRQ sur front montant, et ceci à condition que le signal IntEn +soit activé. + + +\subsection{Fonctionalités et utilisation} +Ce port série utilise 3 registres : TxData, Flag, et Config + +\subsubsection{Txdata} +Ce registre 8 bits sert à recevoir les données à envoyer. On les écrit +séquentiellement, et chaque écriture dans ce registre empile la donnée en haut +de la fifo. + +\subsubsection{Flag} +C'est le registre d'état. il donne essentiellement des informations sur l'état +de remplissage de la pile de transmision. + +Structure : +\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} +\hline +bit & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 +\\ \hline +nom & x & x & x & x & Empty & Full/Int & FLI1 & FLI0 +\\ \hline +\end{tabular} + +\begin{description} +\item [FL1/FL0] : Fifo Level 1/0. Ces bits donnent le niveau de remplissage de +la fifo.\\ + \begin{tabular}{|c|c|c|} + \hline + FL1/FL0 & Tx de remplissage + \\ \hline + 00 & < 25\% + \\ \hline + 01 & 25\% < Tx < 50\% + \\ \hline + 10 & 20\% < Tx < 75\% + \\ \hline + 11 & 75\% < Tx + \\ \hline + \end{tabular} +\item [Full/Int] : indique que la pile est pleine, ce qui déclenche une +interruption +\item [Empty] : indique que la pile ET le transmetteur sont vides, que la +transmission est donc terminée. +\end{description} + +\subsubsection{Config} +Ce registre sert de configuration pour la transmission. + +Structure : +\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} +\hline +bit & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 +\\ \hline +nom & x & x & x & On/Off & Purge & IntEn & BdR1 & BdR0 +\\ \hline +\end{tabular} + +\begin{description} +\item [BdR1/BdR0] : BaudRate1/0. Ces bits paramètrent la vitesse de +transmission. \\ + \begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} + \hline + BdR1/BdR0 & Vitessse + \\ \hline + 00 & 9600 + \\ \hline + 00 & 9600 + \\ \hline + 01 & 19200 + \\ \hline + 10 & 57600 + \\ \hline + 11 & 115200 + \\ \hline + \end{tabular} +\item [Int/En] : active ou non l'interruption de fifo pleine +\item [Purge] : vide la fifo de toutes ses données +\item [On/Off] : active ou non la transmission +\end{description} + +\subsection{Procédure d'utilisation} +Pour utiliser ce port série, on doit pouvoir effectuer les actions suivantes : + +\begin{itemize} +\item Mettre le bit On/Off à 1 pour activer la transmission +\item Paramétrer la vitesse à l'aide des bits BdR1/0 +\item Il est conseillé d'activer l'interruption de fifo pleine en mettant à 1 +le bit IntEn. +\item Ecriture dans txdata pour charger les données dans la fifo. Elles sont +alors automatiquement transférées, au plus tôt. Dès que le registre à décalage +est vide, il dépile le dernier élément de la fifo et le transmet à nouveau. +\item On peut lire en permanence l'état de la fifo grâce aux bits FL1/0. +\item Quand la fifo est pleine, le flag Full/Int passe à 1, et le front +montant de ce bit génère une interruption. +\item Il est possible de vider la fifo en mettant Purge à 1. Il faut le +remettre à 0 pour qu'il puisse être à nouveau actif, car la purge de la fifo +ne s'effectue que sur front montant de ce bit. +\end{itemize} + + +\subsection{Interfaçage vhdl} + +Voici le code vhdl de l'entité txserie : +\begin{verbatim} +entity txserie is +generic(adr : integer); +constant adr_w : integer :=10; +port( + databus: inout std_logic_vector(7 downto 0); + rw: in std_logic; + busck: in std_logic; + rst: in std_logic; + masterck: in std_logic; + txout: out std_logic; + intout: out std_logic; + csData: in std_logic; + csFlag: in std_logic; + csConfig: in std_logic; + ); +end txserie; +\end{verbatim} + +Voici une description de ces signaux : + +\begin{description} +\item [databus] : bus de données +\item [rw] : ligne Read/Write\_ +\item [busck] : horloge bus +\item [rst] : patte de reset +\item [masterck] : horloge générale du fpga +\item [txout] : patte de sortie série +\item [intout] : sortie d'interruption +\item [csData] : chip select du registre de data +\item [csFlag] : chip select du registre de flag +\item [csConfig] : chip select du registre de configuration +\end{description} + + + + + +% Deuxième partie : le RXserie + +\section{Le RXserie} +\subsection{Cahier des charges} +Le cahier des charges du récepteur série est le suivant : + +\begin{itemize} +\item Réception série 8 bits, 1 start, 2 stop +\item Vitesse : paramétrable 9600 et 115200 bauds +\item Fifo de stockage des données reçues +\item Interruption activable signalant que la fifo est pleine +\item Interruption activable signalant qu'on a reçu une donnée +\end{itemize} + + +\subsection{Schéma-bloc} + +Le schéma modulaire est visible sur la figure \ref{schemarxserie} page \pageref{schemarxserie}. + +\begin{figure}[htbp] +\caption{Schéma-bloc du RXserie} +\includegraphics[width=\textwidth]{images/rxserie.pdf} +\label{schemarxserie} +\end{figure} + + +\subsection{Descritpion des modules} +\subsubsection{Le RXcever} + +C'est un récepteur série qui présente ses données à l'entrée de la fifo +Dès qu'il a reçu un octet, il agit sur le signal fifockin de la fifo +ce qui empile l'octet reçu. + +\subsubsection{Autres modules} + +Les autres modules utilisés sont les mêmes que pour le transmetteur. Voir +chapitre \ref{descriptmodules}. + + +\subsection{Fonctionalités et utilisation} +Ce port série utilise 3 adresses mémoire : +\subsubsection{Rxdata} +Ce registre 8 bits permet de récupérer les données reçues. On les lit +séquentiellement, et chaque lecture dans ce registre dépile la donnée en bas +de la fifo. + +\subsubsection{Flag} +C'est le registre d'état. Il donne essentiellement des informations sur l'état +de remplissage de la pile de réception. + +Structure : +\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} +\hline +bit & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 \\ +\hline +nom & x & x & x & x & DR & FFull & FL1 & FL0 \\ +\hline +\end{tabular} + +\begin{description} +\item [FL1/FL0] : Fifo Level 1/0. Ces bits donnent le niveau de remplissage de +la fifo. \\ + \begin{tabular}{|c|c|c|} + \hline + FL1/FL0 & Tx de remplissage + \\ \hline + 00 & < 25\% + \\ \hline + 01 & 25\% < Tx < 50\% + \\ \hline + 10 & 20\% < Tx < 75\% + \\ \hline + 11 & 75\% < Tx + \\ \hline + \end{tabular} +\item [FFull] : indique que la pile est pleine. Chaque front montant de ce +bit déclenche l'interruption FifoFullInt +\item [DR] : DataReady. Indique que la fifo n'est plus vide, et donc qu'une +donnée est arrivée dans le récepteur. Chaque front montant de ce bit déclenche +l'interruption DRInt +\end{description} + +\subsubsection{Config} +Ce registre sert de configuration pour la transmission. + +Structure +\begin{tabular}{|c|c|c|c|c|c|c|c|c|c|} +\hline +bit & 7 & 6 & 5 & 4 & 3 & 2 & 1 & 0 +\\ \hline +nom & x & x & x & On/Off & DRIE & FFIE & BdR1 & BdR0 +\\ \hline +\end{tabular} + +\begin{description} +\item [BdR1/BdR0] : BaudRate1/0. Ces bits paramètrent la vitesse de +transmission. \\ + \begin{tabular}{|c|c|c|} + \hline + BdR1/BdR0 & Vitessse + \\ \hline + 00 & 9600 + \\ \hline + 01 & 19200 + \\ \hline + 10 & 57600 + \\ \hline + 11 & 115200 + \\ \hline + \end{tabular} +\item [FFIF] : FifoFull-Int-Enable. Active ou non l'interruption FifoFull +(actif à 1) +\item [DRIE] : DataReady-Int-Enable. Active ou non l'interruption +DataReady (actif à 1) +\item [On/Off] : active ou non la réception de données +\end{description} + +\subsection{Procédure d'utilisation} +Pour utiliser ce port série, on doit pouvoir effectuer les actions suivantes : +\begin{itemize} +\item Mettre le bit On/Off à 1 pour activer la réception des données. +\item Paramétrer la vitesse à l'aide des bits BdR1/0 +\item Il est conseillé d'activer l'interruption de fifo pleine (FFInt) en +mettant à 1 le bit FFIE. +\item On peut également activer l'interruption de donnée reçue DRInt en +mettant à 1 le bit DRIE. +\item Tester si une donnée est présente dans le buffer en testant le bit DR. +S'il est à 1, lire la donnée dans rxdata. La donnée est alors automatiquement +dépilée de la fifo. +\item On peut lire en permanence l'état de la fifo grâce aux bits FL1/0. +\item Quand la fifo est pleine, le flag FFI passe à 1, et le front +montant de ce bit génère une interruption. Il faut alors lire les 512 octets +de la fifo pour la vider. +\end{itemize} + + + +\subsection{Interfaçage vhdl} + +Voici le code vhdl de l'entité rxserie : +\begin{verbatim} +entity rxserie is +generic(adr : integer); +constant adr_w : integer :=10; +port( + databus: inout std_logic_vector(7 downto 0); + rw: in std_logic; + busck: in std_logic; + rst: in std_logic; + masterck: in std_logic; + rxin: in std_logic; + DRIout: out std_logic; + FFIout: out std_logic; + csData: in std_logic; + csFlag: in std_logic; + csConfig: in std_logic + ); +end rxserie; +\end{verbatim} + +\begin{description} +\item [databus] : bus de données +\item [rw] : ligne Read/Write\_ +\item [busck] : horloge bus +\item [rst] : patte de reset +\item [masterck] : horloge générale du fpga +\item [rxin] : patte de sortie série +\item [DRIout] : sortie d'interruption DRInt +\item [FFIout] : sortie d'interruption FFInt +\item [csData] : chip select du registre de data +\item [csFlag] : chip select du registre de flag +\item [csConfig] : chip select du registre de configuration +\end{description} + + diff --git a/2004/n/fpga/doc/dossierconception/rapport.tex b/2004/n/fpga/doc/dossierconception/rapport.tex new file mode 100644 index 0000000..bef1baa --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/rapport.tex @@ -0,0 +1,68 @@ +\documentclass[a4paper,dvips,pdftex]{article} + +% Inclusion de packages : +%{{{1 +\usepackage[T1]{fontenc} +\usepackage[latin1]{inputenc} +\usepackage[french]{babel} +\usepackage{fancyhdr} +\usepackage[dvips]{graphicx,color} +%\usepackage[pdftex]{graphicx,color} +%\usepackage{verbatim} +\usepackage{times} + +\usepackage{listings} +\lstset{language=C, + basicstyle=\footnotesize, %diminue la taille de listings + numbers=left, % nombre à gauche + numberstyle=\tiny, + stepnumber=5, + %numbersep=10pts + xleftmargin=30pt + } + +% Pour les maths : +%\usepackage{amssymb} +%\usepackage{amsfonts} +%\usepackage{amsmath,amsthm} +%}}}1 + +% Mise en page du document : +%{{{1 +\pagestyle{fancy} +\parskip=10pt +\baselineskip=11pt +\parindent=0pt % alinéa + +%}}}1 + +% Entête de page : +\lhead{\small{TB - PP - PAG - FG}} +\rhead{I2 ET\\ Mars 2004} + +% Structure du document : +\begin{document} + +\title{Pré-projet de VHDL : \\ Réalisation d'un périphérique ISA pour PC104} +\author{Thomas Burg - Pierre-Andre Galmes - Fidèle Gafan - Pierre Prot\\ EFREI +- Ingénieur 2$^{\textrm{ième}}$ année} + +\date{Mars 2004} +\maketitle +\pagebreak +\tableofcontents +\pagebreak + +\section{Introduction} + +Notre projet s'articule autour de plusieurs modules. +Dans ce rapport, nous exposerons l'architecture de chacun de ces modules. + +\input{ovcam.tex} +\pagebreak + +\input{portserie.tex} +\pagebreak + + +\end{document} diff --git a/2004/n/fpga/doc/dossierconception/rdcam.c b/2004/n/fpga/doc/dossierconception/rdcam.c new file mode 100644 index 0000000..8584282 --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/rdcam.c @@ -0,0 +1,124 @@ +/* rdcam.c contient les fonctions qui enregistre l'image + */ + +#include "rdcam.h" +#include +#include +#include + +#define CAM_PCLK BITN(1) +#define CAM_HREF BITN(2) +#define CAM_VSYNC BITN(3) + +void +cam_init(void) +{ + // configuration des lignes en entrée; + //_io_ports[M6811_DDRA] &= ~0x07 ; + _io_ports[M6811_DDRG] = 0; +} + +unsigned char +test_portcam(unsigned char bit) +{ + if ((_io_ports[M6811_PORTA] & bit) !=0) + return 1; + else + return 0; +} + +/* 352*288 = 101376 octect + * le 68 hc ne dispose que de 64ko de RAM !!! PB --> on segmente en 4 + * parties : + * 288 /4 = 72 + * + * 352 * 72 + */ + +void +cam_get(unsigned char * tab, unsigned char part) +{ + unsigned char ligne; + unsigned char *p; + // attend que CAM_VSYNC passe à 1 + while (!(_io_ports[M6811_PORTA] & 0x04)) + ; + for (ligne=0;ligne < 72 * part;ligne++) + { + // attend que CAM_HREF passe à 1 + while(!(_io_ports[M6811_PORTA] & 0x02)) + ; + // attend que CAM_HREF passe à 0 + while((_io_ports[M6811_PORTA] & 0x02)) + ; + } + for (ligne=0;ligne<72;ligne++) + { + p = tab; + // attend que CAM_HREF passe à 1 + while(!(_io_ports[M6811_PORTA] & 0x02)) + ; + // tant que CAM_HREF est à 1 + while(_io_ports[M6811_PORTA] & 0x02) + { + // si CAM_PCLK passe à 1 + if(_io_ports[M6811_PORTA] & 0x01) + { + *p++ = _io_ports[M6811_PORTG]; + // attend que CAM_PCK passe à 0 + while(_io_ports[M6811_PORTA] & 0x01) + ; + } + } + tab += 352; + } +} + +void +cam_count_href_pclk(int *tab) +{ + int i = 0; + int c; + // attend que CAM_VSYNC passe à 1 + while (!(_io_ports[M6811_PORTA] & 0x04)) + ; + // attend que CAM_HREF passe à 1 + while(!(_io_ports[M6811_PORTA] & 0x02)) + ; + // attend que CAM_HREF passe à 0 + while(_io_ports[M6811_PORTA] & 0x02) + ; + // attend que CAM_HREF passe à 1 + while(!(_io_ports[M6811_PORTA] & 0x02)) + ; + for (i = 0; i < 288; i++) + { + c = 0; + // tant que CAM_HREF est à 1 + while(_io_ports[M6811_PORTA] & 0x02) + { + // attend que PCLK passe à 1 + while(!(_io_ports[M6811_PORTA] & 0x01)) + ; + // attend que PCLK passe à 0 + while(_io_ports[M6811_PORTA] & 0x01) + ; + c++; + } + *tab++ = c; + } +} + +void +cam_skip_frames(int n) +{ + int i; + for (i = 0; i < n; i++) + { + // attend que CAM_VSYNC passe à 1 puis 0 + while (!(_io_ports[M6811_PORTA] & 0x04)) + ; + while ((_io_ports[M6811_PORTA] & 0x04)) + ; + } +} diff --git a/2004/n/fpga/doc/dossierconception/rdcam.h b/2004/n/fpga/doc/dossierconception/rdcam.h new file mode 100644 index 0000000..1544641 --- /dev/null +++ b/2004/n/fpga/doc/dossierconception/rdcam.h @@ -0,0 +1,18 @@ +#ifndef RDCAM_H +#define RDCAM_H + +#define BITN(x) (1<<(x)) + + +void +cam_init(void); +void +cam_get(unsigned char * tab, unsigned char part); +unsigned char +test_portcam(unsigned char bit); +void +cam_count_href_pclk(int *tab); +void +cam_skip_frames(int n); + +#endif -- cgit v1.2.3