---------------------------------------------------------------------------------- -- Company: IUT de Nantes -- Engineer: Eric PERONNIN -- -- Create Date: 08.02.2021 14:42:08 -- Design Name: -- Module Name: ipPong_core - Behavioral -- Project Name: ZyboPong -- Target Devices: Zynq-7010 -- Tool Versions: -- Description: Génération des signaux VGA pour créer l'image du jeu Pong -- 1 filet blanc, 2 raquettes, 1 balle -- Dependencies: -- -- Revision: -- Revision 0.01 - File Created -- Additional Comments: -- ---------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values use IEEE.NUMERIC_STD.ALL; entity ipPong_core is Port ( clk : in STD_LOGIC; yRaqG, yRaqD : in STD_LOGIC_VECTOR (9 downto 0) := (others => '0'); xBalle, yBalle : in STD_LOGIC_VECTOR (9 downto 0) := (others => '0'); rouge, vert, bleu : out STD_LOGIC_VECTOR (4 downto 0) := (others => '0'); hs : out STD_LOGIC := '1'; vs : out STD_LOGIC := '1'); end ipPong_core; architecture Behavioral of ipPong_core is -- Définitions pour le signal de synchronisation horizontale constant PIXELS_PER_LINE : integer := 800; constant VISIBLE_PIXELS_PER_LINE : integer := 640; constant HS_FRONT_PORCH : integer := 16; constant HS_PULSE_WIDTH : integer := 96; -- Définitions pour le signal de synchronisation verticale constant LINES_PER_FRAME : integer := 521; constant VISIBLE_LINES_PER_FRAME : integer := 480; constant VS_FRONT_PORCH : integer := 10; constant VS_PULSE_WIDTH : integer := 2; -- Coordonnées du pixel en cours d'affichage (si dans la "vidéo active") signal x : integer range 0 to 1023 := 0; signal y : integer range 0 to 1023 := 0; -- Compteur pour la division par 4 de clk pour arriver à 25MHz signal cptDiv : UNSIGNED (1 downto 0) := "00"; -- Constantes du jeu constant HAUTEUR_RAQUETTE : integer := 60; constant LARGEUR_RAQUETTE : integer := 8; constant DIAMETRE_BALLE : integer := 12; constant X_RAQUETTE_G : integer := 5+LARGEUR_RAQUETTE; constant X_RAQUETTE_D : integer := 635-LARGEUR_RAQUETTE; -- Ordonnées des raquettes. Coordonnées de la balle -- Ces signaux locaux représentent les signaux externes yRaqG, yRaqD, xBalle, yBalle convertis en integer. -- La conversion n'est réalisée qu'en début d'image. -- Exemple de prise en compte et conversion : iyRaqG <= TO_INTEGER(UNSIGNED(yRaqG)); signal iyRaqG : integer range 0 to 1023 := 0; signal iyRaqD : integer range 0 to 1023 := 0; signal ixBalle, iyBalle : integer range 0 to 1023 := 0; -- Utile pour le dessin de la balle ronde signal tempX, tempY : integer range 0 to 1023 := 0; begin -- Process du balayage vidéo -- Génération des signaux de synchronisation hs et vs -- x et y indiquent à tout instant les coordonnées du point balayé. -- A noter que Fclk = 100MHz et que le VGA possède une fréquence pixel de 25MHz. process(clk) begin if rising_edge(clk) then if cptDiv = 3 then cptDiv <= "00"; -- Traiter ici la génération des signaux hs, vs avec l'évolution de x, y, hs, vs... else cptDiv <= cptDiv + 1; end if; end if; end process; -- Calcul de la couleur du point à afficher en fonction de x et y, les coordonnées du point en cours de balayage. process(clk, x, y) begin if (x < 640) and (y < 480) then -- Dessin du filet -- Dessin de la raquette gauche -- Dessin de la raquette droite -- Dessin de la balle end if; end process; end Behavioral;