Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
12 years ago

Difficulties in causing the vga to count from 0 to 799

Hi guys,

can someone help me figure out why this code does not function properly. counter_int_v and counter_int_h is what i want to get counting in modelsim but i am not able to figure out the problem.

Found below is my code:

Library ieee;

USE ieee.std_logic_1164.all;

USE ieee.std_logic_unsigned.all;

USE ieee.numeric_std.all;

USE ieee.std_logic_arith.all;

entity VHDL_uppgift_8 is

port(

reset_n, CLOCK_50 : in std_logic;

KEY : in std_logic_vector(3 downto 0);

-- to the VGA unit/block

VGA_HS, VGA_VS, VGA_CLK : out std_logic;

VGA_BLANK_N, VGA_SYNC_N : out std_logic;

VGA_B, VGA_G, VGA_R : out std_logic_vector(7 downto 0)

);

end VHDL_uppgift_8;

architecture VGA_ARCH of VHDL_uppgift_8 is

--Kanske mycket tydligare (robustare) att ha en X och en Y unsigned med range. En record kanske är overkill, men kul att använda (se VHDL boken sidan 81).

--using record type to involve elements with different data types

type HV_type is record

H : INTEGER range 0 to 799;

V : INTEGER range 0 to 524;

end record;

signal counter_int_h : hv_type;

signal counter_int_v : hv_type;

signal clk_25mhz : std_logic := '0';

signal KEY_internal : std_logic_vector(3 downto 0);

signal x : std_logic_vector(8 downto 0):= "101000000"; --X'320'--;

signal y : std_logic_vector(7 downto 0):= "11110000"; --Y'240'--;

begin

VGA_CLK <= clk_25mhz; -- dett var något med att en klocka skall ut till VGA kontrollerns, kolla med DE2 manualen

KEY_internal <= NOT KEY;

-- Process to divide clock by two counter--

process_clock_25mhz: process (clock_50)

begin

if rising_edge(clock_50) then

clk_25mhz <= not clk_25mhz;

end if;

end process;

process_coordinate : process (reset_n, clk_25mhz)

begin

if(reset_n = '0') then

x <= "101000000"; --Starting value on X

y <= "11110000"; --Starting value on Y

else

if rising_edge(clk_25mhz) then

if KEY_internal (0) = '1' then

x <= x + 1;

end if;

if KEY_internal(1) = '1' then

x <= x - 1;

end if;

if KEY_internal(2) = '1' then

y <= y + 1;

end if;

if KEY_internal(3) = '1' then

y <= y - 1;

end if;

end if;

end if;

end process;

-- Process to generate Hsync an Vsync

process_sync_screen : process (clk_25mhz)

begin

if rising_edge(clk_25mhz) then

if reset_n = '0' then -- The next day the reset has been changed to synchronous reset

counter_int_h <= (others =>'0') ;

counter_int_v <= (others =>'0');

-- Starting values for the outputs

VGA_HS <= '1';

VGA_VS <= '1';

VGA_BLANK_N <= '1'; -- Pedroni says nblank and nsync must be kept at '1' and '0' respectively

VGA_SYNC_N <= '0'; --

VGA_R <=(others =>'0');

VGA_G <=(others =>'0');

VGA_B <=(others =>'0');

else

-- count h up

-- Clock out RGB Pixel Row Data Horizontal Sync--

-- ------------------------------------__________--------

-- 0 639 659 755 799

if counter_int_h >= 799 then

counter_int_h <= (others => '0');

else

counter_int_h <= counter_int_h + 1;

end if;

-- HSync Generation ('0')--

-- ------------------------------------__________---

-- 0 659 755

if (counter_int_h <= 755) and (counter_int_h >= 659) then

VGA_HS <= '0';

else

VGA_HS <= '1';

end if;

-- 480 Horizontal Sync (pixel rows) Vertical Sync

-- ---------------------------------------_______----------

-- 0 480 493-494 524

if (counter_int_v >= 524) and (counter_int_h >= 707) then

counter_int_v <= (others => '0');

elsif counter_int_h = 707 then

counter_int_v <= counter_int_v + 1;

end if;

--VSync Generation ('0') --

-- ---------------------------------------_______----------

-- 0 493-494

if (counter_int_v <= 494) and (counter_int_v >= 493) then

VGA_VS <= '0';

else

VGA_VS <= '1';

end if;

-- This is when blank will be low(active)

if counter_int_h <= 639 then

VGA_BLANK_N <= '1';

else

VGA_BLANK_N <= '0';

end if;

-- This is when sync will be low (active)

if counter_int_v <= 479 then

VGA_SYNC_N <= '1';

else

VGA_SYNC_N <= '0';

end if;

if((counter_int_h >= x and counter_int_h <= x+3) and (counter_int_v >= y and counter_int_v <= y+3) )then

-- white color ----------------------------------

VGA_R <= "11111111";

VGA_G <= "11111111";

VGA_B <= "11111111";

else

-- No color -------------------------------------

VGA_R <= "00000000";

VGA_G <= "00000000";

VGA_B <= "00000000";

end if;

end if;

end if;

end process process_sync_screen;

end VGA_ARCH;

15 Replies

  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    Thanks all for the coorperation, if this works fine with you guys i don't understand why it is messing up with me.

    Did you do any thing to your testbench, probably thats why mine is not working?
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    --- Quote Start ---

    Thanks all for the coorperation, if this works fine with you guys i don't understand why it is messing up with me.

    Did you do any thing to your testbench, probably thats why mine is not working?

    --- Quote End ---

    I did not use any testbench code but just injected input stimuli and looked at counting.

    your counter is only under reset_n and as long as this signal is high the counting if free running so how come you get it stopped at 12 or 13. It could be just bad luck.
  • Altera_Forum's avatar
    Altera_Forum
    Icon for Honored Contributor rankHonored Contributor

    Hi to everyone. I am also trying to implement something like that but using schematic. The Point is that i also want to make a 12 bit Counter which consists of 3 4*bit Counters and unfortunately it also does not work correctly. The calculation is the following : 4095-1-752(steps)=3342=110100001110. Here is the circuit i have but when i simulate it the results are at least tragic....