Почему я не получаю выход на мой множитель VHDL?

Я пытаюсь сделать 4-битный множитель. Вот мой дизайн верхнего уровня: введите здесь описание изображения

А вот и два модуля: введите здесь описание изображениявведите здесь описание изображения

Однако, когда я пытаюсь смоделировать это, я не получаю никакого результата. Мой тестовый стенд:

    ARCHITECTURE behavior OF sim3 IS 

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

    COMPONENT multiplicator
    PORT(
         a : IN  std_logic_vector(3 downto 0);
         b : IN  std_logic_vector(3 downto 0);
         reset : IN  std_logic;
         clk : IN  std_logic;
         start : IN  std_logic;
         prod : OUT  std_logic_vector(7 downto 0);
         ready : OUT  std_logic
        );
    END COMPONENT;


   --Inputs
   signal a : std_logic_vector(3 downto 0) := (others => '0');
   signal b : std_logic_vector(3 downto 0) := (others => '0');
   signal reset : std_logic := '0';
   signal clk : std_logic := '0';
   signal start : std_logic := '0';

    --Outputs
   signal prod : std_logic_vector(7 downto 0);
   signal ready : std_logic;

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

BEGIN

    -- Instantiate the Unit Under Test (UUT)
   uut: multiplicator PORT MAP (
          a => a,
          b => b,
          reset => reset,
          clk => clk,
          start => start,
          prod => prod,
          ready => ready
        );

   -- 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        
        wait for clk_period;
        reset<='1';
        wait for clk_period;
        reset<='0';
        a<="0011";
        b<="0010";
        start <='1';
        wait for clk_period*10;
   end process;

END;

Когда я устанавливаю начало на «1», симуляция просто останавливается. Я не знаю почему. Я получаю следующую ошибку:

ERROR: at 20 ns(10000): Iteration limit 10000 is reached. Possible zero delay oscillation detected where simulation can not advance in time because signals can not resolve to a stable value in File "D:/faculta/PL II/multiplicator/reg8.vhd" Line 45. Please correct this code in order to advance past the current simulation time.

введите здесь описание изображения

Я не вижу, что может быть не так в этой строке:

q_s <= "00000000" WHEN reset='1' ELSE d WHEN reset='0' and load='1' ELSE q_s;

Некоторая помощь, пожалуйста?


person gdany    schedule 21.05.2015    source источник
comment
Ошибка возникает внутри вашего объекта reg8. Было бы полезно иметь возможность увидеть этот код; одной строки, которую вы разместили, недостаточно, чтобы мы увидели, где находится петля.   -  person scary_jeff    schedule 21.05.2015


Ответы (1)


Не используйте регистр с возможностью загрузки, используйте регистр фронта тактового сигнала. Предел итерации — это предел дельта-цикла в ISIM. Вводя «1» в b, вы получаете ударный осциллятор, петлю с задержками дельта-цикла и инверсией (суммированием). Сделайте фронт синхронизации num4, reg4 и reg8 управляемым с их нагрузками как разрешающими, это кажется совместимым с Lab10, в котором показано использование часов (и исходного кода VHDL для @scary_jeff, хотя и выраженного в типе BIT вместо std_logic). Этот феномен обратной связи упоминается в книге Уильяма Кафига VHDL 101 Все, что вам нужно знать для начала в главе 4.

Гугл переводчик помогает. Кажется, никто никогда не предоставляет свои раздаточные материалы для своих заданий.

Если вы посмотрите на исходную реализацию присваивания q_s в reg4:

block1: 
    block (ck = '1' and not ck'stable)
    begin
        q_s <= guarded "0000" when reset = '1' else
                           d  when reset = '0' and load = '1' else
                         q_s;
    end block block1;

Я бы перевел это в оператор синтезируемого процесса вместо оператора блока, сделав понятным reg4reg8) регистр с синхронизацией:

block1: 
    process (ck)
    begin
        if rising_edge(ck) then 
            if reset = '1' then
                q_s <= (others => '0');
            elsif load = '1' then
                q_s <= d;
            end if;
        end if;
    end process;

Причина, по которой оригинал работает, заключается в том, что оператор блока может иметь оператор защиты.

Изменение проясняет, что q_s — это тактовый регистр с синхронным сбросом.

Вы также можете заметить, что мы больше не ссылаемся на q_s и можем напрямую назначать q.

В автомате управления процесс, присваивающий next_state current_state, также может быть обновлен:

    process (ck)
    begin
        if ck'event and ck = '1' then  -- or rising_edge(ck)
            current_state <= next_state;
        end if;
    end process;

Просто для удобства чтения. Необычно использовать форму not ck'stable для обозначения события часов, отметив, что вы также, похоже, упустили значение при реализации reg8, возможно, также в reg4 и automat.

Приемлемость синтеза защищенного выражения в качестве часов, чувствительных к фронту, продемонстрирована в IEEE Std 1076.6-2004, 6.1.3.6 Хранилище, чувствительное к фронту, с использованием защищенного блока.

person Community    schedule 21.05.2015
comment
Это один из случаев более общего правила: следует избегать асинхронной последовательной логики. Любой достаточно опытный, чтобы иметь шанс заставить это работать, также понимает, почему это так редко уместно. - person Ben Voigt; 22.05.2015
comment
@BenVoigt - Глубоко изучив проблему, я полагаю, что проблема возникает из-за «заполнения пробелов», создающего reg8, не показанного в лабораторном задании, из-за непонимания использования оператора защиты, подразумевающего чувствительность к краю регистр. Я успешно продублировал задание, используя std_logic; - person ; 22.05.2015
comment
Спасибо, Дэвид! Я, наконец, заставил это работать, и теперь у меня есть хорошая симуляция. Проблема заключалась в том, что я на самом деле не понимал, что делают тактовые сигналы. Это очень хорошее объяснение, и часы теперь в порядке. Это работает хорошо. - person gdany; 22.05.2015
comment
Я тоже заставил это работать, хотя я использовал оператор блока вместо отдельной сущности/архитектуры caledate. Видел ваш симптом и в num4. Произошла ошибка транскрипции. Должен быть только один рег8, прод можно питать от аккумулятора. - person ; 22.05.2015