¿Cómo accedo a la memoria flash PCM 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 usar los Diseños de referencia del sitio web de Digilent, pero en realidad no hay uno para la placa Nexys 3. Le pregunté a Digilent y dicen que solo hay uno para 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 armé el proyecto más mínimo que se me ocurrió: una máquina de estado simple que intenta leer la primera palabra de la memoria RAM y mostrar el byte más bajo en los 8 LED de la placa. Consulte el VHDL a continuación. Estoy cargando la memoria flash usando la utilidad de memoria Adept, pero siempre parece que aparece su 0xFF.
(Actualización, acabo de descubrir que si presiono el botón que tengo conectado 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:
Mi proyecto de prueba ejecuta estos pasos en un reloj de 3.375 Mhz (ya que es a lo que 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 correlacionarlas con la 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:
Finalmente me di cuenta de esto... y no tenía nada de malo con el VHDL que funciona perfectamente. El problema era exactamente como lo sugirió el comentario de Martin Thompson, un problema de pin-out.
Aunque verifiqué las conexiones de los pines del archivo UCF muchas veces, solo estaba revisando las etiquetas correctas de los pines, no es que estuvieran todas presentes y me hubiera perdido el pin MemOE, que por supuesto es esencial para que esto funcione.
Algunas notas:
Lección aprendida.
verifique este proyecto Nexys 3 Tiene algunas cosas buenas para iniciar un proyecto y escribir en la RAM celular de Nexys 3. Sin embargo, no contiene código pcm.
Algunas cosas para comprobar:
martin thompson
brad robinson
martin thompson
brad robinson
brad robinson
martin thompson
brad robinson