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, с учетом всего остального в проекте!
Спасибо всем, кто мне помог, я буду следовать вашим советам!