Altera_Forum
Honored Contributor
14 years agopong game
i tried to run pong game in fpga prototyping with vhdl examples book chapter 13 but i couldn't run that can you help me
i tried to run pong game in fpga prototyping with vhdl examples book chapter 13 but i couldn't run that can you help me
not without knowing whats wrong.
i used codes in the book i want to write in the vga pau logo but i couldn't that
Please post the code you're trying to get working, and tell us the errors.
these are codes
library ieee; use ieee. std_logic_1164. all ; use ieee. numeric_std. all ; entity pong_graph_animate is port ( clk, reset : std_logic ; btn: std_logic_vector (1 downto 0 ) ; video_on: in std_logic; pixel_x , pixel_y : in std_logic_vector ( 9 downto 0) ; graph_rgb : out std_logic_vector (2 downto 0); hit:out std_logic; gra_still: in std_logic; miss: in std_logic; graph_on : in std_logic ) ; end pong_graph_animate ; architecture arch of pong_graph_animate is signal refr_tick : std_logic; --x , y c o o r d i n a t e s (0,0) to ( 639 , 479 ) signal pix_x,pix_y : unsigned ( 9 downto 0) ; constant MAX_X: integer :=640; constant MAX_Y: integer:=480; -- w a l l l e f t , r i g h t b o u n d a r y constant WALL_X_L : integer :=32 ; constant WALL_X_R: integer :=35; -- b a r l e f t , r i g h t b o u n d a r y constant BAR_X_L: integer :=600; constant BAR_X_R: integer :=603; --b a r t o p , b o t t o m b o u n d a r y signal bar_y_t , bar_y_b : unsigned ( 9 downto 0) ; constant BAR_Y_SIZE: integer :=72; -- reg t o t r a c k t o p b o u n d a r y ( x p o s i t i o n is f i x e d ) signal bar_y_reg , bar_y_next : unsigned ( 9 downto 0) ; -- b a r moving v e l o c i t y when a b u t t o n i s p r e s s e d constant BAR_V: integer:=4; -- s q u a r e b a l l constant BALL_SIZE: integer:=8; -- 8 -- b a l l l e f t , r i g h t b o u n d a r y signal ball_x_l, ball_x_r : unsigned ( 9 downto 0) ; -- b a l l t o p , b o t t o m b o u n d a r y signal ball_y_t , ball_y_b : unsigned (9 downto 0) ; -- reg t o t r a c k l e f t , t o p b o u n d a r y signal ball_x_reg , ball_x_next ,ball_vx_reg : unsigned ( 9 downto 0) ; signal ball_y_reg , ball_y_next ,ball_vy_reg : unsigned ( 9 downto 0) ; --reg t o t r a c k b a l l s p e e d signal x_delta_reg , x_delta_next : unsigned ( 9 downto 0 ) ; signal y_delta_reg , y_delta_next : unsigned ( 9 downto 0 ) ; -- b a l l v e l o c i t y c a n be p o s o r neg constant BALL_V_P : unsigned ( 9 downto 0 ) := to_unsigned ( 2,10) ; constant BALL_V_N: unsigned ( 9 downto 0) := unsigned ( to_signed (-2,10)); -- r o u n d b a l l i m a g e ROM type rom_type is array (0 to 7 ) of std_logic_vector ( 0 to 7 ) ; -- ROM d e f i n i t i o n constant BALL_ROM: rom_type := ( "00111100" , -- * * * * "01111110", -- * * * * * * "11111111", -- * * * * * * * * "11111111", -- * * * * * * * * "11111111", -- * * * * * * * * "11111111", -- * * * * * * * * "01111110", -- * * * * * * "00111100" --* * * * ) ; signal rom_addr , rom_col : unsigned ( 2 downto 0 ) ; signal rom_data : std_logic_vector ( 7 downto 0) ; signal rom_bit : std_logic ; -- o b j e c t o u t p u t s i g n a l s signal wall_on ,bar_on , sq_ball_on , rd_ball_on : std_logic ; signal wall_rgb,bar_rgb , ball_rgb : std_logic_vector ( 2 downto 0) ; begin -- r e g i s t e r s process ( clk , reset) begin if reset = '1' then bar_y_reg <= ( others => '0' ) ; ball_x_reg <= ( others => '0' ) ; ball_y_reg <= ( others => '0' ) ; x_delta_reg <= ( "0000000100" ) ; y_delta_reg <= ( "0000000100") ; elsif( clk'event and clk = '1' ) then bar_y_reg <= bar_y_next ; ball_x_reg <= ball_x_next ; ball_y_reg <= ball_y_next ; x_delta_reg <= x_delta_next ; y_delta_reg <= y_delta_next ; end if ; end process; pix_x <= unsigned ( pixel_x ) ; pix_y <= unsigned ( pixel_y ) ; refr_tick <= '1' when ( pix_y = 481 ) and (pix_x=0) else '0'; wall_on <='1' when (WALL_X_L <= pix_x ) and (pix_x<=WALL_X_R) else '0'; wall_rgb <= "001"; -- b l u e -- b o u n d a r y bar_y_t <= bar_y_reg ; bar_y_b <= bar_y_t + BAR_Y_SIZE - 1; -- p i x e l w i t h i n b a r bar_on <= '1' when (BAR_X_L<=pix_x) and (pix_x<=BAR_X_R) and (bar_y_t <= pix_y ) and ( pix_y <= bar_y_b ) else '0' ; -- b a r r g b o u t p u t bar_rgb <= "001" ; --green -- new b a r y - p o s i t i o n process ( bar_y_reg , bar_y_b , bar_y_t , refr_tick , btn) begin bar_y_next <= bar_y_reg ; -- no move if refr_tick = '1' then if btn (1) = '1' and bar_y_b<(MAX_Y-1-BAR_V) then bar_y_next <= bar_y_reg + BAR_V; -- move down elsif btn ( 0 ) = '1'and bar_y_t > BAR_V then bar_y_next <= bar_y_reg - BAR_V ; -- move up end if; end if; end process; -- s q u a r e b a l l -- b o u n d a r y ball_x_l <= ball_x_reg ; ball_y_t <= ball_y_reg ; ball_x_r <= ball_x_l + BALL_SIZE - 1; ball_y_b <= ball_y_t + BALL_SIZE - 1; -- p i x e l w i t h i n b a l l sq_ball_on <= '1' when ( ball_x_l <= pix_x ) and ( pix_x <= ball_x_r ) and ( ball_y_t <= pix_y ) and ( pix_y <= ball_y_b ) else '0' ; -- map c u r r e n t p i x e l l o c a t i o n t o ROM a d d r / c o l rom_addr <= pix_y(2 downto 0) - ball_y_t(2 downto 0 ) ; rom_col <= pix_x(2 downto 0 ) - ball_x_l(2 downto 0 ) ; rom_data <= BALL_ROM(to_integer(rom_addr)); rom_bit <= rom_data(to_integer(rom_col)); -- p i x e l w i t h i n b a l l rd_ball_on<='1'when (sq_ball_on='1') and (rom_bit='1') else '0' ; ball_rgb <= "100" ; -- red ball_x_next <= to_unsigned((MAX_X)/2,10) when gra_still='1' else ball_x_reg + ball_vx_reg when refr_tick='1' else ball_x_reg ; ball_y_next <= to_unsigned((MAX_Y)/2,10) when gra_still='1' else ball_y_reg + ball_vy_reg when refr_tick='1' else ball_y_reg ; process ( ball_vx_reg , ball_vy_reg , ball_y_t,ball_x_l, ball_x_r , ball_y_t,ball_y_b,bar_y_t,bar_y_b,gra_still,hit,miss) begin hit <= '0' ; miss <= '0' ; ball_vx_next <= ball_vx_reg; ball_vy_next <= ball_vy_reg; if gra_still= '1' then -- i n i t i a 1 v e 1 o c i t y ball_vx_next <= BALL_V_N; ball_vy_next <= BALL_V_P; elsif ball_y_t < 1 then ball_vy_next <= BALL_V_P; elsif ball_y_b > (MAX_Y-1) then -- r e a c h b o t t o m ball_vy_next <= BALL_V_N; elsif ball_x_1 <= WALL_X_R then -- r e a c h w a l l ball_vx_next <= BALL_V_P; -- b o u n c e b a c k elsif (BAR-X-L <=ball-x-r) and (ball-x-r <=BAR-X-R) and (bar_y_t<=ball_y_b) and (ball_y_t<=bar_y_b) then -- r e a c h x of r i g h t b a r , a h i t ball_vx_next <= BALL_V_N; -- b o u n c e b a c k hit <= '1'; elsif (ball_x_r>MAX_X) then --r e a c h r i g h t b o r d e r miss <= '1' ; -- a mi s s end if ; end process ; graph_on <= wall_on or bar_on or rd_ball_on; process(video_on,wall_on,bar_on,rd_ball_on, wall_rgb, bar_rgb, ball_rgb) begin if video_on='0' then graph_rgb <= "000" ; --blank else if wall_on = '1' then graph_rgb <= wall_rgb; elsif bar_on = '1' then graph_rgb<= bar_rgb ; elsif rd_ball_on = '1' then graph_rgb <= ball_rgb; else graph_rgb <= "110"; -- y e l l o w background end if ; end if ; end process ; end arch; errors can't write to interface object ''miss'' of mode IN interface object ''hit''of mode out cannot be read.change object mode to buffer i added the hit:out std_logic, gra_still: in std_logic, miss: in std_logic, graph_on : in std_logic error can be from thisI think your error is self explanitory.
You cannot write to an input port. You need to make it an output. Also, outputs cannot be read internally. Either make it a buffer (like it suggests) or use an internal signal.