Acceso a la memoria flash PCM en una placa Nexys 3

5

¿Cómo accedo al ram de PCM flash en una placa Nexys3 FPGA?

Tengo un proyecto central de CPU T80 (Z80) simple que funciona con un módulo ROM Core Generator, pero no tengo suerte con el flash ram. El Manual de referencia de Nexys 3 sugiere el uso de los Diseños de referencia del sitio web de Digilent, pero en realidad no hay uno para la placa Nexys 3. Le he preguntado a Digilent y dicen que solo hay uno para el Nexys 2, que he revisado. . También he leído la mayor parte de la hoja de datos del chip flash - Micron NP8P128A13T1760E pero no puedo hacerlo funcionar.

Así que he reunido el proyecto más mínimo que puedo imaginar: una máquina de estados simple que intenta leer la primera palabra del flash ram y mostrar el byte inferior en los 8 leds del tablero. Vea el VHDL a continuación. Estoy cargando el flash ram con la utilidad de memoria Adept, pero todo lo que parece es que aparece su 0xFF.

(Actualización, acabo de encontrar que si presiono el botón que tengo cableado para restablecerlo, muestra 0x06, pero eso no es lo que se ha puesto en flash)

Mi comprensión de cómo debería funcionar es:

  1. Configurar FlashRP = 1, FlashCS = 1, MemOE = 1, MemWR = 1,
  2. Establezca la dirección en MemAdr (he codificado en 0)
  3. Habilitar flash - FlashCS = 0
  4. Habilitar fuera - FlashOE = 0
  5. Leer de MemDB

Mi proyecto de prueba ejecuta estos pasos en un reloj de 3.375 MHz (ya que así es como se ejecutará el T80).

Una cosa de la que no estoy seguro es que el Manual de referencia de Nexys3 se refiere a algunas otras señales que son comunes a la RAM y al Flash, a saber, CLK, ADV y WAIT, pero no he podido correlacionar esto con el Hoja de datos para el chip flash.

¿Qué me estoy perdiendo?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;


entity Top is
    Port ( clock : in  STD_LOGIC;
           reset : in  STD_LOGIC;
              led : out STD_LOGIC_VECTOR (7 downto 0);
              MemOE : out STD_LOGIC;
              MemWR : out STD_LOGIC;
              FlashCS : out STD_LOGIC;
              FlashRP : out STD_LOGIC;
              MemAdr : out STD_LOGIC_VECTOR(26 downto 1);
              MemDB : inout STD_LOGIC_VECTOR(15 downto 0)
              );
end Top;

architecture Behavioral of Top is
    signal slow_clock : STD_LOGIC;
    signal led_reg : STD_LOGIC_VECTOR(7 downto 0);
    signal state : unsigned(3 downto 0) := "0000";
    signal state_next : unsigned(3 downto 0);
begin

    led <= led_reg;

    -- Clock Generation
    clock_core : entity work.ClockCore
        PORT MAP 
        (
            clock => clock,
            clock_3375 => slow_clock,       -- 3.375 Mhz clock
            RESET  => reset
        );

    process (slow_clock, reset)
    begin
        if (reset='1') then
            state <= "0000";
            led_reg <= "00000000";
        elsif (slow_clock'event and slow_clock='1') then
            state <= state_next;
            if (state = "1110") then
                led_reg <= MemDB(7 downto 0);
            end if;
        end if;
    end process;

    MemAdr <= "00000000000000000000000000";
    MemDB <= "ZZZZZZZZZZZZZZZZ";
    MemWR <= '1';
    FlashRP <= NOT reset;

    process (state)
    begin
        case state is
            when "0000" =>
                -- initialize
                FlashCS <= '1';
                MemOE <= '1';
            when "0001" =>
                -- enable flash
                FlashCS <= '0';
                MemOE <= '1';
            when "0010" =>
                -- enable flash output
                FlashCS <= '0';
                MemOE <= '0';   
            when others =>
                -- hold steady
                FlashCS <= '0';
                MemOE <= '0';   
        end case;
    end process;

    state_next <= "1111" when (state="1111") else state + 1;

end Behavioral;

Aquí está el material de referencia que he estado usando:

pregunta Brad Robinson

3 respuestas

3

Finalmente me di cuenta de esto ... y no tenía nada de malo con el VHDL que funciona perfectamente. El problema fue exactamente como lo sugirió el comentario de Martin Thompson, un problema de pin-out.

Aunque verifiqué las conexiones del pin UCF varias veces, solo estaba revisando las etiquetas de pin correctas, no todas estaban presentes y me había perdido el pin MemOE, que por supuesto es esencial para que esto funcione.

Algunas notas:

  1. La cadena de herramientas Xilinx no proporciona ningún mensaje de advertencia para un pin de salida desconectado como en este caso.
  2. La lectura de la MemDB parecía proporcionar datos consistentes pero incorrectos, según el modo en el que configuré el chip flash. En el modo de matriz de lectura, siempre devolvió 0xFF en el byte bajo. En el identificador de lectura, 0x86. Datos totalmente sin sentido, pero la consistencia me hizo pensar que tenía los pinouts correctos.

Lección aprendida.

    
respondido por el Brad Robinson
0

verifique este proyecto Nexys 3 Tiene algunas cosas buenas para comenzar un proyecto y escribir en la RAM celular del Nexys 3. Es aunque no contiene código pcm.

    
respondido por el Tommy
0

Algunas cosas para verificar:

  • ¿se intercambian los bits / bytes / nibbles en algún lugar?
  • ¿el tiempo está dentro de las especificaciones (medido por un osciloscopio)?
  • ¿ha vuelto a sincronizar los datos con su reloj interno? ¿Puede mostrar el código donde captura los datos?
  • ¿ha revisado el archivo de pines para asegurarse de que los pines sean los correctos?
respondido por el Martin Thompson

Lea otras preguntas en las etiquetas