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
однако вместо сигналов обратного хода.