Пытаюсь отобразить на дисплее 640x480 vga с fpga - PullRequest
0 голосов
/ 27 мая 2020

Я пишу это буквально в отчаянии. Я несколько раз пытался заставить его работать, но этого не произошло. Я использую плату Altera DE2 - Cyclone II EP2C35F672C6 и пытался отобразить простое изображение на экране 640x480 vga. Я использую дизайн контроллера vga, который я сделал для другой платы - Altera DE1, который работал действительно хорошо. Разница на этой плате DE2 заключается в другом компоненте DA C, который имеет 10-битные данные rgb вместо 4-битных, как на плате DE1, и имеет дополнительные необходимые выходы - VGA_SYN C, VGA_BLANK, VGA_CLK.

Итак, я внес необходимые изменения и нашел пример, в котором говорится, что для VGA_BLANK нужно установить константу «1», а для VGA_SYN C - «0». VGA_CLK подключен к clk пикселя 25,175 МГц, который является выходом pll clk.

Я перепробовал так много вариантов и попытался использовать другой пример, где они устанавливают vga_blank в '1', когда в видимой области & '0 'когда нет, и он все еще не работал. у меня просто появляется черный экран с сообщением об отсутствии видеовхода, когда я запускаю дизайн.

ниже - реализация моего генератора синхронизации, data_generator и vga_top_level

library ieee;
use ieee.std_logic_1164.all;

library work;
use work.vga_consts.all;


entity vga_toplevel is

    port
    (
        -- in --
        clk, rst : in std_logic;


        -- out --
        vga_clk, vga_blank, vga_sync : out std_logic;
        r_data, g_data, b_data : out std_logic_vector(9 downto 0);
        h_sync, v_sync : out std_logic
    );
end entity;

architecture structural of vga_toplevel is


    component pll
        port
        (
            areset      : IN STD_LOGIC  := '0';
            inclk0      : IN STD_LOGIC  := '0';
            c0          : OUT STD_LOGIC ;
            locked      : OUT STD_LOGIC 
        );
    end component;

    component timing_generator
        port
        (
            clk, rst : in std_logic;

            h_cnt : out integer range 0 to h_frame-1;
            v_cnt : out integer range 0 to v_frame-1;

            vga_blank, vga_sync : out std_logic;
            h_sync, v_sync : out std_logic
        );
    end component;

    component data_generator
        generic
        (
            vis_x : integer := visable_x;
            vis_y : integer := visable_y
        );
        port
        (
            clk, rst : in std_logic;
            h_cnt : in integer range 0 to h_frame-1;
            v_cnt : in integer range 0 to v_frame-1;

            -- RGB values
            r_data, g_data, b_data : out std_logic_vector(9 downto 0)
        );
    end component;

    signal h_cnt, v_cnt : integer range 0 to h_frame-1;

    signal pll_clk, rst_out, locked : std_logic;

    -------------------------------------------------------------------

begin
    rst_out <= not locked; -- uncomment for PLL use
    vga_clk <= pll_clk;
    -- rst_out <= rst; -- comment for PLL use
    -- pll_clk <= clk; -- comment for PLL use


    PLL1: pll
        port map
        (

            inclk0 => clk,
            areset => rst,

            c0 => pll_clk,
            locked => locked
        );

    T_GEN: timing_generator
        port map
        (
            -- in --
            clk => pll_clk,
            rst => rst_out,
            -- out --
            vga_blank   => vga_blank,
            vga_sync    => vga_sync,
            v_cnt => v_cnt,
            h_cnt => h_cnt,
            v_sync => v_sync,
            h_sync => h_sync
        );

    D_GEN: data_generator

        port map
        (
            -- in --
            clk => pll_clk,
            rst => rst_out,
            v_cnt => v_cnt,
            h_cnt => h_cnt,

            r_data => r_data,
            g_data => g_data,
            b_data => b_data
        );
end architecture;

library ieee;
use ieee.std_logic_1164.all;

library work;
use work.vga_consts.all;

entity timing_generator is

    port
    (
        clk, rst : in std_logic;

        h_cnt : out integer range 0 to h_frame-1;
        v_cnt : out integer range 0 to v_frame-1;

        vga_blank   : out std_logic;
        vga_sync    : out std_logic;
        h_sync, v_sync : out std_logic

    );

end entity;

architecture behave of timing_generator is

    signal h_cnt_inner : integer range 0 to h_frame-1;
    signal v_cnt_inner : integer range 0 to v_frame-1;

begin
    vga_blank   <= '1';
    vga_sync    <= '0';
    h_cnt <= h_cnt_inner;
    v_cnt <= v_cnt_inner;


    -- counter for pixels --
    process (clk, rst) 
    begin
        if rst = '1' then
            h_cnt_inner <= 0;
        elsif rising_edge(clk) then
            if h_cnt_inner = h_frame-1 then
                h_cnt_inner <= 0;
            else 
                h_cnt_inner <= h_cnt_inner + 1;
            end if;
        end if;
    end process;

    -- counter for lines --
    process (clk, rst)
    begin
        if rst = '1' then
            v_cnt_inner <= 0;
        elsif rising_edge(clk) then
            if v_cnt_inner = v_frame-1 then
                v_cnt_inner <= 0;
            elsif h_cnt_inner = 654 then
                v_cnt_inner <= v_cnt_inner + 1;
            end if;
        end if;
    end process;

    -- h_sync generator --
    process (clk, rst)
    begin
        if rst = '1' then
            h_sync <= '1';
        elsif rising_edge(clk) then
            if h_cnt_inner = h_sync_d(0)-1 then
                h_sync <= '0';
            elsif h_cnt_inner = h_sync_d(1) then
                h_sync <= '1';
            end if;
        end if;
    end process;

    -- v_sync generator --
    process(clk, rst)
    begin
        if rst = '1' then
            v_sync <= '1';
        elsif rising_edge(clk) then
            if v_cnt_inner = v_sync_d(0) then
                v_sync <= '0';
            elsif v_cnt_inner = v_sync_d(1) + 1 then
                v_sync <= '1';
            end if;
        end if;
    end process;





end architecture;

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

library work;
use work.vga_consts.all;



entity data_generator is
    generic (
        vis_x : integer := visable_x;
        vis_y : integer := visable_y
    );
    port
    (
        clk, rst : in std_logic;

        h_cnt : in integer range 0 to h_frame-1;
        v_cnt : in integer range 0 to v_frame-1;

        -- RGB values for each pixel
        r_data, g_data, b_data : out std_logic_vector(9 downto 0)
    );
end entity;

architecture behave of data_generator is    

begin
    -- process to handle only 1 color - blue screen
    process(clk, rst)
    begin
        if rst = '1' then
            r_data <= (others => '0');
            g_data <= (others => '0');
            b_data <= (others => '0');
        elsif rising_edge(clk) then
            if (h_cnt >= h_vis_d(0)) and (h_cnt < h_vis_d(1)) and (v_cnt >= v_vis_d(0)) and (v_cnt < v_vis_d(1)) then
                -- if in visiable area
                r_data <= (others => '1');
                g_data <= (others => '1');
                b_data <= (others => '1');
            else
                r_data <= (others => '0');
                g_data <= (others => '0');
                b_data <= (others => '0');
            end if;
        end if;
    end process;

end architecture;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...