mini projet vhdl - freeseb.france.free.fr/eseo/i2/vhdl/rapport-mp-vhdl-i2.pdf · 2006-03-28 · 1....

19

Upload: others

Post on 27-Jun-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

1

Mini projet

VHDL

( http://seb.france.free.fr/eseo/I2/vhdl )

Professeur responsable : Daniel GENET

Etudiants I2 : Sébastien FRANÇOIS

Yvonnick BRUNET

2

SOMMAIRE

1. Introduction 3

2. Spécifications 3

1) Description fonctionnelle 3

2) Implémentation 3

3) Vue externe 4

4) Structure interne 4

5) Schéma structurel du projet (architecture PAINT) 5

6) Détail des blocs 6

1) SOURIS 6

2) COLORATION 6

3) ADRESSEURMUX 7

4) VGASIGNALS 8

5) CTRL_VGA 9

6) DIVISEUR 9

7) CURSEUR 10

3. Grafcet de la partie séquentielle 11

4. Taux d’occupation du circuit cible 11

5. Listing commenté du code VHDL 12

1) COLORATION.vhd 12

2) ADRESSEURMUX.vhd 13

3) VGASIGNALS.vhd 14

4) DIVISEUR.vhd 15

5) CURSEUR.vhd 16

6) PROJET_PAINT.vhd 17

6. Conclusion 19

3

1. Introduction

Nous avons choisi de réaliser un programme inspiré du logiciel Paint de Microsoft. Le but est

de pouvoir dessiner une image sur un écran à l’aide d’une souris. Nous avons décidé que le

dessin s’effectuerait pixel par pixel pour en simplifier la mise en oeuvre, le dessin par

méthode vectorielle ou interpolée nécessitant des calculs de coefficients directeurs.

L’objectif du mini-projet est de concevoir puis développer une application VHDL embarquée

sur une carte prototype Xilinx.

2. Spécifications

1) Description fonctionnelle

Notre dispositif permet de dessiner, il comporte une souris et un écran d’ordinateur. Lors d’un

clic, on applique une couleur à l’endroit où se situe le curseur. Nous avons attribué une

couleur par bouton. Il nous faudra donc gérer les mouvements de la souris, les couleurs, ainsi

que la modification des pixels de l’image.

2) Implémentation

Nous utiliserons une carte d’évaluation à base de FPGA XILINX SPARTAN3 XC3S200 de

200 000 portes cadencé à 50MHz. Parmi les périphériques inclus sur la carte, nous utiliserons

la sortie VGA ainsi que le port PS/2. Il nous faudra aussi utiliser la SRAM disponible sur la

carte pour créer un tampon graphique.

Nous stockerons la couleur d’un pixel sur 3 bits, pour une image de 400x262, chaque pixel

sera codé sur un octet, soit environ 102ko. Nous configurerons donc la SRAM pour n’utiliser

qu’un seul boîtier (mot de 16 bits) puis en activant seulement l’octet de poids faible. Il nous

faudra par la suite gérer lorsque l’écran tente d’accéder à des adresses hors de la RAM.

Ces ressources seront affectées de la manière suivante :

- déplacement du curseur selon les mouvements de la souris

- affectation de la couleur de dessin à un pixel lors d’un clic

- choix de la couleur de dessin

- utilisation de la zone mémoire pour stocker l’image affichée à l’écran

- balayage de la mémoire et génération des signaux de contrôle de l’écran.

4

3) Vue externe

4) Structure interne

Nous aurons besoin en plus du séquenceur des blocs suivants :

- un composant souris qui en gère l’initialisation (PS/2) et nous fournit sa position dans

un espace 800x525 ainsi que l’état de ses boutons (souris)

- un bloc gérant la coloration des pixels (coloration)

- un contrôleur de SRAM (adresseurmux)

- un bloc gérant la décomposition des pixels lus en mémoire pour générer les signaux R,

V et B (vgasignals)

- un contrôleur d’affichage RGB générant l’ensemble des signaux de contrôle : les

composantes rouge, verte et bleue ainsi que les informations de synchronisation

verticales et horizontales (ctrl_vga)

Il nous faudra utiliser un diviseur de fréquence pour activer ce dernier bloc, la norme

VGA nous impose d’utiliser une fréquence de 25MHz.

Souris

PS2 SRAM

5

5) Schéma structurel du projet (architecture PAINT)

6

6) Détail des blocs

1) SOURIS

Description fonctionnelle

Le code gérant la souris PS/2 nous est fourni, ce bloc procède à l’initialisation, puis nous

permet d’accéder directement aux coordonnées de la souris ainsi qu’à l’état de ses boutons.

Les coordonnées de la souris sont exprimées dans un espace de 800x525, nous les utiliserons

directement pour adresser la RAM.

Vue externe

2) COLORATION

Description fonctionnelle

Ce bloc a pour fonction, lors d’un clic droit ou gauche (BD ou BG), de sélectionner la couleur

de dessin.

Vue externe

Structure interne

Un appui sur le bouton droit (CLICKD) ou le bouton gauche (CLICKG) définit la valeur qui

sera écrite en ram ce qui permettra d’avoir trois couleurs.

Les couleurs associées aux boutons sont définies sous la forme de signaux internes au bloc,

nommés couleurd (bouton droit) et couleurg (bouton gauche). Un xor entre ces deux couleurs

est effectué si les deux boutons sont appuyés simultanément.

Schéma structurel

7

3) ADRESSEURMUX

Description fonctionnelle

Ce bloc contient l’ensemble des multiplexeurs servant à l’adressage de la ram mais aussi à

l’aiguillage des données sortant de la RAM.

Le premier a pour fonction, pendant que l’écran n’est pas dessiné (blanking), et lors d’un clic

(BG ou BG), de convertir les coordonnées de la souris (X1 et Y2) afin de fournir l’adresse en

RAM où l’on va stocker la couleur (XYout). Lorsque l’on dessine vers l’écran, il fournit

l’adresse en RAM du pixel à afficher, cette adresse est calculée grâce aux signaux fournis par

ctrl_vga et entrant sur X2 et Y2.

Le deuxième gère l’entrée des données dans la RAM, pendant sa remise à zéro, il place les

broches de données à 0. Ensuite pendant l’affichage de l’écran il déconnecte le bloc coloration

de la RAM afin qu’il n’y ait pas de court-circuit pendant sa lecture. Pendant la période de

blanking, il connecte le bloc coloration à la RAM afin que le pixel dessiné y soit stocké.

Nous avons inséré dans ce bloc du code remettant à zéro le contenu de la RAM lors d’une

RAZ, et ce, afin qu’elle ne contienne pas de valeurs aléatoires à sa mise sous tension. Durant

cette mise à zéro, le signal progress est à ‘1’.

Vue externe

Structure interne

Un appui sur le bouton droit (CLICKD) ou le bouton gauche (CLICKG) définit la valeur qui

sera écrite en ram ce qui permettra d’avoir deux couleurs ou un crayon et une gomme.

Les coordonnées X et Y du curseur nous permettent de calculer l’adresse en RAM.

8

Schéma structurel

Bloc de gestion de l’adressage de la RAM

Bloc de gestion des données fournies à la RAM

Bloc de remise à zéro du contenu de la RAM

4) VGASIGNALS

Description fonctionnelle

Ce bloc a pour fonction de préparer les signaux de couleur à être envoyés à l’écran.

Vue externe

Structure interne

Le vecteur de bits contenant les composantes de couleur de chaque pixel (VGAout) est

décomposé en trois signaux distincts (R, G, B) destinés à l’écran.

La norme indique que ces trois signaux doivent être mis à zéro pendant la période où l’écran

n’est pas dessiné (blanking).

9

Schéma structurel

5) CTRL_VGA

Description fonctionnelle

Le code gérant les signaux de contrôle de l’écran nous est fourni. Il fonctionne pour résolution

VGA (640x480). Il nous fournit les signaux de synchronisation verticale et horizontale

(V_SYNC et H_SYNC) nécessaires au bon fonctionnement de l’écran, mais aussi deux

entiers, X et Y, parcourant les valeurs de 0, 0 à 799, 524. Ceux-ci nous servent à balayer le

contenu de la ram pour sortir les pixels vers l’écran. La broche EN nous permet de désactiver

le bloc de manière à ce que la valeur en sortie soit figée. Ceci est nécessaire car l’horloge du

système fonctionne à 50 MHz tandis que les données VGA doivent être fournies à 25 MHz.

Vue externe

6) DIVISEUR

Description fonctionnelle

Ce bloc a pour fonction de ralentir les signaux envoyés à l’écran. En effet pour contrôler

celui-ci on doit le piloter à 25 Mhz, il suffit donc de diviser par deux l’horloge de notre

système. On va créer un simple diviseur de fréquence qui ira ensuite activer ou désactiver le

bloc ctrl_vga.

Vue externe

Structure interne

Nous avons utilisé ici un simple compteur synchrone sur 2 bits dont on prélève le bit de poids

fort.

10

Schéma structurel

7) CURSEUR

Description fonctionnelle

Ce bloc a pour fonction d’afficher un point représentant le curseur de la souris, nous

permettant de localiser la position sur l’écran. Pour cela, il faut comparer la position de la

souris et des coordonnées de l’écran.

Vue externe

Structure interne

On compare en permanence les coordonnées du point dessiné (XPIX, YPIX) et les

coordonnées de la souris (XP, YP). Lorsqu’il y a égalité, on inverse la couleur lue en ram, ce

qui nous permet de différencier le curseur de l’image dans tous les cas possibles. En revanche,

lorsqu’il n’y a pas d’égalité on ne fait rien. Les couleurs sont directement transmises au bloc

suivant.

Schéma structurel

11

3. Grafcet de la partie séquentielle

CS_CPT : Mise à zéro synchrone de CPT

EN_CPT : Validation d’incrémentation du compteur CPT

Dataram <= "000" : Mise à zéro de chaque case mémoire

progress : flag indiquant une remise à zéro de RAM en cours

INIT_SRAM : initialisation de la ram

Lors d’une remise à zéro, le signal progress est validé, il active notamment l’écriture en RAM

dans le bloc racine.

On met alors à zéro le bus de données de la RAM tandis que le compteur CPT est incrémenté

jusqu’à ce qu’il soit égal aux 400*262 cases utilisées, remettant ainsi chaque case de la RAM

à zéro. On redonne la main au programme principal.

4. Taux d’occupation du circuit cible Device utilization summary:

---------------------------

Selected Device : 3s200ft256-5

Number of Slices: 150 out of 1920 7%

Number of Slice Flip Flops: 97 out of 3840 2%

Number of 4 input LUTs: 267 out of 3840 6%

Number of bonded IOBs: 39 out of 173 22%

Number of GCLKs: 1 out of 8 12%

12

5. Listing commenté du code VHDL

1) COLORATION.vhd ---------------------------------------------------------------------------

-- Company: ESEO

-- Engineer: BRUNET Yvonnick & Sébastien FRANÇOIS

--

-- Create Date: 09:54:45 01/04/06

-- Module Name: COLORATION - Behavioral

-- Project Name: Paint

-- Target Device: Spartan 3

-- Description: Bloc de gestion de la couleur et de l'affectation aux

-- boutons de la souris

--

-- Revision:

-- Revision 0.01 - File Created

---------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity COLORATION is

Port ( BG : in std_logic;

BD : in std_logic;

data : out std_logic_vector(2 downto 0));

end COLORATION;

architecture Behavioral of COLORATION is

signal couleurd : std_logic_vector (2 downto 0);

signal couleurg : std_logic_vector (2 downto 0);

signal boutons : std_logic_vector (1 downto 0);

begin

couleurg <= "100"; -- couleur click gauche

couleurd <= "110"; -- couleur click droit

boutons(0)<=BD;

boutons(1)<=BG;

with boutons select

data <= couleurd when "01",

couleurg when "10",

couleurd xor couleurg when "11",

"000" when others;

-- on fournit en sortie la couleur sélectionnée

end Behavioral;

13

2) ADRESSEURMUX.vhd ---------------------------------------------------------------------------

-- Company: ESEO

-- Engineer: BRUNET Yvonnick & Sébastien FRANÇOIS

--

-- Create Date: 08:24:19 01/04/06

-- Module Name: ADRESSEURMUX - Behavioral

-- Project Name: Paint

-- Target Device: Spartan 3

-- Description: Effectue le multiplexage d'adresse pour la SRAM

-- pour permettre l'écriture puis la lecture

--

-- Revision:

-- Revision 0.01 - File Created

---------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ADRESSEURMUX is

Port (

CLK, RAZ : in std_logic;

X1 : in integer range 0 to 799;

Y1 : in integer range 0 to 524;

X2 : in integer range 0 to 799;

Y2 : in integer range 0 to 524;

XYout : out std_logic_vector(17 downto 0);

progress : inout std_logic;

blanking, BD, BG : in std_logic;

ColorIN : in std_logic_vector(2 downto 0);

ColorRAM : out std_logic_vector(2 downto 0)

);

end ADRESSEURMUX;

architecture Behavioral of ADRESSEURMUX is

signal X : std_logic_vector (8 downto 0);

signal Y : std_logic_vector (8 downto 0);

signal CPT : std_logic_vector(17 downto 0);

begin

-- MUX 1 Les coordonnées adressent directement en mémoire

X<=CONV_STD_LOGIC_VECTOR(X1/2,9) when blanking = '1'

else CONV_STD_LOGIC_VECTOR(X2/2,9);

Y<=CONV_STD_LOGIC_VECTOR(Y1/2,9) when blanking = '1'

else CONV_STD_LOGIC_VECTOR(Y2/2,9);

XYout(17 downto 9) <= CPT(17 downto 9) when progress = '1' else Y;

XYout(8 downto 0) <= CPT (8 downto 0) when progress = '1' else X;

-- MUX 2 Les données de couleur peuvent être mises à zéro ou

-- aiguillées entre le bloc de dessin et la SRAM

ColorRAM <= "000" when progress = '1' else

ColorIN when (BD or BG) = '1' and blanking = '1' and progress = '0'

else (others => 'Z') ;

14

-- Bloc séquentiel de remise à zéro du contenu de la SRAM,

-- l'exécution commence ici!

P_RAZRAM : process(CLK, RAZ)

begin

if RAZ = '1' then

progress <= '1';

elsif CLK'event and CLK = '1' then

if(progress = '1') then

CPT <= CPT+1;

if CPT = CONV_STD_LOGIC_VECTOR(400*262,18) then

progress <= '0';

-- on parcourt les 400*262 cases

end if;

end if;

end if;

end process P_RAZRAM;

end Behavioral;

3) VGASIGNALS.vhd ---------------------------------------------------------------------------

-- Company: ESEO

-- Engineer: BRUNET Yvonnick & Sébastien FRANÇOIS

--

-- Create Date: 10:13:32 01/04/06

-- Module Name: VGASignals - Behavioral

-- Project Name: Paint

-- Target Device: Spartan 3

-- Description: Décompose un vecteur de bits en trois informations

-- R, G et B pour l'écran avec possibilité de neutralisation

-- lorsque blanking = 1

--

-- Revision:

-- Revision 0.01 - File Created

---------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity VGASignals is

Port ( VGAout : in std_logic_vector(2 downto 0);

blanking : in std_logic;

R : out std_logic;

G : out std_logic;

B : out std_logic);

end VGASignals;

architecture Behavioral of VGASignals is

begin

R <= '0' when blanking = '1'

else VGAout(2);

G <= '0' when blanking = '1'

else VGAout(1);

B <= '0' when blanking = '1'

else VGAout(0);

end Behavioral;

15

4) DIVISEUR.vhd

---------------------------------------------------------------------------

-- Company: ESEO

-- Engineer: BRUNET Yvonnick & Sébastien FRANÇOIS

--

-- Create Date: 10:21:37 01/04/06

-- Module Name: Diviseur - Behavioral

-- Project Name: Paint

-- Target Device: Spartan 3

-- Description: Génère un signal synchrone à 25 MHz

--

-- Revision:

-- Revision 0.01 - File Created

---------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Diviseur is

Port ( input,raz : in std_logic;

output : out std_logic);

end Diviseur;

architecture Behavioral of Diviseur is

signal cpt : std_logic_vector(1 downto 0);

begin

P_CPT : process(raz,input)

begin

if raz = '1' then cpt <= "00"; -- compteur 2 bits RAZ asynchrone

elsif input'event and input = '1' then

if(cpt<3) then

cpt <= cpt+1;

else

cpt <= "00";

end if;

end if;

end process P_CPT;

output <= cpt(1); -- on prélève le bit de poids fort

end Behavioral;

16

5) CURSEUR.vhd

---------------------------------------------------------------------------

-- Company: ESEO

-- Engineer: BRUNET Yvonnick & Sébastien FRANÇOIS

--

-- Create Date: 11:24:34 01/09/06

-- Module Name: curseur - Behavioral

-- Project Name: Paint

-- Target Device: Spartan 3

-- Description: Superpose un pixel en video inversée à l'emplacement du curseur

-- traitement fait directement au niveau de l'image

--

-- Revision:

-- Revision 0.01 - File Created

---------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity curseur is

Port ( XP : in integer range 0 to 799;

YP : in integer range 0 to 524;

XPIX : in integer range 0 to 799;

YPIX : in integer range 0 to 524;

imgin : in std_logic_vector(2 downto 0);

imgout : out std_logic_vector(2 downto 0));

end curseur;

architecture Behavioral of curseur is

begin

imgout <= not(imgin) when (XPIX<=XP) and (XP<XPIX+4) and (YPIX<=YP) and

(YP<YPIX+4) else imgin;

-- video inversée pour le curseur de 8x8 pixels

end Behavioral;

17

6) PROJET_PAINT.vhd ---------------------------------------------------------------------------

-- Company: ESEO

-- Engineer: BRUNET Yvonnick & Sébastien FRANÇOIS

--

-- Create Date: 08:03:48 01/04/06

-- Module Name: projet_paint - Behavioral

-- Project Name: Paint

-- Target Device: Spartan 3

-- Description: Ce composant permet de dessiner à l'aide d'une souris

-- sur un écran d’ordinateur

--

-- Dependencies: ADRESSEUR, COLORATION, CTRL_VGA, DIVISEUR, SOURIS,

-- VGASIGNALS, CURSEUR

--

-- Revision:

-- Revision 0.01 - File Created

---------------------------------------------------------------------------

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity projet_paint is

Port ( RAZ : in std_logic;

CLK : in std_logic;

R : out std_logic;

G : out std_logic;

B : out std_logic;

H_SYNC : out std_logic;

V_SYNC : out std_logic;

Data_Mouse : inout std_logic;

Clk_Mouse : in std_logic;

we, oe, ce1, ub1, lb1, ce2 : out std_logic;

dataram : inout std_logic_vector(2 downto 0);

address : out std_logic_vector(17 downto 0));

-- Affectations des broches sur la carte

attribute loc : string;

attribute loc of CLK : signal is "T9";

attribute loc of RAZ : signal is "L14";

attribute loc of Data_Mouse : signal is "M15";

attribute loc of Clk_Mouse : signal is "M16";

attribute loc of R : signal is "R12";

attribute loc of G : signal is "T12";

attribute loc of B : signal is "R11";

attribute loc of we : signal is "G3"; -- Write Enable conditionné

attribute loc of oe : signal is "K4";

-- Output Enable permanent à 0

attribute loc of ce1 : signal is "P7"; -- à mettre à 0

attribute loc of ub1 : signal is "T4"; -- à mettre à 1

attribute loc of lb1 : signal is "P6"; -- à mettre à 0

attribute loc of ce2 : signal is "N5"; -- à mettre à 1

attribute loc of dataram : signal is "R6,T8,N7";

attribute loc of address : signal is

"L3,K5,K3,J3,J4,H4,H3,G5,E4,E3,F4,F3,G4,L4,M3,M4,N3,L5";

end projet_paint;

18

architecture Behavioral of projet_paint is

----

-- COMPONENTS

----

component CTRL_VGA is

port(CLK,EN: in std_logic;

H_SYNC,V_SYNC,BLANKING: out std_logic;

X: out integer range 0 to 799;

Y: out integer range 0 to 524);

end component;

component COLORATION is

Port ( BG : in std_logic;

BD : in std_logic;

data : out std_logic_vector(2 downto 0));

end component;

component souris is

port (clock, raz : in std_logic;

MOUSE_DATA : inout std_logic;

MOUSE_CLK : in std_logic;

XP : out integer range 0 to 799;

YP : OUT integer range 0 to 524;

BG : out std_logic;

BD : out std_logic);

end component;

component ADRESSEURMUX is

Port ( CLK, RAZ : in std_logic;

X1 : in integer range 0 to 799;

Y1 : in integer range 0 to 524;

X2 : in integer range 0 to 799;

Y2 : in integer range 0 to 524;

XYout : out std_logic_vector(17 downto 0);

progress : inout std_logic;

blanking, BD, BG : in std_logic;

ColorIN : in std_logic_vector(2 downto 0);

ColorRAM : out std_logic_vector(2 downto 0));

end component;

component VGASignals is

Port ( VGAout : in std_logic_vector(2 downto 0);

blanking : in std_logic;

R : out std_logic;

G : out std_logic;

B : out std_logic);

end component;

component Diviseur is

Port ( input,raz : in std_logic;

output : out std_logic);

end component;

component curseur is

Port ( XP : in integer range 0 to 799;

YP : in integer range 0 to 524;

XPIX : in integer range 0 to 799;

YPIX : in integer range 0 to 524;

imgin : in std_logic_vector(2 downto 0);

imgout : out std_logic_vector(2 downto 0));

end component;

19

signal BD,BG : std_logic;

signal XP : integer range 0 to 799; -- coordonnées de la souris

signal YP : integer range 0 to 524;

signal XPIX : integer range 0 to 799; -- coordonnées du pixel dessiné

signal YPIX : integer range 0 to 524;

signal sel : std_logic; -- bascule le dessin ou l'affichage

signal colordraw : std_logic_vector(2 downto 0);

-- lien entre coloration et adresseurmux

signal image : std_logic_vector(2 downto 0);

-- lien entre la sortie du curseur et vgasignals

signal progress, blanking: std_logic;

begin

ce2 <= '1';

ce1 <= '0'; -- selection du premier bloc de SRAM

ub1 <= '1'; -- lecture de l'octet de poids faible

lb1 <= '0';

we <= '0' when ((BG or BD) = '1' and blanking = '1') or progress = '1' else

'1';

-- écriture active après un clic pendant que l'on ne

-- dessine pas ou bien pendant la remise à zéro de la SRAM

oe <= '0';

-- Instanciation des composants

U0 : SOURIS port map(clock => CLK, raz => RAZ, MOUSE_CLK => Clk_Mouse,

MOUSE_DATA => Data_Mouse, BD => BD, BG => BG, XP => XP,

YP => YP);

U1 : ADRESSEURMUX port map(CLK => CLK, RAZ => RAZ, X1 => XP, Y1 => YP, X2

=> XPIX, Y2 => YPIX, ColorIN => colordraw, ColorRAM => dataram,

XYout => address, progress => progress, blanking => blanking, BD =>

BD, BG => BG);

U2 : CTRL_VGA port map(CLK => CLK, EN => sel, H_SYNC => H_SYNC, V_SYNC =>

V_SYNC, blanking => blanking, X => XPIX, Y => YPIX);

U3 : COLORATION port map(BD => BD, BG => BG, data => colordraw);

U4 : VGASignals port map(VGAout => image, blanking => blanking, R => R, G

=> G, B => B);

U5 : Diviseur port map(raz => RAZ, input => CLK, output => sel);

U6 : curseur port map(imgin => dataram, imgout => image, XP => XP,

XPIX => XPIX, YP => YP, YPIX => YPIX);

end Behavioral;

6. Conclusion

Le sujet nous a beaucoup intéressés car nous avons pu nous pencher sur la mise en œuvre

d’un framebuffer et d’un curseur matériel.

Nous avons apporté de l’attention à la conception des blocs fonctionnels sur papier. Ainsi,

après avoir établi la structure du programme, nous avons pu facilement définir les blocs, et

plus tard lorsque nous avons fait des corrections, il nous a suffi d’adapter le schéma interne.

Dans un premier temps, nous avions omis de remettre à zéro le contenu de la SRAM. A la

mise sous tension, l’écran affichait des couleurs aléatoires. Nous avons ajouté du code dans le

bloc Adresseurmux pour y remédier. La remise à zéro de la RAM mériterait un bloc

spécifique.

Nous avons été surpris de voir la vitesse avec laquelle ce projet a pu prendre forme, comparé

par exemple au temps qu’il faudrait pour réaliser le même projet à base de programmation de

microprocesseur. Une fois le modèle établi, le passage du modèle au VHDL s’est effectué

sans problème.