2013-10-07 41 views
0

基本上我在我的模塊中有下面的代碼。我想將數字更改爲2的補碼負數。行爲邏輯順序,代碼無法正常工作?

例如, 100變成-100,-200變成200.

我找到的一個快捷方式是從LSB讀取,直到達到'1',然後翻轉它後面的所有位。我試圖用最少的性能折衷一個實現32位轉換器(聽說NUM < =不(NUM)+ 1是相當沉重的資源)

   flipBit <= '0'; -- reset the flip bit 
       FOR i IN 0 TO 31 LOOP 
        IF flipBit = '1' THEN 
         tempSubtract(i) <= not Operand2(i); 
        ELSE 
         tempSubtract(i) <= Operand2(i); 
        END IF; 
        IF Operand2(i) = '1' THEN 
         flipBit <= '1'; 
        END IF; 
       END LOOP; 

然而,這一切它對不是整個事情。另外,當我做num < =不是(num)+1時,它的速度很慢,它也給我亂碼。

誰能告訴我什麼是錯的?謝謝。

+1

您應該使flipBit成爲變量而不是信號,因此它在for循環中得到更新,而不是在過程結束時更新。 – hamon

+0

它的工作原理。這對我來說很粗心。謝謝! – charpi

回答

2

這是後話了綜合工具能可能比你做的更好,所以我會建議只使用z <= -a;,其中azsigned類型。

這將導致綜合優化否定目標架構,無論它是什麼。例如,在FPGA中計算不是+ 1非常有效。

0

你可以這樣做:signal < = signal * -1,工具會爲你合成它。這可能不是最有效的。我認爲它不會佔用那麼多的邏輯。如果你真的需要更高效的解決方案,你可以這樣做:

是否有任何理由需要在1個時鐘週期內完成上述轉換?如果你花了32個時鐘來做到這一點,它會更容易,可能更少的資源。我建議你刪除你的FOR循環,因爲它會導致你遇到的大多數問題。