Я изменяю множитель, и у меня возникают проблемы с его запуском на FPGA. В Modelsim все симуляции корректны. У меня есть следующее, что дает неправильный результат на FPGA: вне оператора процесса у меня есть следующий параллельный оператор
(Я опустил объявления сигналов)
architecture behavioral of multiplier is
...
...
begin
a_argument <= a1_neg when booth = "110"
else a2_plus when booth = "011";
Значение a1_neg и a2_plus предварительно вычисляются в операторе процесса при входе в состояние умножения:
when MULT_SIGNED_MULT =>
a1_plus(33 downto 0) <= a(31) & a(31) & a;
a1_neg(33 downto 0) <= not a(31) & not a(31) &bv_negate(a);
a2_plus(33 downto 0) <= a(31) & a & "0";
a2_neg(33 downto 0)<= not a(31) &bv_negate(a) & "0";
Затем он переходит к этапу, на котором множитель вычисляет новые значения booth, которые влияют на сигнал a_argument.
С другой стороны, когда я не вычисляю значения заранее и напрямую ввожу все в параллельный оператор следующим образом:
a_argument <= not a(31) & not a(31) &bv_negate(a) when booth = "110"
else not a(31) &bv_negate(a) & "0" when booth = "011";
FPGA выдаст правильный результат. Кроме того, Modelsim даст правильный результат независимо от разницы между этими двумя параметрами.
Мне было интересно, почему один вариант дает правильный результат на FPGA, а другой нет.
a_argument
— это защелка, потому что вы не указали условиеwhen others
. Вы должны исследовать, как это синтезируется в вашем целевом устройстве. Здесь вам нужен только мультиплексор 2-к-1, поэтому вы можете просто заменитьwhen booth="011"
наwhen others
. - person Kevin Thibedeau   schedule 09.06.2015a_argument
отличается от первого в случаеbooth="011"
— этоa2_neg
, а неa2_plus
. Действительно ли опубликованный вами код отражает то, что вы тестируете? - person user_1818839   schedule 09.06.2015