Advertisement
thibthibaut

Pong

Dec 16th, 2014
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 7.79 KB | None | 0 0
  1.  ----------------------------------------------------------------------------------
  2.  -- Company:
  3.  -- Engineer:
  4.  --
  5.  -- Create Date:    09:55:25 11/21/2014
  6.  -- Design Name:
  7.  -- Module Name:    Counter - Behavioral
  8.  -- Project Name:
  9.  -- Target Devices:
  10.  -- Tool versions:
  11.  -- Description:
  12.  --
  13.  -- Dependencies:
  14.  --
  15.  -- Revision:
  16.  -- Revision 0.01 - File Created
  17.  -- Additional Comments:
  18.  --
  19.  ----------------------------------------------------------------------------------
  20.  library IEEE;
  21.  use IEEE.STD_LOGIC_1164.ALL;
  22.  use ieee.std_logic_unsigned.all;
  23.  
  24.  -- Uncomment the following library declaration if using
  25.  -- arithmetic functions with Signed or Unsigned values
  26.  use IEEE.NUMERIC_STD.ALL;
  27.  
  28.  -- Uncomment the following library declaration if instantiating
  29.  -- any Xilinx primitives in this code.
  30.  --library UNISIM;
  31.  --use UNISIM.VComponents.all;
  32.  
  33.  entity VGADriver is
  34.       Port ( Reset : in  STD_LOGIC;
  35.                 CLK50 : in  STD_LOGIC;
  36.                 P1, P2 : in STD_LOGIC;
  37.                 R, G, B, Hsync, Vsync : out STD_LOGIC);
  38.  end VGADriver;
  39.  
  40.  architecture Behavioral of VGADriver is
  41.  
  42.  signal Add1, Add2 : STD_LOGIC_VECTOR(9 downto 0);
  43.  signal Reg1, Reg2 : STD_LOGIC_VECTOR(9 downto 0);
  44.  signal Mux1, Mux2 : STD_LOGIC_VECTOR(9 downto 0);
  45.  signal Cmp1, Cmp2 : STD_LOGIC;
  46.  
  47.  signal Rows : STD_LOGIC_VECTOR(9 downto 0) := "1100100000";
  48.  signal Columns : STD_LOGIC_VECTOR(9 downto 0) := "1000001001";
  49.  
  50.  signal CLK : STD_LOGIC;
  51.  
  52.  ----------- PLAYER -----------------
  53.  signal PosX, RegX : STD_LOGIC_VECTOR(9 downto 0) := "0010010000";
  54.  signal PosY, RegY : STD_LOGIC_VECTOR(9 downto 0) := "0000100000";
  55.  
  56.  signal AddX, SubX : STD_LOGIC_VECTOR(9 downto 0);
  57.  signal AddY, SubY : STD_LOGIC_VECTOR(9 downto 0);
  58.  
  59.   ----------- PLAYER 2 -----------------
  60.  signal Pos2X, Reg2X : STD_LOGIC_VECTOR(9 downto 0) := "1100000000";
  61.  signal Pos2Y, Reg2Y : STD_LOGIC_VECTOR(9 downto 0) := "0000100000";
  62.  
  63.  signal Add2X, Sub2X : STD_LOGIC_VECTOR(9 downto 0);
  64.  signal Add2Y, Sub2Y : STD_LOGIC_VECTOR(9 downto 0);
  65.  
  66.  ----------- SCORES --------------------
  67.  signal Score1, Score2 : STD_LOGIC_VECTOR(6 downto 0) := "1111111";
  68.  signal RegS1, RegS2 : STD_LOGIC_VECTOR(6 downto 0) := "1111111";
  69.  signal SubS1, SubS2 : STD_LOGIC_VECTOR(6 downto 0);
  70.  
  71.  -----------  BOT  ---------------------
  72.  signal BPosX, BRegX : STD_LOGIC_VECTOR(9 downto 0) := "0100000000";
  73.  signal BPosY, BRegY : STD_LOGIC_VECTOR(9 downto 0) := "0010000000";
  74.  
  75.  
  76.  signal BAddX, BSubX : STD_LOGIC_VECTOR(9 downto 0);
  77.  signal BAddY, BSubY : STD_LOGIC_VECTOR(9 downto 0);
  78.  
  79.  signal BRightReg, BDownReg : STD_LOGIC := '1';
  80.  signal BRightMux, BDownMux : STD_LOGIC;
  81.  
  82.  ----------- TIMER ------------------
  83.  signal TimerReg, TimerAdd, TimerMux : STD_LOGIC_VECTOR(25 downto 0);
  84.  signal TimerCmp, TimerCmpBot : STD_LOGIC;
  85.  
  86.  begin
  87.  
  88.  
  89. --posX <= posX + 1 when Right = '1' else posX - 1 when Left = '1';
  90. --posY <= posY + 1 when Down = '1'  else posY - 1 when Up = '1';
  91.  
  92. CLK <= not(CLK) when rising_edge(CLK50);
  93.  
  94. Hsync <= '0' when 0 <= Reg1 and Reg1 < 96 else '1';
  95.  
  96. Vsync <= '0' when 0 <= Reg2 and Reg2 < 2 else '1';
  97.  
  98. R <= '0' when (0 <= Reg1 and Reg1 < 144) OR (144+640 <= Reg1 and Reg1 < 144+640+16) OR (0 <= Reg2 and Reg2 < 31) OR (31+480 <= Reg2 and Reg2 < 31+480+10) else
  99.         '1' when ((Pos2X <= Reg1 and Reg1 < Pos2X+16) and (Pos2Y <= Reg2 and Reg2 < Pos2Y+64)) or ((Reg1 > 464 and Reg1 < 464 + Score2) and (Reg2 > 489 and Reg2 < 505)) else
  100.         '0';
  101. G <= '0' when (0 <= Reg1 and Reg1 < 144) OR (144+640 <= Reg1 and Reg1 < 144+640+16) OR (0 <= Reg2 and Reg2 < 31) OR (31+480 <= Reg2 and Reg2 < 31+480+10) else
  102.         '1' when (BPosX <= Reg1 and Reg1 < BPosX+16) and (BPosY <= Reg2 and Reg2 < BPosY+16) else
  103.         '0';
  104. B <= '0' when (0 <= Reg1 and Reg1 < 144) OR (144+640 <= Reg1 and Reg1 < 144+640+16) OR (0 <= Reg2 and Reg2 < 31) OR (31+480 <= Reg2 and Reg2 < 31+480+10) else
  105.         '1' when (PosX <= Reg1 and Reg1 < PosX+16) and (PosY <= Reg2 and Reg2 < PosY+64) else
  106.         '0';
  107.                                    
  108. ----------------------------------------
  109.  
  110.  Add1 <= Reg1 + "0000000001";
  111.  
  112.  Mux1 <= Add1 when Cmp1 = '0' else "0000000000" when Cmp1 = '1';
  113.  
  114.  Cmp1 <= '1' when Add1 > Rows else '0';
  115.  
  116.  Reg1 <= "0000000000" when Reset = '0' else Mux1 when rising_edge(CLK);
  117.  
  118. -----------------------------------------
  119.  
  120.  Add2 <= Reg2 + "0000000001";
  121.  
  122.  Mux2 <= "0000000000" when Cmp2 = '1' and Cmp1='1' else
  123.          Add2 when Cmp2 = '0' and Cmp1 = '1' else
  124.             Reg2;
  125.  
  126.  Cmp2 <= '1' when Add2 > Columns else '0';
  127.  
  128.  Reg2 <= "0000000000" when Reset = '0' else Mux2 when rising_edge(CLK);
  129.  
  130. -----------------------------------------
  131. -- Timer
  132.                        
  133. TimerAdd <= TimerReg + "00000000000000000000000001";
  134. TimerReg <= TimerMux when rising_edge(CLK);
  135. TimerMux <= "00000000000000000000000000" when TimerCmp = '1' else
  136.                 TimerAdd ;
  137. TimerCmp <= '1' when TimerAdd > "00000000111010000100100000" else '0';
  138. TimerCmpBot <= '1' when TimerAdd > "00000001011010000100100000" else '0';
  139.  
  140. -----------------------------------------
  141. -- PosX
  142.  
  143. --RegX <= PosX when rising_edge(CLK) ;
  144.  
  145. --AddX <= RegX + "0000000001";
  146. --SubX <= RegX - "0000000001";
  147.  
  148. --PosX <= AddX when (Right = '1' and TimerCmp = '1' and RegX < "1100000000") else
  149. --        SubX when (Right = '0' and TimerCmp = '1' and RegX > "0010010000") else
  150. --        "0010010000" when Reset = '0' else
  151. --        RegX;
  152.          
  153. -----------------------------------------
  154. -- PLAYER 1 - PosY
  155.  
  156. RegY <= PosY when rising_edge(CLK) ;
  157.  
  158. AddY <= RegY + "0000000011";
  159. SubY <= RegY - "0000000011";
  160.  
  161. PosY <= AddY when (P1 = '1' and TimerCmp = '1' and RegY < 457) else
  162.           SubY when (P1 = '0' and TimerCmp = '1' and RegY > 31) else
  163.           "0010010000" when Reset = '0' else
  164.           RegY;
  165.        
  166. -----------------------------------------
  167. -- PLAYER 2 - PosY
  168.  
  169. Reg2Y <= Pos2Y when rising_edge(CLK) ;
  170.  
  171. Add2Y <= Reg2Y + "0000000011";
  172. Sub2Y <= Reg2Y - "0000000011";
  173.  
  174. Pos2Y <= Add2Y when (P2 = '1' and TimerCmp = '1' and Reg2Y < 457) else
  175.           Sub2Y when (P2 = '0' and TimerCmp = '1' and Reg2Y > 31) else
  176.           "0010010000" when Reset = '0' else
  177.           Reg2Y;       
  178.          
  179.          
  180. ------------------------------------------
  181. -- Bot X
  182.  
  183. BRegX <= BPosX when rising_edge(CLK);
  184.  
  185. BAddX <= BRegX + "0000000011";
  186. BSubX <= BRegX - "0000000011";
  187.  
  188. BPosX <= BAddX when (BRightMux = '1' and TimerCmp = '1') else
  189.           BSubX when (BRightMux = '0' and TimerCmp = '1') else
  190.           "0100000000" when Reset = '0' else
  191.           BRegX;
  192.                      
  193. BRightReg <= BRightMux when rising_edge(CLK);
  194. BRightMux <= '1' when (BRightReg = '0' and (BRegX < "0010010000" or (BRegX < RegX+16 and (BRegY<RegY+64 and BRegY>RegY)))) else --(  (BRegX < RegX+16 and (BRegY<RegY+64 or BRegY>RegY)))) else
  195.                  '0' when (BRightReg = '1' and (BRegX > "1100000000" or (BRegX+16 > Reg2X and (BRegY<Reg2Y+64 and BRegY>Reg2Y)))) else-- ) else --or (BRegX+16 > RegX and (BRegY<RegY+64 or BRegY+64>RegY)))) else
  196.                  BRightReg;
  197.  
  198. -----------------------------------------
  199. -- Bot Y
  200. BRegY <= BPosY when rising_edge(CLK);
  201.  
  202. BAddY <= BRegY + "0000000011";
  203. BSubY <= BRegY - "0000000011";
  204.  
  205. BPosY <= BAddY when (BDownMux = '1' and TimerCmp = '1') else
  206.           BSubY when (BDownMux = '0' and TimerCmp = '1') else
  207.           "0010000000" when Reset = '0' else
  208.           BRegY;
  209.  
  210. BDownReg <= BDownMux when rising_edge(CLK);
  211. BDownMux <= '1' when (BDownReg = '0' and BRegY < 31) else --or (BRegY < RegY+16 and (BRegX<RegX+16 or BRegX+16>RegX) ))
  212.                 '0' when (BDownReg = '1' and BRegY > 473) else --or (BRegY+16 > RegY and (BRegX<RegX+16 or BRegX+16>RegX) )) ) else
  213.                 BDownReg;
  214.                
  215.                
  216. -----------------------------------------
  217. -- Score 1
  218. RegS1 <= Score1 when rising_edge(CLK);
  219.  
  220. SubS1 <= RegS1 - "0001000";
  221.  
  222. Score1 <= SubS1 when BRegX > "1100000000" else RegS1;
  223.  
  224.  
  225. -----------------------------------------
  226. -- Score 2
  227. RegS2 <= Score2 when rising_edge(CLK);
  228.  
  229. SubS2 <= RegS2 - "0001000";
  230.  
  231. Score2 <= SubS2 when BRegX < "0010010000" else RegS2;
  232.  
  233.  end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement