2013-08-23 15 views

答えて

10

シミュレーション時間は、now関数を介して利用できます。これは、timeタイプの値を返します。 timeタイプのimage属性を使用して、time'image(now)でこれを文字列に変換することができます。

process is 
    variable sim_time_str_v : string(1 to 30); -- 30 chars should be enough 
    variable sim_time_len_v : natural; 
begin 
    ... 
    sim_time_len_v := time'image(now)'length; 
    sim_time_str_v := (others => ' '); 
    sim_time_str_v(1 to sim_time_len_v) := time'image(now); 
    report "Sim time string length: " & integer'image(sim_time_len_v); 
    report "Sim time string.......:'" & sim_time_str_v & "'"; 
    ... 
:追加の文字列操作が必要な場合には、シミュレーション時間列は次のようにコードの変数で表すことができ:

report "This is the time: " & time'image(now); 

追加:だから、あなたがあなた自身のメッセージでシミュレーション時間を印刷することができます

しかし、何らかの操作の結果を格納するには、その長さがわかっている必要があるため、VHDLはテキスト文字列操作に関して面倒です。より高度な文字列操作のためには、関数と組み合わせたaccessタイプをシミュレーションで使用することができます。

+0

こんにちはモルテン:素晴らしい!ありがとう!! – bFig8

+0

VHDL-2008はto_stringもサポートしています: –

0

@MortenZdk投稿を最初に読んでください。これは書式設定に関する長いコメントです。

イメージを使用するのではなく、VHDL-2008 to_string関数をお勧めします。あなたは組み込みの書き込み操作のファイルを一緒にこれを使用することができます:

write(OUTPUT, "This is the time: " & to_string(now) & LF) ; 

代わりに、あなたもtextioでそれを使用することができ、それが文字列リテラル値を明確にします。例えば、何の型修飾子は、以下に必要とされない:

write(write_buf, "The time is:" & to_string(now)) ; 
writeline(OUTPUT, write_buf) ; 

あなたが本当にtextioを嫌う場合は、ちょうどあなたが「」他の言語でのprint文でを使用するように連結し、to_stringに使用することができます。最後にLF文字を忘れて行を終了しないでください。他の場所にLF文字を追加して、複数の行を印刷することもできます。

write(OUTPUT, "%%ERROR: RX value does not match expected value" & 
       "Received Value: " & to_hstring(RxVal) & 
       " Expected Value: " & to_hstring(ExpectedVal) & 
       " at time: " & to_string(now) & LF) ; 

to_stringは、 '画像がサポートするもののスーパーセットをサポートしています。最も注目すべきは、配列の値(std_logic_vectorなど)です。オーバーロードが可能ですが、すでにVHDL-2008のtextioでサポートされているすべてのタイプでサポートされています。また、to_hstringとto_ostring(hwriteとowriteのように)の形式で16進数と8進数のオーバーロードをサポートしています。 VHDL-2008は、hwrite、owrite、hread、およびoreadの問題を取り除いたことに注意してください。

アクセスタイプの代わりに、VHDL-2008には値と長さの両方を返す文字列読み取りもあります。それは空白をスキップし、空白が見つかるまで文字を読み込みます(文字列変数の長さまで)。次の例では、文字列トークンを最大80文字にすることができます。

variable ReadVal : string(1 to 80) ; 
variable ReadLen : integer ; 
... 
sread(ReadBuf, ReadVal, ReadLen) ; 
関連する問題