Restablecimiento del problema de RAM en VHDL

0

Hola, estoy haciendo un proyecto VHDL en el que estoy haciendo algo de procesamiento de imágenes. Los datos de color de los píxeles se guardan en Rom y las operaciones se realizan en Ram. Sin embargo, cuando intento restablecer el ram de la rom. No se restablece según lo previsto. Lo que quiero decir es que en lugar de lo que debería haber sido la imagen predeterminada en el monitor, hay un cuadrado que consiste en un solo color. Cuando reinicio la memoria RAM, lo que debería suceder es que debería ver la imagen predeterminada en el monitor, pero no puedo. Intenté depurar el código pero no pude ver la falla. Podría haber algunos otros problemas en el código que figura a continuación. ¿¿Como puedó resolver esté problema?? También me sale esta advertencia

  [Synth 8-6014] Unused sequential element address_rom_reg was removed.  

Aquí está lo que tengo ::

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 > control_cursor_pos_x - 1)
        and (pos_x < control_cursor_pos_x + length)
        and (pos_y > control_cursor_pos_y - 1)
        and (pos_y < control_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;

y

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);

component Block_Rom
port(addra : in std_logic_vector(15 downto 0);
     clka : in std_logic;
     douta : out std_logic_vector(11 downto 0));

end component;

component Block_Ram
port(addra :in std_logic_vector(15 downto 0);
     clka : in std_logic;
     dina : in std_logic_vector(11 downto 0);
     douta: out std_logic_vector(11 downto 0);
     wea: in std_logic);
     end component;
    
pregunta runo

2 respuestas

1

Una cosa es que      if address_rom = conv_std_logic_vector((PICTURE_WIDTH_HEIGHT*PICTURE_WIDTH_HEIGHT),16) then nunca es verdadero en este punto debido a las declaraciones if anidadas. Es posible que desee cambiar su segunda declaración if en otra condición de la primera.

  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;
       else
          address_rom <= (others => '0');
          write_enable <= '0';
          done <= '1';
      end if;

¿La dirección_rom está inicializada en algún lugar? Para obtener ayuda más detallada, podríamos necesitar su código completo ...

¿Puede explicar lo que hace la segunda parte de su código, si está hecho = '1'?

    
respondido por el Humpawumpa
0

Para un análisis exhaustivo, necesitaríamos todos los modelos de banco de pruebas, ROM y RAM incluidos en el código y también el código que se lee de la memoria y genera la señal de video.

Lo último es importante ya que indica que la inicialización de la memoria está fallando, pero podría ser que su lectura o código de imagen sea defectuoso.

Es una buena práctica restablecer todos los registros. Todavía no he visto cómo se asegura de que, por ejemplo, address_rom comienza desde cero.

Luego está este código alrededor de enable que permite escribir de nuevo en la memoria. No hay ninguna pista sobre cuándo o cómo se controla esto.

La advertencia de que se elimina address_rom es un poco preocupante. Sin embargo, es posible que address_rom no sea necesario, ya que está casi duplicado en address_ram . Así que tal vez haya alguna lógica que derive la señal de eso. Es una buena idea comenzar con eso. Rastrearlo por ejemplo al mirar en la lista de redes sintetizada lo que está conectado al bus de direcciones ROM.

    
respondido por el Oldfart

Lea otras preguntas en las etiquetas