VHDL - FSM не запускается (ПРОСТО в симуляции синхронизации)

Я работаю над магистерской диссертацией и довольно плохо знаком с VHDL, но все же мне нужно реализовать некоторые сложные вещи. Это одна из самых простых структур, которые мне пришлось написать, и все же я сталкиваюсь с некоторыми проблемами.

Это FSM, реализующий 24-битный сдвиговый регистр с сигналом активной-низкой синхронизации (для программирования ЦАП). Это всего лишь конец сложной цепочки разработки, которую я создал для своего проекта. Я следовал примеру модели FSM, насколько мог.

Поведенческое моделирование работает отлично, фактически вся цепочка разработки, которую я создал, прекрасно работает в том, что касается поведенческого моделирования. Однако, как только я попробую посттрансляционное моделирование, все пойдет не так: много выходных сигналов «Х».

С этим простым регистром сдвига я не получаю никаких «X», однако я не могу добраться до фазы load_and_prepare_data. Кажется, что current_state изменяется (проверяя некоторые сигналы), но разработка не продолжается.

Пожалуйста, имейте в виду, что, поскольку я новичок в этом языке, я понятия не имею, какие временные ограничения я должен установить на этом FSM (и я все равно не знаю, как их записать в top.ucf)

Вы видите, что не так? заранее спасибо

РЕДАКТИРОВАТЬ

Я последовал вашим советам и очистил FSM, используя единый процесс. У меня все еще есть некоторые сомнения относительно того, «где что разместить», но мне действительно нравится новая реализация. В любом случае, теперь я получаю чистую поведенческую симуляцию, но 'X' на всех выходах в посттрансляционной симуляции. Чем это вызвано? Я выложу и новый код, и тестовый стенд:

----------------------------------------------------------------------------------
-- 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;

И испытательный стенд:

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;

ОБНОВЛЕНИЕ 1

Обновлен с последним дизайном: этот код не вызывает никаких «X» (не могу понять, почему, это не так, но предыдущий сделал). Однако он не запускается (в моделировании POST-TRANSLATE), как первые 3 процесса, и сигнал sync_out застрял в 0, в то время как по умолчанию он должен быть «1».

ОБНОВЛЕНИЕ 2

Я изучал технологическую схему, начиная с проблемы sync_out = 0: она реализована с помощью FDS, S - сигнал сброса FSM, D поступает из LUT3 с I = состояние & сброс и запуск и INIT = 45 = "00101101 ». Я искал этот LUT3 в симуляции, и я заметил, что он имеетINIT = "00000000"!

Я что-то упускаю из-за того, как запустить эту симуляцию? Кажется, что все ЛУТ в дизайне не установлены!

ОБНОВЛЕНИЕ 3 Кажется, что имитация Post-Translate в некотором роде глючит, или я по какой-то причине неправильно его настраиваю: симуляции Post-Map и Post-PAR работают и отображают некоторые результаты. Однако есть странная ошибка: регистр сохраненных данных не обновляется с полным вектором data_in, после этого FSM работает правильно и выводит сохраненные данные. Я посмотрел на схему технологии сразу после синтеза, и по какой-то причине биты 23,22,21,19,18 не связаны с соответствующим битом data_in. Вы можете увидеть эффект на этом скриншоте из моделирования Post-Map. То же самое происходит в Post-PAR, но кажется, что эта проблема возникает непосредственно из синтеза!

решаемая: странный вывод исходит из оптимизации синтеза. Инструмент понял, что предыдущий блок в цепочке разработки никогда не будет выводить немного отличное от 0 для этого конкретного бита. Моя ошибка заключалась в том, что я мог протестировать только один блок: я действительно тестировал блок, синтезированный для FPGA, с учетом всего остального в проекте!

Спасибо всем, кто мне помог, я буду следовать вашим советам!

Ответы на вопрос(2)

Ваш ответ на вопрос