Я работаю над своей магистерской диссертацией, и я новичок в VHDL, но все же мне нужно реализовать некоторые сложные вещи. Это одна из самых простых структур, которую мне приходилось писать, но я все еще сталкиваюсь с некоторыми проблемами.
Это автомат, реализующий 24-битный регистр сдвига с активным низким синхронизирующим сигналом (для программирования ЦАП). Это просто конец сложной цепочки разработок, которую я создал для своего проекта. Я следовал модели конечного автомата, насколько мог.
Поведенческая симуляция работает нормально, на самом деле вся созданная мною цепочка проработок отлично работает в том, что касается поведенческой симуляции. Однако, как только я пробую имитацию Post-translate, все начинает идти не так: много выходных сигналов «X».
С этим простым регистром сдвига я НЕ получаю никакого «X», однако я не могу перейти к фазе load_and_prepare_data. Кажется, что current_state изменяется (проверяя некоторые сигналы), но разработка не продолжается.
Имейте в виду, что, поскольку я новичок в этом языке, я понятия не имею, какие временные ограничения мне следует установить для этого FSM (и я бы все равно не знал, как их записать в top.ucf)
Вы видите, что не так? заранее спасибо
ИЗМЕНИТЬ
Я последовал вашим советам и очистил конечный автомат, используя процесс с одним состоянием. Я все еще сомневаюсь, «куда что ставить», но мне очень нравится новая реализация. Как бы то ни было, теперь я получаю чистую поведенческую симуляцию, но на всех выходных данных в посттрансляционной симуляции отображается «Х». Чем это вызвано? Я отправлю и новый код, и тестовый стенд:
----------------------------------------------------------------------------------
-- 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), как и первые три процесса, и сигнал sync_out застревает на 0, тогда как по умолчанию он должен быть равен «1».
ОБНОВЛЕНИЕ 2
Я изучал технологическую схему, начиная с проблемы sync_out = 0: она реализована с помощью FDS, S - это сигнал сброса FSM, D исходит от LUT3 с I = state & reset & start и INIT = 45 = "00101101. ". Я искал этот LUT3 при моделировании и заметил, что он имеет INIT = "00000000"!
Что-то мне не хватает в том, как запустить эту симуляцию? Кажется, что не все LUT в дизайне выставлены!
ОБНОВЛЕНИЕ 3. Кажется, что в моделировании Post-Translate есть какие-то ошибки, или я по какой-то причине неправильно его настраиваю: модели Post-Map и Post-PAR работают и отображают некоторые результаты . Однако есть странная ошибка: регистр stored_data не обновляется полным вектором data_in, после чего автомат работает правильно и выводит сохраненные данные. Я посмотрел на технологическую схему сразу после синтеза, и по какой-то причине биты 23,22,21,19,18 не связаны с соответствующим битом data_in. Вы можете увидеть эффект на этом скриншоте из моделирования Post-Map. То же самое происходит и в Post-PAR, но похоже, что эти проблемы возникают непосредственно из-за синтеза!
Решено: странный результат возникает при оптимизации синтеза. Инструмент понял, что предыдущий блок в цепочке разработки никогда не будет выводить бит, отличный от 0 для этого конкретного бита. Моя ошибка заключалась в том, что я предполагал, что могу протестировать единственный блок: на самом деле я тестировал блок, синтезированный для ПЛИС с учетом всего остального в проекте!
Спасибо всем, кто мне помог, буду следовать вашим советам!