Intel® FPGA University Program
University Program Material, Education Boards, and Laboratory Exercises
Announcements
Intel Support hours are Monday-Fridays, 8am-5pm PST, except Holidays. Thanks to our community members who provide support during our down time or before we get to your questions. We appreciate you!

Need Forum Guidance? Click here
Search our FPGA Knowledge Articles here.

pong game

Altera_Forum
Honored Contributor I
922 Views

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

0 Kudos
6 Replies
Altera_Forum
Honored Contributor I
123 Views

not without knowing whats wrong.

Altera_Forum
Honored Contributor I
123 Views

i used codes in the book i want to write in the vga pau logo but i couldn't that

Altera_Forum
Honored Contributor I
123 Views

Please post the code you're trying to get working, and tell us the errors.

Altera_Forum
Honored Contributor I
123 Views

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 this
Altera_Forum
Honored Contributor I
123 Views

I 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.
Altera_Forum
Honored Contributor I
123 Views

 

--- Quote Start ---  

I 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. 

--- Quote End ---  

 

 

" I have tried to run the above code but and they are executing successfully , the problem that is not that how do I assign the pins, auto assigning the pin gives a wrong output and when using the DE1 pin assignment how do i change the name as there is discrepancy in naming system " 

 

https://www.alteraforum.com/forum/attachment.php?attachmentid=6640
Reply