Leyendo desde la ROM y generando una señal VGA en FPGA [cerrado]

-3

He generado una señal VGA y he logrado dibujar un rectángulo. También tengo un código para ROM diseñado con VHDL e inicializado con un archivo que tiene patrones. Soy principiante en VHDL y FPGA. Me gustaría leer el contenido de la ROM y usar el generador VGA para mostrar el contenido.

aquí están los códigos.

 LIBRARY ieee;
 USE ieee.std_logic_1164.all;
 ------------------------------------------------------------------
 ENTITY rom IS
 PORT (address: IN INTEGER RANGE 0 TO 15;
 data_out: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
 END rom;
 ------------------------------------------------------------------
 ARCHITECTURE rom OF rom IS
 SIGNAL reg_address: INTEGER RANGE 0 TO 15;
 TYPE memory IS ARRAY (0 TO 15) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
 SIGNAL myrom: memory;
 ATTRIBUTE ram_init_file: STRING;
 ATTRIBUTE ram_init_file OF myrom: SIGNAL IS "rom_contents.mif";
 BEGIN
 data_out <= myrom(address);
 END rom;

Código del generador VGA

architecture Behavioral of VGA_display is   
    -- Intermediate register telling the exact position on display on screen.
    signal x : integer range 0 to 1023 := 100;
    signal y : integer range 0 to 1023 := 80;
begin
 -- On every positive edge of the clock counter condition is checked,
  output1: process(clock)
  begin
    if rising_edge (clock) then
        -- If the counter satisfy the condition, then output the colour that should appear.
        if (hcounter >= 1)  and (hcounter < 120) and (vcounter >= 1) and (vcounter < 120
                   ) then
          pixels <= x"F0";                  
        -- If the condition is not satisfied then the output colour will be black.
        else 
          pixels <= x"00";
        end if;
      end if;
   end process;
end Behavioral;

Actualmente obtengo eso del resultado de la simulación.

    
pregunta Ahmed Saleh

1 respuesta

2

No he escrito en VHDL por mucho tiempo, pero lo que necesitas hacer sería algo como esto.

Cree una instancia de la rom y conecte las señales, por ejemplo,

rom1: rom port map(address => addr, data_out => pix);

En algún lugar apropiado, asigna la dirección al aplanar los conteos horizontales y verticales:

addr <= vcounter * 120 + hcounter;

Es probable que esto tenga un problema de comprobación de tipos con VHDL como está. Con esto estaría confiando en el sintetizador para optimizar el x120 y agregar la operación. Perdería 8 bytes / palabras para hacer que cada línea horizontal ocupe una potencia de 2 (= 128) número de palabras, luego escribiría esto en operaciones de bits y esto sería mucho más eficiente.

Finalmente, use la imagen de salida dentro de su bloque de visualización VGA, como:

pixels <= pix;
    
respondido por el rioraxe

Lea otras preguntas en las etiquetas