Hola, para algunos fines de procesamiento de imágenes, debo leer datos de color de 12 bits de un píxel de Ram y mostrarlos en la pantalla a través del cable VGA. Sin embargo, mi código no se lee de Ram y todo lo que veo en el monitor es un cuadrado negro que debería haber sido mi imagen. Intenté leer de Rom y lo logré. Puedo leer y mostrar la imagen de Rom pero no puedo de Ram. Intenté todo lo que puedo, pero durante 2 días todavía no he determinado el problema. Aquí está el segmento de código que más sospecho. Lo que hace este segmento de código es que lee y escribe datos si la señal hecha es '1' y restablece la RAM desde Rom si se hace = '0'. Y también debo decir que si habilitar es 1, también hago write_enable 1. Construí tanto Ram como Rom usando block_memory_generator en Vivado 2017.2.
Reading_Writing_Resetting_Ram: process(clk,rst) is
begin
if rst = '1' then
done <= '0';
elsif rising_edge(clk) then
if done = '0' then
if address_rom <
conv_std_logic_vector((PICTURE_WIDTH_HEIGHT*PICTURE_WIDTH_HEIGHT),16) then
write_enable <= '1';
data_in_ram <= data_rom;
address_ram <= address_rom;
address_rom <= address_rom + 1;
if address_rom =
conv_std_logic_vector((PICTURE_WIDTH_HEIGHT*PICTURE_WIDTH_HEIGHT),16) then
address_rom <= (others => '0');
write_enable <= '0';
done <= '1';
end if;
end if;
else --if done = '1'
if (pos_x < PICTURE_WIDTH_HEIGHT) and (pos_y <PICTURE_WIDTH_HEIGHT) and
(pos_x >= 0) and (pos_y >= 0) then -- if within picture
address_ram <=(conv_std_logic_vector((pos_x +
pos_y*PICTURE_WIDTH_HEIGHT),16));
if ( pos_x > cursor_pos_x - 1) and (pos_x < cursor_pos_x + length) and (
pos_y > cursor_pos_y - 1) and (pos_y < cursor_pos_y + length) then --if
within cursor
data_in_ram <= output_of_operation;
if enable = '1' then
write_enable <= '1';
else
write_enable <= '0';
end if;
end if;
end if;
end if;
end if;
end process;
Además
U3: Block_Rom port map(addra => address_rom,
clka => clk,
douta => data_rom);
U4: Block_Ram port map(addra => address_ram,
clka => clk,
dina => data_in_ram,
douta => data_out_ram,
wea => write_enable);
Además
process (clk_in,rst) is
begin
if rst= '1' then --rst
data_r <= (others => '0');
data_g <= (others => '0');
data_b <= (others => '0');
elsif rising_edge(clk_in) then
if (visible = '1') then --visible
if (pos_x < PICTURE_WIDTH_HEIGHT) and (pos_y <PICTURE_WIDTH_HEIGHT) and
(pos_x >= 0) and (pos_y >= 0) then -- if within picture
vgaData <= data_out_ram;
data_r <= vgaData(3*COLOR_BIT-1 downto 2*COLOR_BIT);
data_g <= vgaData(2*COLOR_BIT-1 downto COLOR_BIT);
data_b <= vgaData(COLOR_BIT-1 downto 0);
if (pos_y = cursor_pos_y and pos_x >= cursor_pos_x and pos_x <=
cursor_pos_x + length - 1) then
vgaData <= "111100000000"; --red
data_r <= vgaData(3*COLOR_BIT-1 downto 2*COLOR_BIT);
data_g <= vgaData(2*COLOR_BIT-1 downto COLOR_BIT);
data_b <= vgaData(COLOR_BIT-1 downto 0);
end if;
if (pos_y = cursor_pos_y + length -1 and pos_x >= cursor_pos_x and pos_x
<= cursor_pos_x + length - 1) then
vgaData <= "111100000000";
data_r <= vgaData(3*COLOR_BIT-1 downto 2*COLOR_BIT);
data_g <= vgaData(2*COLOR_BIT-1 downto COLOR_BIT);
data_b <= vgaData(COLOR_BIT-1 downto 0);
end if;
if (pos_x = cursor_pos_x and pos_y >= cursor_pos_y and pos_y <=
cursor_pos_y + length - 1) then
vgaData <= "111100000000";
data_r <= vgaData(3*COLOR_BIT-1 downto 2*COLOR_BIT);
data_g <= vgaData(2*COLOR_BIT-1 downto COLOR_BIT);
data_b <= vgaData(COLOR_BIT-1 downto 0);
end if;
if (pos_x = cursor_pos_x + length - 1 and pos_y >= cursor_pos_y and pos_y
<= cursor_pos_y + length - 1) then
vgaData <= "111100000000";
data_r <= vgaData(3*COLOR_BIT-1 downto 2*COLOR_BIT);
data_g <= vgaData(2*COLOR_BIT-1 downto COLOR_BIT);
data_b <= vgaData(COLOR_BIT-1 downto 0);
end if;
else --if out of picture
vgaData <= "000000001111"; --blue
data_r <= vgaData(3*COLOR_BIT-1 downto 2*COLOR_BIT);
data_g <= vgaData(2*COLOR_BIT-1 downto COLOR_BIT);
data_b <= vgaData(COLOR_BIT-1 downto 0);
end if; -- if within picture
else -- if visible = '0'
vgaData <= "000000000000"; -- black
data_r <= vgaData(3*COLOR_BIT-1 downto 2*COLOR_BIT);
data_g <= vgaData(2*COLOR_BIT-1 downto COLOR_BIT);
data_b <= vgaData(COLOR_BIT-1 downto 0);
end if;-- visible
end if; --rst
end process SHOW;
El código anterior se usa para establecer los valores RGB que se usan para mostrar
¿Cómo puedo resolver este problema?