2015-06-09 4 views
0

Я изменяю множитель, и у меня возникают проблемы с его запуском на FPGA. В Modelsim симуляция правильна. У меня есть следующее, что дает неправильный результат на FPGA: Вне заявления процесса, у меня есть следующий параллельный операторVHDL, назначение параллельного сигнала неверно на FPGA, но прямо в Modelsim

(я опущенные заявления сигнала)

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"; 

И тогда он входит этап, на котором множитель вычисляет новые значения будки которые влияют на 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"; 

ПЛИС будет производить правильный результат. Кроме того, Modelsim даст правильный результат независимо от разницы между этими двумя.

Мне было интересно, почему один вариант дает правильный результат на FPGA, а другой нет.

+0

Всех видов возможных причин , Возможно, гонка. Как «ModelSim дает правильный результат»? Как работает этот процесс? Комбинаторные? Clocked? Что находится в списке чувствительности? – EML

+4

'a_argument' является защелкой, потому что вы не предоставили условие« когда другие ». Вы должны исследовать, как это синтезируется на вашем целевом устройстве. Вам нужно всего лишь 2-к-1 mux, чтобы вы могли просто заменить 'when booth =" 011 "' '' when others'. –

+1

Посмотрите на свой список чувствительности к процессу, особенно если вы считаете, что синтезированная реализация верна и ваша симуляция неверна. Ваши фрагменты кода не являются [минимальным, полным и проверяемым примером] (http://stackoverflow.com/help/mcve). – user1155120

ответ

1

Я думаю, что ваше параллельное утверждение неверно:

a_argument <=  a1_neg when booth = "110" 
        else a2_plus when booth = "011"; 

Вы должны иметь еще другое заявление, когда стенд отличается от «110» и «011». Пример хорошего параллельного заявления:

a_argument <= a1_neg when booth = "110" 
       else a2_plus when booth = "011" 
       else (others => '0'); 

Но значение по умолчанию (другие => «0»), может быть, не то, что вы хотите. Может быть, вы действительно хотите защелку, так что вы должны поместить назначение a_argument в синхронизированный процесс, в котором защелку a_argument делается, когда стенд отличается от «110» и «011»:

process(clk) 
begin 
    if rising_edge(clk) then 
    if (booth = "110") then 
     a_argument <= a1_neg; 
    elsif (booth = "011") then 
     a_argument <= a2_plus; 
    end if; 
end