VHDL - FSM no se inicia (SOLO en simulación de temporización)

Estoy trabajando para mi tesis de maestría y soy bastante nuevo en VHDL, pero aún tengo que implementar algunas cosas complejas. Esta es una de las estructuras más fáciles que tuve que escribir, y todavía me encuentro con algunos problemas.

Es un FSM que implementa un registro de desplazamiento de 24 bits con una señal de sincronización activa-baja (para programar un DAC). Es solo el final de una compleja cadena de elaboración que creé para mi proyecto. Seguí el modelo de ejemplo de un FSM tanto como pude.

La simulación de comportamiento funciona bien, en realidad toda la cadena de elaboración que creé funciona perfectamente bien en lo que respecta a la simulación de comportamiento. Sin embargo, una vez que pruebo la simulación posterior a la traducción, las cosas comienzan a salir mal: muchas señales de salida 'X'.

Con este simple registro de desplazamiento NO obtengo ninguna 'X', sin embargo, no puedo llegar a la fase load_and_prepare_data. Parece que el estado actual cambia (al inspeccionar algunas señales), pero la elaboración no continúa.

Tenga en cuenta que, dado que soy nuevo en el lenguaje, no tengo idea de qué restricciones de tiempo debo establecer en este FSM (y de todos modos no sabría cómo escribirlas en el top.ucf)

¿Puedes ver lo que está mal? Gracias por adelantado

EDITAR

Seguí tus consejos y limpié el FSM usando un solo proceso de estado. Todavía tengo algunas dudas sobre "dónde poner qué", pero realmente me gusta la nueva implementación. De todos modos, ahora obtengo una simulación de comportamiento limpia pero 'X' en todas las salidas en la simulación posterior a la traducción. ¿Qué está causando esto? Publicaré tanto el nuevo código como el banco de pruebas:

----------------------------------------------------------------------------------
-- Company: 
-- Engineer: 
-- 
-- Create Date:    14:44:03 11/28/2014 
-- Design Name: 
-- Module Name:    dac_ad5764r_24bit_sr_programmer_v2 - Behavioral 
-- Project Name: 
-- Target Devices: 
-- Tool versions: 
-- Description: This is a PISO shift register that gets a 24bit parallel input word.
--              It outputs the 24bit input word starting from the MSB and enables
--              an active low ChipSelect line for 24 clock periods.
-- Dependencies: 
--
-- Revision: 
-- Revision 0.01 - File Created
-- Additional Comments: 
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity dac_ad5764r_24bit_sr_programmer_v2 is
    Port ( clk : in  STD_LOGIC;
           start : in  STD_LOGIC;
           reset : in  STD_LOGIC; -- Note that this reset is for the FSM not for the DAC
           reset_all_dac : in STD_LOGIC;
           data_in : in  STD_LOGIC_VECTOR (23 downto 0);
           serial_data_out : out  STD_LOGIC;
           sync_out : out  STD_LOGIC; -- This is a chip select
           reset_out : out STD_LOGIC;
           busy : out STD_LOGIC
         );
end dac_ad5764r_24bit_sr_programmer_v2;

architecture Behavioral of dac_ad5764r_24bit_sr_programmer_v2 is

-- Stati
type state_type is (idle, load_and_prepare_data, transmission);
--ATTRIBUTE ENUM_ENCODING : STRING; 
--ATTRIBUTE ENUM_ENCODING OF state_type: TYPE IS "001 010 100";
signal state: state_type := idle;
--signal next_state: state_type := idle;

-- Clock counter
--signal clk_counter_enable : STD_LOGIC := '0';
signal clk_counter : unsigned(4 downto 0) := (others => '0');

-- Shift register
signal stored_data: STD_LOGIC_VECTOR (23 downto 0) := (others => '0');

begin

FSM_single_process: process(clk)
begin
    if rising_edge(clk) then
        if reset = '1' then
            serial_data_out <= '0';
            sync_out <= '1';
            reset_out <= '1';
            busy <= '0';
            state <= idle;
        else
            -- Default
            serial_data_out <= '0';
            sync_out <= '1';
            reset_out <= '1';
            busy <= '0';

            case (state) is
                when transmission =>
                    serial_data_out <= stored_data(23);
                    sync_out <= '0';
                    busy <= '1';
                    clk_counter <= clk_counter + 1;
                    stored_data <= stored_data(22 downto 0) & "0";
                    state <= transmission;
                    if (clk_counter = 23) then
                        state <= idle;
                    end if;
                when others => -- Idle
                    if start = '1' then
                        serial_data_out <= data_in(23);
                        sync_out <= '0';
                        reset_out <= '1';
                        busy <= '1';
                        stored_data <= data_in;
                        clk_counter <= "00001";
                        state <= transmission;
                    end if;
            end case;

--            if (reset_all_dac = '1') then
--              reset_out <= '0';
--          end if;
        end if;
    end if;
end process;


end;

Y el banco de pruebas:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;

ENTITY dac_ad5764r_24bit_sr_programmer_tb IS
END dac_ad5764r_24bit_sr_programmer_tb;

ARCHITECTURE behavior OF dac_ad5764r_24bit_sr_programmer_tb IS 

    -- Component Declaration for the Unit Under Test (UUT)

    COMPONENT dac_ad5764r_24bit_sr_programmer_v2
    PORT(
         clk : IN  std_logic;
         start : IN  std_logic;
         reset : IN  std_logic;
         data_in : IN  std_logic_vector(23 downto 0);
         serial_data_out : OUT  std_logic;
         reset_all_dac : IN std_logic;
         sync_out : OUT  std_logic;
         reset_out : OUT  std_logic;
         --finish : OUT  std_logic;
         busy : OUT  std_logic
        );
    END COMPONENT;


   --Inputs
   signal clk : std_logic := '0';
   signal start : std_logic := '0';
   signal reset : std_logic := '0';
   signal data_in : std_logic_vector(23 downto 0) := (others => '0');
   signal reset_all_dac : std_logic := '0';

    --Outputs
   signal serial_data_out : std_logic;
   signal sync_out : std_logic;
   signal reset_out : std_logic;
   --signal finish : std_logic;
   signal busy : std_logic;

   -- Clock period definitions
   constant clk_period : time := 100 ns;

BEGIN

    -- Instantiate the Unit Under Test (UUT)
   uut: dac_ad5764r_24bit_sr_programmer_v2 PORT MAP (
          clk => clk,
          start => start,
          reset => reset,
          data_in => data_in,
          reset_all_dac => reset_all_dac,
          serial_data_out => serial_data_out,
          sync_out => sync_out,
          reset_out => reset_out,
          --finish => finish,
          busy => busy
        );

   -- Clock process definitions
   clk_process :process
   begin
        clk <= '0';
        wait for clk_period/2;
        clk <= '1';
        wait for clk_period/2;
   end process;


   -- Stimulus process
   stim_proc: process
   begin        
      -- hold reset state for 100 ns.
      wait for clk_period*10;
      reset <= '1' after 25 ns;
      wait for clk_period*1;
      reset <= '0' after 25 ns;
      wait for clk_period*3; 
      reset_all_dac <= '1' after 25 ns;
      wait for clk_period*1;
      reset_all_dac <= '0' after 25 ns;
      wait for clk_period*5; 
      data_in <= "111111111111111111111111" after 25 ns;
      wait for clk_period*3;
        start <= '1' after 25 ns;
      wait for clk_period*1;
        start <= '0' after 25 ns;


      wait;
   end process;

END;

ACTUALIZACIÓN 1

Actualizado con el último diseño: este código no está causando ninguna 'X' (no puedo entender por qué, esto no lo hace, pero sí el anterior). Sin embargo, no está comenzando (en la simulación POST-TRADUCCIÓN) al igual que la primera máquina de 3 procesos, y la señal sync_out está atascada en 0, mientras que debería ser '1' por defecto.

ACTUALIZACIÓN 2

He estado investigando el esquema de la tecnología, comenzando por el problema de sync_out = 0: se implementa con un FDS, S es la señal de reinicio del FSM, D proviene de un LUT3 con I = estado y reinicio y arranque e INIT = 45 = "00101101 ". He buscado este LUT3 en la simulación y he notado que tieneINIT = "00000000"!

¿Hay algo que me falta sobre cómo ejecutar esta simulación? ¡Parece que cada LUT en el diseño no se ha configurado!

ACTUALIZACIÓN 3 Parece que la simulación Post-Translate tiene errores de alguna manera, o no la estoy configurando correctamente por alguna razón: las simulaciones Post-Map y Post-PAR funcionan y muestran algunas salidas. Sin embargo, hay un error extraño: el registro de datos almacenados no se actualiza con el vector de datos completo, después de eso, el FSM funciona correctamente y genera los datos almacenados. He buscado en el esquema de tecnología justo después de la síntesis y, por alguna razón, los bits 23, 22, 21, 19, 18 no están conectados al bit correspondiente data_in. Puede ver el efecto en esta captura de pantalla de la simulación posterior al mapa. Lo mismo sucede en Post-PAR, ¡pero parece que este problema proviene directamente de la síntesis!

Resuelto: la salida extraña proviene de la optimización de síntesis. La herramienta se dio cuenta de que el bloque anterior en la cadena de elaboración nunca generará un bit diferente de 0 para ese bit específico. Mi error fue suponer que podía probar solo el bloque individual: lo que realmente estaba probando era el bloque sintetizado para el FPGA teniendo en cuenta todo lo demás en el diseño.

¡Gracias a todos por ayudarme, voy a seguir tus consejos!

Respuestas a la pregunta(2)

Su respuesta a la pregunta