Franchement, sérieusement comment je fais ? Qu'est-ce que je dois faire pour que mes lignes discontinue remontent d'en haut à la façon d'un tapis roulant ?
Si je descends, j'atteins la zone Blaking Time et au revoir mes lignes
Maintenant le second, qui permet l'affichage de mes lignes discontinues :
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
--Une procédure est un type de sous-programme en VHDL qui peut nous aider à éviter la répétition du code.
--Il est parfois nécessaire d'effectuer des opérations identiques à plusieurs endroits de la conception.
PACKAGE LIGNE_DISCONTINUE_DIMENSIONS_COULEURS IS
PROCEDURE LIGNE_DISCONTINUE
(
SIGNAL LIGNE_DISCONTINUE_current_pos_X,LIGNE_DISCONTINUE_current_pos_Y,Xpos,Ypos:IN INTEGER;
SIGNAL RGB_LIGNE_DISCONTINUE:OUT STD_LOGIC_VECTOR(3 downto 0);
SIGNAL DRAWING_LIGNE_DISCONTINUE: OUT STD_LOGIC;
CONSTANT LARGEUR_LIGNE_DISCONTINUE:INTEGER;
CONSTANT LONGUEUR_LIGNE_DISCONTINUE:INTEGER;
CONSTANT ecart: INTEGER;
CONSTANT discontinuite: INTEGER
---discontinuite2: INTEGER
);
END LIGNE_DISCONTINUE_DIMENSIONS_COULEURS;
PACKAGE BODY LIGNE_DISCONTINUE_DIMENSIONS_COULEURS IS
PROCEDURE LIGNE_DISCONTINUE
(
SIGNAL LIGNE_DISCONTINUE_current_pos_X,LIGNE_DISCONTINUE_current_pos_Y,Xpos,Ypos:IN INTEGER;
SIGNAL RGB_LIGNE_DISCONTINUE:OUT STD_LOGIC_VECTOR(3 downto 0);
SIGNAL DRAWING_LIGNE_DISCONTINUE: OUT STD_LOGIC;
CONSTANT LARGEUR_LIGNE_DISCONTINUE:INTEGER;
CONSTANT LONGUEUR_LIGNE_DISCONTINUE:INTEGER;
CONSTANT ecart : INTEGER;
--CONSTANT ecart2: INTEGER;
CONSTANT discontinuite : INTEGER
--CONSTANT discontinuite2 :INTEGER
)
IS
---------- Si le compteur atteint se situe dans les X et Y mentionnés ci-dessous, faire apparaitre le gazon
BEGIN
------------- Première bande de ligne discontinue
--- Si la ligne discontinue
IF ( (LIGNE_DISCONTINUE_current_pos_X>Xpos)
AND (LIGNE_DISCONTINUE_current_pos_X<Xpos+LARGEUR_LIGNE_DISCONTINUE)
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos)
AND (LIGNE_DISCONTINUE_current_pos_Y<Ypos+LONGUEUR_LIGNE_DISCONTINUE))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
LIGNE_DISCONTINUE_current_pos_X+1
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>Xpos)
AND (LIGNE_DISCONTINUE_current_pos_X<Xpos+LARGEUR_LIGNE_DISCONTINUE)
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos+LONGUEUR_LIGNE_DISCONTINUE+discontinuite)
AND (LIGNE_DISCONTINUE_current_pos_Y<Ypos+2*LONGUEUR_LIGNE_DISCONTINUE+discontinuite))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>Xpos)
AND (LIGNE_DISCONTINUE_current_pos_X<Xpos+LARGEUR_LIGNE_DISCONTINUE)
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos+2*LONGUEUR_LIGNE_DISCONTINUE+2*discontinuite)
AND (LIGNE_DISCONTINUE_current_pos_Y<Ypos+3*LONGUEUR_LIGNE_DISCONTINUE+2*discontinuite))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>Xpos)
AND (LIGNE_DISCONTINUE_current_pos_X<Xpos+LARGEUR_LIGNE_DISCONTINUE)
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos+3*LONGUEUR_LIGNE_DISCONTINUE+3*discontinuite)
AND (LIGNE_DISCONTINUE_current_pos_Y<Ypos+4*LONGUEUR_LIGNE_DISCONTINUE+3*discontinuite))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
---- Seconde bande de ligne discontinue
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>Xpos+ecart)
AND (LIGNE_DISCONTINUE_current_pos_X<(ecart+Xpos+LARGEUR_LIGNE_DISCONTINUE))
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos)
AND (LIGNE_DISCONTINUE_current_pos_Y<(Ypos+LONGUEUR_LIGNE_DISCONTINUE)))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>Xpos+ecart)
AND (LIGNE_DISCONTINUE_current_pos_X<(Xpos+ecart+LARGEUR_LIGNE_DISCONTINUE))
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos+(LONGUEUR_LIGNE_DISCONTINUE+discontinuite))
AND (LIGNE_DISCONTINUE_current_pos_Y<(Ypos+(2*LONGUEUR_LIGNE_DISCONTINUE)+discontinuite)))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>Xpos+ecart)
AND (LIGNE_DISCONTINUE_current_pos_X<(Xpos+ecart+LARGEUR_LIGNE_DISCONTINUE))
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos+2*LONGUEUR_LIGNE_DISCONTINUE+2*discontinuite)
AND (LIGNE_DISCONTINUE_current_pos_Y<Ypos+3*LONGUEUR_LIGNE_DISCONTINUE+2*discontinuite))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>Xpos+ecart)
AND (LIGNE_DISCONTINUE_current_pos_X<Xpos+ecart+LARGEUR_LIGNE_DISCONTINUE)
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos+3*LONGUEUR_LIGNE_DISCONTINUE+3*discontinuite)
AND (LIGNE_DISCONTINUE_current_pos_Y<Ypos+4*LONGUEUR_LIGNE_DISCONTINUE+3*discontinuite))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
---- Troisième bande de ligne discontinue
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>(Xpos+2*ecart))
AND (LIGNE_DISCONTINUE_current_pos_X<(Xpos+2*ecart+LARGEUR_LIGNE_DISCONTINUE))
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos)
AND (LIGNE_DISCONTINUE_current_pos_Y<Ypos+LONGUEUR_LIGNE_DISCONTINUE))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>Xpos+2*ecart)
AND (LIGNE_DISCONTINUE_current_pos_X<(Xpos+2*ecart+LARGEUR_LIGNE_DISCONTINUE))
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos+(LONGUEUR_LIGNE_DISCONTINUE+discontinuite))
AND (LIGNE_DISCONTINUE_current_pos_Y<(Ypos+(2*LONGUEUR_LIGNE_DISCONTINUE)+discontinuite)))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>Xpos+2*ecart)
AND (LIGNE_DISCONTINUE_current_pos_X<(Xpos+2*ecart+LARGEUR_LIGNE_DISCONTINUE))
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos+2*LONGUEUR_LIGNE_DISCONTINUE+2*discontinuite)
AND (LIGNE_DISCONTINUE_current_pos_Y<Ypos+3*LONGUEUR_LIGNE_DISCONTINUE+2*discontinuite))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
ELSIF( (LIGNE_DISCONTINUE_current_pos_X>Xpos+2*ecart)
AND (LIGNE_DISCONTINUE_current_pos_X<Xpos+2*ecart+LARGEUR_LIGNE_DISCONTINUE)
AND (LIGNE_DISCONTINUE_current_pos_Y>Ypos+3*LONGUEUR_LIGNE_DISCONTINUE+3*discontinuite)
AND (LIGNE_DISCONTINUE_current_pos_Y<Ypos+4*LONGUEUR_LIGNE_DISCONTINUE+3*discontinuite))THEN
RGB_LIGNE_DISCONTINUE<="1111";
DRAWING_LIGNE_DISCONTINUE<='1';
ELSE
DRAWING_LIGNE_DISCONTINUE<='0';
END IF;
END LIGNE_DISCONTINUE;
END LIGNE_DISCONTINUE_DIMENSIONS_COULEURS;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
--use work.RECTANGLE_DIMENSION_ET_COULEURS.all;
use work.DELIMITATIONS_TRONCONS.all;
use work.HERBE_DIMENSIONS_COULEURS.all;
use work.LIGNE_DISCONTINUE_DIMENSIONS_COULEURS.all;
ENTITY VGA_CONTROLEUR_PARTIE2 IS
PORT(
CLK_25M : IN STD_LOGIC; -- Horloge principale
RESET : IN STD_LOGIC; -- Reset. Permet de réintialiser le contrôleur VGA
HS_SIGNAL, VS_SIGNAL : OUT STD_LOGIC;-- Signaux de synchronisation
VGA_R,VGA_G,VGA_B : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--- Couleurs RGB du VGA
LEFT_BUTTON, RIGHT_BUTTON: IN STD_LOGIC
);
END VGA_CONTROLEUR_PARTIE2;
ARCHITECTURE MAIN OF VGA_CONTROLEUR_PARTIE2 IS
SIGNAL CNT_H : INTEGER RANGE 0 TO 793:=0;
SIGNAL CNT_V: INTEGER RANGE 0 TO 525:=0; -- Compteur horizontal et vertical.
------------
CONSTANT H_VISIBLE:INTEGER:=635;
CONSTANT H_FP:INTEGER:=15;
CONSTANT H_SYNC:INTEGER:=95;
CONSTANT H_BP :INTEGER:=48;
------------
CONSTANT V_VISIBLE:INTEGER:=480;
CONSTANT V_FP:INTEGER:=10;
CONSTANT V_SYNC:INTEGER:=2;
CONSTANT V_BP:INTEGER:=33;
------------------ Bande d'herbes de gauche et de droite
-------- Apparition
SIGNAL DRAWING_HERBE_1: STD_LOGIC := '0';
SIGNAL DRAWING_HERBE_2: STD_LOGIC := '0';
-- Point de référence du point du bande d'herbes de gauche
SIGNAL HERBE_X1 : INTEGER RANGE 0 TO 635:=0;
SIGNAL HERBE_Y1: INTEGER RANGE 0 TO 525:=0;
-------------------
--Point de référence du point du bande d'herbes de droite
SIGNAL HERBE_X2: INTEGER RANGE 0 TO 635:=471;
SIGNAL HERBE_Y2: INTEGER RANGE 0 TO 525:=0;
------------------ Tous les bandes d(herbes
-- Largeur et longueur des deux bandes d'HERBES
CONSTANT LARGEUR_HERBE:INTEGER RANGE 0 TO 635:= 182;
CONSTANT LONGUEUR_HERBE:INTEGER RANGE 0 TO 525:= 480;
-- Couleur de tous les bandes d'HERBES
SIGNAL RGB_HERBE_1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL RGB_HERBE_2 : STD_LOGIC_VECTOR(3 DOWNTO 0);
------------------ Bande d'herbes de gauche et de droite
-------- Apparition
SIGNAL DRAWING_DELIMITATIONS_TRANCON_1: STD_LOGIC := '0';
SIGNAL DRAWING_DELIMITATIONS_TRANCON_2: STD_LOGIC := '0';
--Point de référence du point du bande d'herbes de gauche
SIGNAL DELIMITATIONS_TRANCON_X1 : INTEGER :=182;
SIGNAL DELIMITATIONS_TRANCON_Y1: INTEGER RANGE 0 TO 525:=0;
-------------------
--Point de référence du point du bande d'herbes de droite
SIGNAL DELIMITATIONS_TRANCON_X2: INTEGER:=466;
SIGNAL DELIMITATIONS_TRANCON_Y2: INTEGER RANGE 0 TO 525:=0;
------------------ Tous les bandes d(herbes
-- Largeur et longueur des deux bandes d'HERBES
CONSTANT LARGEUR_DELIMITATIONS_TRANCON:INTEGER := 5;
CONSTANT LONGUEUR_DELIMITATIONS_TRANCON:INTEGER := 480;
-- Couleur de tous les bandes d'HERBES
SIGNAL RGB_DELIMITATIONS_TRANCON_1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL RGB_DELIMITATIONS_TRANCON_2 : STD_LOGIC_VECTOR(3 DOWNTO 0);
-- Point de référence du point du bande d'herbes de gauche
SIGNAL LIGNE_DISCONTINUE_X : INTEGER:=254;
SIGNAL LIGNE_DISCONTINUE_Y : INTEGER:=0;
--
SIGNAL RGB_LIGNE_DISCONTINUE : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL DRAWING_LIGNE_DISCONTINUE : STD_LOGIC;
------------------ Tous les bandes d(herbes
-- Largeur et longueur des deux bandes d'HERBES
CONSTANT LARGEUR_LIGNE_DISCONTINUE:INTEGER := 2;
CONSTANT LONGUEUR_LIGNE_DISCONTINUE:INTEGER := 100;
-- Couleur de tous les bandes d'HERBES
CONSTANT ecart: INTEGER :=67;
CONSTANT discontinuite: INTEGER:=20;
--discontinuite2:INTEGER :=20;
BEGIN
--- Coordonnées du point de référence de nos bandes d'herbes
HERBE(CNT_H,CNT_V,HERBE_X1,HERBE_Y1,RGB_HERBE_1,DRAWING_HERBE_1,LARGEUR_HERBE,LONGUEUR_HERBE);
HERBE(CNT_H,CNT_V,HERBE_X2,HERBE_Y2,RGB_HERBE_2,DRAWING_HERBE_2,LARGEUR_HERBE,LONGUEUR_HERBE);
--- Coordonnées du point de référence de nos délimitations de trançons
DELIMITATIONS_TRONCON(
CNT_H,CNT_V,
DELIMITATIONS_TRANCON_X1,DELIMITATIONS_TRANCON_Y1,
RGB_DELIMITATIONS_TRANCON_1,DRAWING_DELIMITATIONS_TRANCON_1,
LARGEUR_DELIMITATIONS_TRANCON,LONGUEUR_DELIMITATIONS_TRANCON);
DELIMITATIONS_TRONCON(
CNT_H,CNT_V,
DELIMITATIONS_TRANCON_X2,DELIMITATIONS_TRANCON_Y2,
RGB_DELIMITATIONS_TRANCON_2,DRAWING_DELIMITATIONS_TRANCON_2,
LARGEUR_DELIMITATIONS_TRANCON,LONGUEUR_DELIMITATIONS_TRANCON);
-----------------------------------------------------------------------------
LIGNE_DISCONTINUE(CNT_H,CNT_V,LIGNE_DISCONTINUE_X,LIGNE_DISCONTINUE_Y,
RGB_LIGNE_DISCONTINUE, DRAWING_LIGNE_DISCONTINUE,
LARGEUR_LIGNE_DISCONTINUE,LONGUEUR_LIGNE_DISCONTINUE,ecart,discontinuite);
PROCESS(CLK_25M,RESET)
BEGIN
-- Si le reset est allumé, mettre le compteur et les les couleurs RGB à 0
IF(RESET = '1') THEN
CNT_H <= 0;
CNT_V <= 0;
VS_SIGNAL<='0';
HS_SIGNAL<='0';
VGA_R <= (OTHERS => '0');
VGA_G <= (OTHERS => '0');
VGA_B <= (OTHERS => '0');
ELSIF(CLK_25M'EVENT AND CLK_25M = '1') THEN
-------------- Rectangle de gauche : conditions d'apparition
--- Si on arrive dans la position du rectangle de gauche, tout allumer. Sinon tout éteindre
------------ Rectangle du milieu :conditions d'apparition
IF(((DRAWING_DELIMITATIONS_TRANCON_1='0') AND (DRAWING_DELIMITATIONS_TRANCON_2='0')) AND
(DRAWING_HERBE_2='0') AND (DRAWING_HERBE_1='0')) THEN
VGA_R<=(OTHERS=>'0');
VGA_G<=(OTHERS=>'0');
VGA_B<=(OTHERS=>'0');
END IF;
IF(DRAWING_HERBE_1='1') THEN
VGA_R<=(OTHERS=>'0');
VGA_G<=(OTHERS=>'1');
VGA_B<=(OTHERS=>'0');
END IF;
IF(DRAWING_DELIMITATIONS_TRANCON_1='1') THEN
VGA_R<=(OTHERS=>'1');
VGA_G<=(OTHERS=>'1');
VGA_B<=(OTHERS=>'1');
END IF;
IF(DRAWING_LIGNE_DISCONTINUE ='1') THEN
VGA_R<=(OTHERS=>'1');
VGA_G<=(OTHERS=>'1');
VGA_B<=(OTHERS=>'1');
END IF;
IF(DRAWING_DELIMITATIONS_TRANCON_2='1') THEN
VGA_R<=(OTHERS=>'1');
VGA_G<=(OTHERS=>'1');
VGA_B<=(OTHERS=>'1');
END IF;
IF(DRAWING_HERBE_2='1')THEN
VGA_R<=(OTHERS=>'0');
VGA_G<=(OTHERS=>'1');
VGA_B<=(OTHERS=>'0');
END IF;
-- Creation du compteur cnt_h. Tant que le compteur horizontal n'est pas égal à 792, incrémenter le compteur de 1.
IF(CNT_H < (H_VISIBLE + H_FP + H_SYNC + H_BP)) THEN
CNT_H <= CNT_H + 1 ;
ELSE
CNT_H <= 0;
-- Creation du compteur cnt_v. Tant que le compteur horizontal n'est pas égal à 792 et le compteur vertical ) 524, mettre à 0.
-- Autrement incrémenter le compteur vertical à 1
IF(CNT_V < (V_VISIBLE + V_FP + V_SYNC + V_BP)) THEN
CNT_V <= CNT_V + 1;
ELSE
CNT_V <=0;
LIGNE_DISCONTINUE_Y<=LIGNE_DISCONTINUE_Y+1;
END IF;
END IF;
--Gestion du signal horizontal.
-- Si le compteur horizontal est entre 650, et 745, enclencher le Blanking Time. Autrement, enclencher le Display Time.
IF((CNT_H > H_VISIBLE+H_FP) AND (CNT_H < H_VISIBLE+H_FP+H_SYNC)) THEN
HS_SIGNAL <= '0';
ELSE
HS_SIGNAL <= '1';
END IF;
--- Gestion du signal vertical. Même chose qu'en haut mais avec le compteur vertical.
IF((CNT_V>V_VISIBLE + V_FP) AND (CNT_V <V_VISIBLE + V_FP+ V_SYNC)) THEN
VS_SIGNAL <= '0';
ELSE
VS_SIGNAL <= '1';
END IF;
END IF;
END PROCESS;
END MAIN;
Voilà mon programme principal.
signaux de synchronisations verticaux et horizontaux ?
Mon projet est un jeu de voitures sur VHDL avec un FPGA Cyclone II sur Quartus. Mon morceau de route est constitué de 12 lignes discontinues et de deux lignes continues, le reste de l'écran étant de l'herbe. J'arrive à afficher tout ça figé, mais je voudrais que mes lignes discontinues bouclent.
Vous avez une idée ?