VHDL - чтение из кадрового буфера VGA

У меня есть школьный проект FPGA, и у меня есть некоторые проблемы. Мы используем плату Digilent Nexys2 (Xilinx XC3S500E FPGA).

Мы создали несколько контроллеров, включая VGA (640x480) с кадровым буфером. По крайней мере, мы назвали его кадровым буфером - это фактически распределенная оперативная память 30x40, в которой хранятся пиксели для отображения (1 бит - "один квадрат", поэтому у нас фактически есть разрешение 30 на 40, без цветов).

Затем мы использовали 8-битное ядро ​​микроконтроллера Picoblaze, и теперь мы должны построить игру Snake (вы знаете, из старой Nokias). Теперь моя проблема в том, что Picoblaze имеет только 64-байтовую оперативную память, так что змея не сможет долго продержаться, если я буду держать ее там.

Так что я подумал, что могу просто прочитать, где находится змея из VGA RAM, но я не знаю как, поскольку VGA читает из нее, а также существует проблема адресации или чтения всей строки данных (у Picoblaze 8-битный in_port). Вот процесс:

process(clk_i, vert_data_on, hor_data_on, read_data)
begin
    if vert_data_on = '1' and hor_data_on = '1' then
        if read_data(conv_integer(column_calc)) = '1' then
            red_o <= "000";
            green_o <= "000";
            blue_o <= "00";
        else
            red_o <= "111";
            green_o <= "111";
            blue_o <= "11";
        end if;
    else            
        red_o <= "000";
        green_o <= "000";
        blue_o <= "00";
    end if;
end process;

Компонент RAM и его экземпляр:

component RAM30x40 is
    Port(
        clk_i           : in  STD_LOGIC;
        we_i            : in  STD_LOGIC;
        addrInX_i       : in  STD_LOGIC_VECTOR(5 downto 0);
        addrInY_i       : in  STD_LOGIC_VECTOR(4 downto 0);
        addrOutY_i      : in  STD_LOGIC_VECTOR(4 downto 0);
        data_i          : in  STD_LOGIC;
        data_o          : out STD_LOGIC_VECTOR(0 to 39)
    );
end component;

inst_RAM: RAM30x40
Port map(
    clk_i           => clk_i,
    we_i            => write_enable,
    addrInX_i       => write_addr_x,
    addrInY_i       => write_addr_y,
    addrOutX_i      => read_addr_x,
    addrOutY_i      => row_calc,
    data_i          => write_data,
    data_o          => read_data
);

Как это решается на ПК? Распространено ли чтение из памяти графической карты? Какие у меня варианты здесь? Я мог бы использовать блочную оперативную память с двумя тактовыми импульсами и иметь один для чтения VGA, а другой для picoblaze, но я не знаю и не могу найти, как правильно генерировать другой тактовый сигнал.

1 ответ

Решение

Я бы просто определил второй порт чтения, который активен только во время обратного хода, вот так:

process(clk_i, vert_data_on, hor_data_on, read_data)
begin
    if vert_data_on = '1' and hor_data_on = '1' then
        if read_data(conv_integer(column_calc)) = '1' then
            red_o <= "000";
            green_o <= "000";
            blue_o <= "00";
        else
            red_o <= "111";
            green_o <= "111";
            blue_o <= "11";
        end if;
        data2_valid <= '0';
    else            
        red_o <= "000";
        green_o <= "000";
        blue_o <= "00";

        read_data2 <= conv_integer(read_request2);
        data2_valid <= '1';
    end if;
end process;

data2_valid Затем определить триггер для действительных данных из read_request2 адрес. Вы, вероятно, должны запустить процесс на clk_i однако вместо сигналов обратного хода.

Другие вопросы по тегам