No se puede leer de la RAM en Vhdl

0

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?

    
pregunta runo

0 respuestas

Lea otras preguntas en las etiquetas