¿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:
- Configurar FlashRP = 1, FlashCS = 1, MemOE = 1, MemWR = 1,
- Establezca la dirección en MemAdr (he codificado en 0)
- Habilitar flash - FlashCS = 0
- Habilitar fuera - FlashOE = 0
- 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: