2017-01-16 74 views
0

在以下代碼中,我已將cipher_temp2初始化爲整數值1.但是,當我模擬我的代碼時,我將cipher_temp2的值初始化爲0而不是。我無法弄清楚我出錯的地方。信號無法初始化爲VHDL中的整數值

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
entity ciphercalculation is 
     Port (Msg_temp2 : in integer; 
       cipher : out integer); 
end ciphercalculation; 

architecture Behavioral of ciphercalculation is 
CONSTANT e1: std_logic_vector(0 TO 2) := ('1', '0', '1'); 
CONSTANT Pk:integer:=377; 
CONSTANT le:integer:=2; 
Signal cipher_temp2:integer:=1; 
begin 
process(cipher_temp2,Msg_temp2) 
begin 
for i in 0 to le loop 
     if (e1(i)= '0') then 
      cipher_temp2<=((cipher_temp2*cipher_temp2) mod Pk); 
     else 
      cipher_temp2<=((cipher_temp2*cipher_temp2) mod Pk); 
      cipher_temp2<=((cipher_temp2*Msg_temp2)mod Pk); 
     end if; 
    end loop; 

cipher<=cipher_temp2; 
    end process; 

end Behavioral; 
+1

發佈一個演示這個的最小測試臺。另外提及您正在使用的模擬器/版本。在ghdl中我看到它被初始化爲1.然後激活這個過程,它將它設置爲340,然後是0,都是0 ms。 –

+0

http://imgur.com/a/B2Lgj這裏是模擬的截圖。我使用了Vivado 2014.4 –

+0

而且這並不會讓你看到你需要看到的東西,正如我解釋的那樣。 –

回答

0

首先,我想提出幾點開始你的端口映射使用std_logic_vectorstd_logic。當你有不同的模塊,甚至不得不接口Verilog/VHDL/SystemVerilog時,它會使它變得更容易。同時在你的界面上有一個時鐘將使事情運行更平滑,並使調試更容易。

現在,您應該意識到,仿真不是FPGA的真實仿真,但Xilinx工具盡力而爲。在FPGA中,所有上電邏輯,GSR或全局置位/復位都有一個信號。這個信號決定了每個線/寄存器/葉/單元將如何被初始化。

使用由GSR設置的初始值時應始終注意的一個問題是,GSR是異步事件,即不考慮計時。

一般來說,這個值應該初始化爲你在聲明中指定的內容,但是因爲它是一個模擬(並且使用了vivado的引擎),它可能不會模擬你的想法。 如果您使用Xilinx進行綜合,請注意,初始值不是綜合標準的一部分,工具應該將值放在LUT中。然而,在你模擬的時候,這些工具會嘗試彷彿它是一個FPGA,但它只會模擬你給它的刺激。 這可能是你的問題,因爲vivado模擬器比ISE好一點(雖然它們仍然使用相同的代號,但是vivado引擎有改進)。

爲了解決這個問題,我建議你有一個簡單的重置條件,指定你的初始值應該是什麼。另請注意,Xilnix標準將保留〜5us的重置。