Shift Right (srl) работает неправильно на VHDL Quartus II

Я пытаюсь сделать 8-битный последовательный множитель на Quartus II. Я сделал все симуляции всех блоков, но один показывает ошибку в симуляции VWF. Блок sum_reg выполняет бесконечный сдвиг за очень короткий промежуток времени.

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

В «темно-синей» части симуляции сигнала, на o_DOUT, это когда сдвиг становится бесконечным, пока старший бит не переходит в младший бит. На изображении ниже показано, что происходит в темно-синей части симуляции:

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

Кто-то знает, что случилось?

Под кодом:

Суммарный регистр (где симуляция идет не так):

 library IEEE;
 use IEEE.std_logic_1164.all;
 use IEEE.numeric_std.all;

 entity sum_register is 
 port (
     i_DIN   : in UNSIGNED(8 DOWNTO 0);
     i_LOAD  : in STD_LOGIC;
     i_CLEAR : in STD_LOGIC;
     i_SHIFT : in STD_LOGIC;
     o_DOUT  : buffer UNSIGNED(15 downto 0)
 );
 end sum_register;

 architecture arch_1 of sum_register is 
 begin 
     process(i_CLEAR,i_LOAD,i_SHIFT, i_DIN)
     begin
        IF (i_CLEAR = '1') THEN
            o_DOUT <= "0000000000000000";
        ELSIF (i_LOAD = '1') THEN
            o_DOUT(15 downto 7) <= i_DIN;
        ELSIF (i_SHIFT = '1') THEN
             o_DOUT <= o_DOUT SRL 1;
        END IF;
      end process;
end arch_1;

person Community    schedule 06.06.2016    source источник
comment
Пожалуйста, рассмотрите возможность создания минимального, полного и проверяемого примера.   -  person Morten Zilmer    schedule 06.06.2016
comment
Я отредактировал оригинальную публикацию, чтобы сделать MVE еще лучше! Спасибо!   -  person    schedule 06.06.2016
comment
Это все еще не минимально воспроизводимый пример, *убедитесь, что включена вся информация, необходимая для воспроизведения проблемы< /б>. Вы также забыли сообщить своей читающей аудитории, что это симуляция постсинтеза, моделирование поведения показывает без проблем. Это ударный осциллятор, возвращающий выходной сигнал на вход с задержкой благодаря реализации srl, i_SHIFT — это активация защелки для o_DOUT. Моделирование поведения завершилось бы неудачей, если бы в списке чувствительности процесса был o_DOUT.   -  person    schedule 06.06.2016
comment
user1155120, значит надо ставить задержку после сдвига, что-то вроде: o_DOUT ‹= o_DOUT SRL 1 после xx ns;? Или я должен вывести выходной сигнал из процесса? Я не до конца понял ваш ответ.   -  person    schedule 07.06.2016
comment
Я использовал тактовый сигнал, чтобы решить проблему, я сделал эту схему синхронной, чтобы решить проблему с защелкой. Но мне действительно интересно понять ваше решение, потому что у меня эта проблема возникает во второй раз, и снова мне нужно использовать тактовый сигнал, чтобы решить эту проблему. Если бы вы могли еще раз подробно объяснить свое решение без тактового сигнала, я будьте очень благодарны!   -  person    schedule 07.06.2016


Ответы (1)


Вам нужно использовать тактовый сигнал в схеме, чтобы сделать это синхронным, вам понадобится вход в вашу сущность следующим образом:

i_CLOCK : in STD_ULOGIC;

После этого вам нужно будет сделать ваш процесс чувствительным к часам:

process(i_CLOCK)

И ваша архитектура изменится на это:

 architecture arch_1 of sum_register is
  SIGNAL r_DOUT : unsigned(15 downto 0);
 begin
     process(i_CLOCK)
     begin
     IF rising_edge(i_CLOCK) THEN
        IF (i_CLEAR = '1') THEN
            r_DOUT <= "0000000000000000";
        ELSIF (i_LOAD = '1') THEN
            r_DOUT(15 downto 8) <= i_DIN;
        ELSIF (i_SHIFT = '1') THEN
              r_DOUT <= r_DOUT SRL 1;
        END IF;
      END IF;
      end process;
      o_DOUT <= r_DOUT;
end arch_1;

С этой архитектурой вам понадобится сигнал без знака, чтобы сделать атрибуцию для вашего вывода o_DOUT, с этим вы можете снова изменить свой вывод o_DOUT на тип вывода (не буфер).

ПРИМЕЧАНИЕ. Тактовый сигнал должен быть одинаковым для всех блоков!

person Mutante    schedule 10.06.2016