В настоящее время я пытаюсь создать экранный буфер в VHDL (для устройства, которое отправляет видеоданные через VGA). Я использую Xilinx ISE 13.1, и я начинаю в VHDL.Экранный буфер в vhdl, приводящий к сбою во время синтеза
Моя идея состояла в том, чтобы создать большой двумерный массив, содержащий значение RGB каждого пикселя (по 8 бит).
Я могу написать в массиве без проблем, но мне становится сложнее, когда я должен его прочитать: Синтез становится чрезвычайно длинным, и XST просто полностью насыщает память, пока компьютер не выключится сам по себе.
Вот упрощенная версия моего кода, просто пытается нарисовать красный 45 ° линии:
entity Pilotage_ecran is
port(clk25 : in std_logic; --25MHz clock
red_out : out std_logic; --Untill the problem is solved, i use only 1 bit to set colors
green_out : out std_logic;
blue_out : out std_logic;
hs_out : out std_logic;
vs_out : out std_logic);
end Pilotage_ecran;
architecture Behavioral of Pilotage_ecran is
signal horizontal_counter : std_logic_vector (9 downto 0);
signal vertical_counter : std_logic_vector (9 downto 0);
signal drawing : std_logic; --Signal that is set to 1 when the active video area is reached
signal busy : std_logic; --Signal to avoid launching the drawing process twice in parallel
--The array (actually containing single bits instead of vectors untill I solve the problem)
type TAB_BUFFER is array(0 to 1023, 0 to 1023) of std_logic;
signal Ecran : TAB_BUFFER := (others=>'0');
begin
Основной процесс:
process (clk25)
variable coordX : integer;
variable coordY : integer;
begin
if clk25'event and clk25 = '1' then
if (horizontal_counter >= "0010010000") -- 144 : limits of active video area
and (horizontal_counter < "1100010000") -- 784
and (vertical_counter >= "0000100111") -- 39
and (vertical_counter < "1100010000") -- 519
then
drawing <= '1';
coordX := conv_integer (horizontal_counter);
coordY := conv_integer (vertical_counter);
if Ecran(coordX,coordY) = '1' then --Here is the problem
red_out <= '1';
green_out <= '0';
blue_out <= '0';
else
red_out <= '0';
green_out <= '0';
blue_out <= '0';
end if;
else
drawing <= '0';
end if;
--Hsync and Vsync come after, but the code is safe and tested
end if;
end process;
Drawing процесс (на самом деле рисование линии в уродливый но я просто хотел получить что-нибудь в буфере).
draw :
process (drawing, clk25, busy)
--Coordinates of the starting point (actually random values...)
variable i : integer;
variable j : integer;
begin
if (drawing = '1') and clk25 = '1' and busy = '0' then
busy <= '1';
i :=300;
j :=300;
--The loop setting the coordinates of the line to '1'
loopx : while (i<=350) loop
Ecran(i,j) <= '1';
i := i+1;
j := j+1;
end loop loopx;
busy <='0';
end if;
end process draw;
end Behavioral;
Линия, которая вызывает у меня неприятности есть один, где я пытаюсь получить доступ к значению в некоторых координатах в буфере:
если ECRAN (coordX, coordY) = «1», то
Я также пытался сделать так:
< red_out = Ecran (coordX, coordY);
Если я заменить один из coordX или coordY целого значения, он работает нормально (дисплей оленьей кожи соответствует буферу, но он работает), но если я использовать переменные для обоих из них он выходит из строя во время синтеза. Я уверен, что я сделал что-то не так с массивом (я просто научился их использовать), даже если он, похоже, соответствует некоторым рабочим кодам. Я мог бы (и возможно) использовать слишком большой массив.
Если у кого-то есть представление о том, что я сделал неправильно, или у вас есть лучший способ создания экранного буфера в vhdl, любая помощь будет очень оценена.
спасибо, что заранее.
спасибо. Это не решило мою первую проблему, но это помогло мне улучшить мой процесс и мое понимание vhdl в любом случае. Вы правы в своем последнем абзаце, процесс рисования сохраняет значения каждого пикселя в буфере, тогда как основной процесс считывает значения RGB каждого пикселя в буфере, отправляет его на кабель VGA, а затем переходит к следующему пикселю. –
Первой проблемой является то, что вы все еще не можете синтезировать этот код? Я не думаю, что размер массива должен быть проблемой, если вы не используете совершенно бесполезную коробку. ваш массив эквивалентен 128 КБ памяти. Это может быть невозможно для некоторых FPGA, но это звучит не так, как будто вы его используете. Вы уверены, что это не что-то еще, что несинтезируемо. Получаете ли вы какие-либо сообщения об ошибках до того, как все будет закрыто? –
Я использую FPGA (спартанскую плату разработки) для перевода входящих данных в видеосигнал, поэтому память будет проблемой. У меня нет ошибок/предупреждений, и синтез застрял в анализе HDL после этого журнала: Анализ объекта в библиотеке (Архитектура ). –