2017-01-16 27 views
0

次のコードでは、cipher_temp2を整数値1に初期化しました。しかし、私のコードをシミュレートすると、cipher_temp2の値は0の代わりに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

http://imgur.com/a/B2Lgjここにシミュレーションのスクリーンショットがあります。私はVivadoを使用しました2014.4 –

+0

そして、私が説明したように、それはあなたが見たいものを貯めることはありません。 –

答えて

0

まず第一に、私はあなたのポートマッピングにstd_logic_vectorまたはstd_logicを使用して始まるいくつかのことを提案したいと思います。それはあなたが異なるモジュールを持っているか、Verilog/VHDL/SystemVerilogをインタフェースする必要があるときでさえ、ずっと簡単になります。また、あなたのインターフェースに時計を置くことで、物事がスムーズになり、デバッグが容易になります。

ここで、シミュレーションはFPGAの真のシミュレーションではありませんが、ザイリンクスツールが最善を尽くしていることに注意してください。 FPGAには、電源投入時のすべてのロジック、GSR、またはグローバルセット/リセットに信号が流れます。この信号は、どのワイヤ/レジスタ/リーフ/セルがどのように初期化されるかを指示する。

GSRによって設定される初期値を使用するときに常に注意しなければならない1つの問題は、GSRが非同期イベントであることです。つまり、クロッキングに関係なく発生します。

一般に、値は宣言で指定する値に初期化する必要がありますが、シミュレーション(およびvivadoのエンジンを使用しているため)のため、想定通りにシミュレートできない可能性があります。 これをザイリンクスで合成する場合、初期値は合成標準の一部ではないことにも注意してください。ツールは値をLUTに入れてください。しかし、シミュレートしている間、ツールはFPGAのように動作しようとしますが、与えた刺激だけをシミュレートします。 vivadoシミュレータはISEよりも少し優れています(ただし、同じコードネームを使用していますが、vivadoエンジンでは改善されています)。

これを回避するには、初期値がどのようなものであるべきかを指示する簡単なリセット条件があることをお勧めします。また、Xilnix規格では〜5usのリセットを保持することに注意してください。

関連する問題