Commit 5f4383b9c2d5243a68eac209285fac15e3905541

Authored by Simon
1 parent 56eab79f

Ajout partie VGA

7Segment_display/README.md
@@ -77,7 +77,7 @@ end display; @@ -77,7 +77,7 @@ end display;
77 77
78 Les signaux 78 Les signaux
79 79
80 - les signaux utilisés vont nous permettre d'avoir un code clean et plus ou moins factorié. 80 + les signaux utilisés vont nous permettre d'avoir un code propre et plus ou moins factorisé.
81 81
82 ``` 82 ```
83 architecture Behavioral of display is 83 architecture Behavioral of display is
@@ -160,7 +160,7 @@ end display; @@ -160,7 +160,7 @@ end display;
160 160
161 > le diviseur (clk_enable) ralentit la cadence de switch entre afficheur. Si l'on ne divise du fait de la vitesse les chiffres ne s'affichent pas correctement. 161 > le diviseur (clk_enable) ralentit la cadence de switch entre afficheur. Si l'on ne divise du fait de la vitesse les chiffres ne s'affichent pas correctement.
162 162
163 - Ainsi la logique et l'électronique étant ici très rapide devant la fréquence de percepetion de l'oeil humain, l'utilisateur à l'impression que l'affichage et statique et que rien ne clignote. 163 + Ainsi la logique et l'électronique étant ici très rapide devant la fréquence de perception de l'oeil humain, l'utilisateur à l'impression que l'affichage et statique et que rien ne clignote.
164 164
165 - 2ème processus : 165 - 2ème processus :
166 166
@@ -221,4 +221,4 @@ end display; @@ -221,4 +221,4 @@ end display;
221 221
222 - Enfin il a fallu implémanter un simple algorithme pour le compteur. 222 - Enfin il a fallu implémanter un simple algorithme pour le compteur.
223 223
224 -![counter](counter.gif)  
225 \ No newline at end of file 224 \ No newline at end of file
  225 +![counter](counter.gif)
Vga_display/Basys-3-Master.xdc
@@ -113,20 +113,20 @@ set_property -dict { PACKAGE_PIN R2 IOSTANDARD LVCMOS33 } [get_ports {sw[14]} @@ -113,20 +113,20 @@ set_property -dict { PACKAGE_PIN R2 IOSTANDARD LVCMOS33 } [get_ports {sw[14]}
113 113
114 114
115 ##VGA Connector 115 ##VGA Connector
116 -#set_property -dict { PACKAGE_PIN G19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[0]}]  
117 -#set_property -dict { PACKAGE_PIN H19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[1]}]  
118 -#set_property -dict { PACKAGE_PIN J19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[2]}]  
119 -#set_property -dict { PACKAGE_PIN N19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[3]}]  
120 -#set_property -dict { PACKAGE_PIN N18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[0]}]  
121 -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[1]}]  
122 -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[2]}]  
123 -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[3]}]  
124 -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[0]}]  
125 -#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[1]}]  
126 -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[2]}]  
127 -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[3]}]  
128 -#set_property -dict { PACKAGE_PIN P19 IOSTANDARD LVCMOS33 } [get_ports Hsync]  
129 -#set_property -dict { PACKAGE_PIN R19 IOSTANDARD LVCMOS33 } [get_ports Vsync] 116 +set_property -dict { PACKAGE_PIN G19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[0]}]
  117 +set_property -dict { PACKAGE_PIN H19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[1]}]
  118 +set_property -dict { PACKAGE_PIN J19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[2]}]
  119 +set_property -dict { PACKAGE_PIN N19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[3]}]
  120 +set_property -dict { PACKAGE_PIN N18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[0]}]
  121 +set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[1]}]
  122 +set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[2]}]
  123 +set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[3]}]
  124 +set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[0]}]
  125 +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[1]}]
  126 +set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[2]}]
  127 +set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[3]}]
  128 +set_property -dict { PACKAGE_PIN P19 IOSTANDARD LVCMOS33 } [get_ports Hsync]
  129 +set_property -dict { PACKAGE_PIN R19 IOSTANDARD LVCMOS33 } [get_ports Vsync]
130 130
131 131
132 ##USB-RS232 Interface 132 ##USB-RS232 Interface
@@ -156,4 +156,4 @@ set_property CFGBVS VCCO [current_design] @@ -156,4 +156,4 @@ set_property CFGBVS VCCO [current_design]
156 ## SPI configuration mode options for QSPI boot, can be used for all designs 156 ## SPI configuration mode options for QSPI boot, can be used for all designs
157 set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] 157 set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
158 set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design] 158 set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]
159 -set_property CONFIG_MODE SPIx4 [current_design]  
160 \ No newline at end of file 159 \ No newline at end of file
  160 +set_property CONFIG_MODE SPIx4 [current_design]
Vga_display/README.md
@@ -8,21 +8,221 @@ @@ -8,21 +8,221 @@
8 > L'ensemble des codes, images et vidéos sont compris dans ce répertoire. 8 > L'ensemble des codes, images et vidéos sont compris dans ce répertoire.
9 9
10 ## But du projet 10 ## But du projet
11 - 11 +Nous avons eu comme projet d'afficher différentes choses sur un écran en passant par son port VGA.
12 ## I/O utilisées 12 ## I/O utilisées
13 - 13 +Tout d'abord, voyons les entrées/sortie que nous avons utilisées.
  14 +```
  15 +entity vga_controller is
  16 + Port (clk_fpga : in std_logic;
  17 + sw : in std_logic_vector(15 downto 0);
  18 + vgaRed : out std_logic_vector(3 downto 0);
  19 + vgaGreen : out std_logic_vector(3 downto 0);
  20 + vgaBlue : out std_logic_vector(3 downto 0);
  21 + Hsync : out std_logic;
  22 + Vsync : out std_logic);
  23 +end vga_controller;
  24 +- clk_fpga : le signal de clock du fpga
  25 +- sw : interrupteurs pour commander les couleurs
  26 +- vgaRed/Green/Blue : permet de commander la couleur à afficher
  27 +- Hsyn : synchronisation horizontale
  28 +- Vsyn : synchronisation verticale
  29 +```
  30 +Dans le fichier de contrainte :
  31 +```
  32 +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports {sw[0]}]
  33 +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports {sw[1]}]
  34 +set_property -dict { PACKAGE_PIN W16 IOSTANDARD LVCMOS33 } [get_ports {sw[2]}]
  35 +set_property -dict { PACKAGE_PIN W17 IOSTANDARD LVCMOS33 } [get_ports {sw[3]}]
  36 +set_property -dict { PACKAGE_PIN W15 IOSTANDARD LVCMOS33 } [get_ports {sw[4]}]
  37 +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports {sw[5]}]
  38 +set_property -dict { PACKAGE_PIN W14 IOSTANDARD LVCMOS33 } [get_ports {sw[6]}]
  39 +set_property -dict { PACKAGE_PIN W13 IOSTANDARD LVCMOS33 } [get_ports {sw[7]}]
  40 +set_property -dict { PACKAGE_PIN V2 IOSTANDARD LVCMOS33 } [get_ports {sw[8]}]
  41 +set_property -dict { PACKAGE_PIN T3 IOSTANDARD LVCMOS33 } [get_ports {sw[9]}]
  42 +set_property -dict { PACKAGE_PIN T2 IOSTANDARD LVCMOS33 } [get_ports {sw[10]}]
  43 +set_property -dict { PACKAGE_PIN R3 IOSTANDARD LVCMOS33 } [get_ports {sw[11]}]
  44 +set_property -dict { PACKAGE_PIN W2 IOSTANDARD LVCMOS33 } [get_ports {sw[12]}]
  45 +set_property -dict { PACKAGE_PIN U1 IOSTANDARD LVCMOS33 } [get_ports {sw[13]}]
  46 +set_property -dict { PACKAGE_PIN T1 IOSTANDARD LVCMOS33 } [get_ports {sw[14]}]
  47 +set_property -dict { PACKAGE_PIN R2 IOSTANDARD LVCMOS33 } [get_ports {sw[14]}]
  48 +```
  49 +Cela permet associer les interrupteurs au tableau sw.
  50 +Dans le fichier de contrainte :
  51 +```
  52 +set_property -dict { PACKAGE_PIN G19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[0]}]
  53 +set_property -dict { PACKAGE_PIN H19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[1]}]
  54 +set_property -dict { PACKAGE_PIN J19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[2]}]
  55 +set_property -dict { PACKAGE_PIN N19 IOSTANDARD LVCMOS33 } [get_ports {vgaRed[3]}]
  56 +set_property -dict { PACKAGE_PIN N18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[0]}]
  57 +set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[1]}]
  58 +set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[2]}]
  59 +set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports {vgaBlue[3]}]
  60 +set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[0]}]
  61 +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[1]}]
  62 +set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[2]}]
  63 +set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports {vgaGreen[3]}]
  64 +set_property -dict { PACKAGE_PIN P19 IOSTANDARD LVCMOS33 } [get_ports Hsync]
  65 +set_property -dict { PACKAGE_PIN R19 IOSTANDARD LVCMOS33 } [get_ports Vsync]
  66 +```
  67 +On associe tout les pins du connecteur VGA avec nos signaux
14 ## Explication de l'algorithme 68 ## Explication de l'algorithme
  69 +Pour que le code soit compréhensible facilement, nous avons crée plusieurs process pour les différentes utilités.
  70 +### Les signaux
  71 +```
  72 +signal clk_65MHz : std_logic;
  73 +signal Hcount : integer range 1344 downto 1 := 1;
  74 +signal Vcount : integer range 1083264 downto 1 := 1;
  75 +signal myRed: std_logic_vector(3 downto 0);
  76 +signal myBlue: std_logic_vector(3 downto 0);
  77 +signal myGreen: std_logic_vector(3 downto 0);
  78 +
  79 +signal leftLimit: integer range 1025 downto 0:= 0;
  80 +signal rightLimit: integer range 1025 downto 0:= 100;
  81 +signal upLimit: integer range 768 downto 0:= 0;
  82 +signal downLimit: integer range 768 downto 0:= 100;
  83 +signal pixelX: integer range 1344 downto 1:= 1;
  84 +signal pixelY: integer range 768 downto 1;
  85 +```
  86 +- *Limit : Permet de délimiter les coordonnées du carré
  87 +- pixel* : Désigne la coordonnée du pixel que nous affichons
  88 +### Les process
  89 +#### 1er process
  90 +```
  91 +process(clk_65MHz)
  92 +begin
  93 +if clk_65MHz'event and clk_65MHz = '1' then
  94 +
  95 +-- Gestion du vga
  96 +
  97 + -- Syncro horizontale
  98 + if Hcount < 1025 then
  99 + -- affichage
  100 + Hsync <= '1';
  101 + Hcount <= Hcount + 1;
  102 + elsif Hcount < 1049 then
  103 + -- Fp
  104 + Hsync <= '1';
  105 + Hcount <= Hcount + 1;
  106 + elsif Hcount < 1185 then
  107 + -- Pw
  108 + Hsync <= '0';
  109 + Hcount <= Hcount + 1;
  110 + elsif Hcount < 1344 then
  111 + -- Bp
  112 + Hsync <= '1';
  113 + Hcount <= Hcount + 1;
  114 + else
  115 + Hcount <= 1;
  116 + end if;
  117 +
  118 + -- Synchro vertical
  119 + if Vcount < 1032193 then
  120 + -- Affichage de toutes les lignes
  121 + Vsync <= '1';
  122 + Vcount <= Vcount + 1;
  123 + elsif Vcount < (1032193 + 4032) then
  124 + --Fp
  125 + Vsync <= '1';
  126 + Vcount <= Vcount + 1;
  127 + elsif Vcount < (1032193 + 4032 + 8064) then
  128 + --Pw
  129 + Vsync <= '0';
  130 + Vcount <= Vcount + 1;
  131 + elsif Vcount < (1032192 + 4032 + 8064 + 38976) then
  132 + --Bp
  133 + Vsync <= '1';
  134 + Vcount <= Vcount + 1;
  135 + else
  136 + Vcount <= 1;
  137 + end if;
  138 +end if;
  139 +end process;
  140 +```
  141 +Ce process permet de suivre les différents signaux de synchronisation verticale et horizontale grâce à une horologe 65MHz.
  142 +#### 2eme process
  143 +```
  144 +process(clk_65MHz)
  145 +-- Gestion de l'affichage
  146 +begin
  147 +if clk_65MHz'event and clk_65MHz = '1' then
  148 + if pixelX > leftLimit and pixelX < rightLimit and pixelY > upLimit and pixelY < downLimit then
  149 + -- Carré
  150 + vgaRed <= myRed;
  151 + vgaBlue <= myBlue;
  152 + vgaGreen <= myGreen;
  153 + elsif Hcount < 1025 and pixelY < 769 then
  154 + -- Background
  155 + vgaRed <= (others => '1');
  156 + vgaBlue <= (others => '1');
  157 + vgaGreen <= (others => '1');
  158 + else
  159 + -- Hors pixel
  160 + vgaRed <= (others => '0');
  161 + vgaBlue <= (others => '0');
  162 + vgaGreen <= (others => '0');
  163 + end if;
  164 +end if;
  165 +end process;
  166 +```
  167 +Ce process prends en charge l'affichage du fond de l'écran et ainsi que l'affichage du carré.
  168 +
  169 +
  170 +#### 3eme process
  171 +```
  172 +process(clk_65MHz)
  173 +begin
  174 +if clk_65MHz'event and clk_65MHz = '1' then
  175 + if Vcount = 1032193 then
  176 + if rightLimit > 1024 and downLimit > 768 then
  177 + leftLimit <= 0;
  178 + rightLimit <= 100;
  179 + upLimit <= 0;
  180 + downLimit <= 100;
  181 + elsif rightLimit > 1024 then
  182 + leftLimit <= 0;
  183 + rightLimit <= 100;
  184 + upLimit <= upLimit + 1;
  185 + downLimit <= downLimit + 1;
  186 + else
  187 + leftLimit <= leftLimit + 1;
  188 + rightLimit <= rightLimit +1;
  189 + end if;
  190 + end if;
  191 +end if;
  192 +end process;
  193 +```
  194 +Ce process permet de gerer le mouvement de notre carré grâce à ces coordonnées.
  195 +
  196 +#### 4eme process
  197 +```
  198 +process(clk_65MHz)
  199 +-- Simplification des valeurs d'écran
  200 +begin
  201 +if clk_65MHz'event and clk_65MHz = '1' then
  202 + if Vcount = 1 then
  203 + pixelY <= 1;
  204 + elsif Hcount = 1025 then
  205 + pixelY <= pixelY + 1;
  206 + end if;
  207 +end if;
  208 +end process;
  209 +```
15 210
16 ## Résultats 211 ## Résultats
17 212
18 -- 213 +-Nous avons dans un premier temps réussi à afficher un écran dont la couleur est commandée par 12 interrupteurs (4 interrupteurs par couleurs)
19 214
20 ![gif1](gif1.gif) 215 ![gif1](gif1.gif)
21 216
22 -- 217 +-Puis nous avons reussi à afficher un carré dans un coin de l'écran (toujours commandé en couleurs par les interrupteurs)
23 218
24 ![img](img.jpg) 219 ![img](img.jpg)
25 220
26 -- 221 +-Finalement avec la separation du code en process et en ajoutant des fonctionnalités, nous avons réussi à animer le carré qui se déplace de droite à gauche et revient à gauche dès qu'il touche le coin droit tout en descendant.
  222 +
  223 +![gif2](gif2.gif)
  224 +
  225 +
  226 +
  227 +
27 228
28 -![gif2](gif2.gif)  
29 \ No newline at end of file 229 \ No newline at end of file
Vga_display/vga_controller.vhd
@@ -84,6 +84,58 @@ myGreen(3) &lt;= sw(11); @@ -84,6 +84,58 @@ myGreen(3) &lt;= sw(11);
84 84
85 pixelX <= Hcount; 85 pixelX <= Hcount;
86 86
  87 +
  88 +process(clk_65MHz)
  89 +begin
  90 +if clk_65MHz'event and clk_65MHz = '1' then
  91 +
  92 +-- Gestion du vga
  93 +
  94 + -- Syncro horizontale
  95 + if Hcount < 1025 then
  96 + -- affichage
  97 + Hsync <= '1';
  98 + Hcount <= Hcount + 1;
  99 + elsif Hcount < 1049 then
  100 + -- Fp
  101 + Hsync <= '1';
  102 + Hcount <= Hcount + 1;
  103 + elsif Hcount < 1185 then
  104 + -- Pw
  105 + Hsync <= '0';
  106 + Hcount <= Hcount + 1;
  107 + elsif Hcount < 1344 then
  108 + -- Bp
  109 + Hsync <= '1';
  110 + Hcount <= Hcount + 1;
  111 + else
  112 + Hcount <= 1;
  113 + end if;
  114 +
  115 + -- Synchro vertical
  116 + if Vcount < 1032193 then
  117 + -- Affichage de toutes les lignes
  118 + Vsync <= '1';
  119 + Vcount <= Vcount + 1;
  120 + elsif Vcount < (1032193 + 4032) then
  121 + --Fp
  122 + Vsync <= '1';
  123 + Vcount <= Vcount + 1;
  124 + elsif Vcount < (1032193 + 4032 + 8064) then
  125 + --Pw
  126 + Vsync <= '0';
  127 + Vcount <= Vcount + 1;
  128 + elsif Vcount < (1032192 + 4032 + 8064 + 38976) then
  129 + --Bp
  130 + Vsync <= '1';
  131 + Vcount <= Vcount + 1;
  132 + else
  133 + Vcount <= 1;
  134 + end if;
  135 +end if;
  136 +end process;
  137 +
  138 +
87 process(clk_65MHz) 139 process(clk_65MHz)
88 begin 140 begin
89 if clk_65MHz'event and clk_65MHz = '1' then 141 if clk_65MHz'event and clk_65MHz = '1' then
@@ -141,53 +193,5 @@ if clk_65MHz&#39;event and clk_65MHz = &#39;1&#39; then @@ -141,53 +193,5 @@ if clk_65MHz&#39;event and clk_65MHz = &#39;1&#39; then
141 end if; 193 end if;
142 end process; 194 end process;
143 195
144 -process(clk_65MHz)  
145 -begin  
146 -if clk_65MHz'event and clk_65MHz = '1' then  
147 196
148 --- Gestion du vga  
149 -  
150 - -- Syncro horizontale  
151 - if Hcount < 1025 then  
152 - -- affichage  
153 - Hsync <= '1';  
154 - Hcount <= Hcount + 1;  
155 - elsif Hcount < 1049 then  
156 - -- Fp  
157 - Hsync <= '1';  
158 - Hcount <= Hcount + 1;  
159 - elsif Hcount < 1185 then  
160 - -- Pw  
161 - Hsync <= '0';  
162 - Hcount <= Hcount + 1;  
163 - elsif Hcount < 1344 then  
164 - -- Bp  
165 - Hsync <= '1';  
166 - Hcount <= Hcount + 1;  
167 - else  
168 - Hcount <= 1;  
169 - end if;  
170 -  
171 - -- Synchro vertical  
172 - if Vcount < 1032193 then  
173 - -- Affichage de toutes les lignes  
174 - Vsync <= '1';  
175 - Vcount <= Vcount + 1;  
176 - elsif Vcount < (1032193 + 4032) then  
177 - --Fp  
178 - Vsync <= '1';  
179 - Vcount <= Vcount + 1;  
180 - elsif Vcount < (1032193 + 4032 + 8064) then  
181 - --Pw  
182 - Vsync <= '0';  
183 - Vcount <= Vcount + 1;  
184 - elsif Vcount < (1032192 + 4032 + 8064 + 38976) then  
185 - --Bp  
186 - Vsync <= '1';  
187 - Vcount <= Vcount + 1;  
188 - else  
189 - Vcount <= 1;  
190 - end if;  
191 -end if;  
192 -end process;  
193 end Behavioral; 197 end Behavioral;