2

次のVHDL-200Xアーキテクチャを使用している場合:

architecture my_arc of my_entity is
    signal test_char   : std_logic_vector(7 downto 0);
    signal test_char_c : character;
    signal test_char_i : integer;
begin
    test_char   <= "01001010";
    test_char_i <= to_integer(unsigned(test_char));
    test_char_c <= character'val(test_char_i);
end architecture my_arc;

...そしてそれをシミュレートし(ザイリンクスiSim 14.1で)、値をとっても初期値のからtest_char_c変更されません。ただし、アーキテクチャの最後の行を次のように置き換えた場合:NULtest_char_i74

    process(test_char_i)
    begin
        test_char_c <= character'val(test_char_i);
    end process;

...それから私が期待するようにtest_char_c価値を引き受けます。J

右側の信号が変わる、ベア信号の割り当ても同時に更新されると思いました。つまり、割り当てに関係するすべてのシグナルに敏感なプロセスに相当します。

test_char_c最初に更新されないのはなぜですか?

編集:に変更しても結果は変更test_char_iされnaturalません。

4

2 に答える 2

2

初期化時に、a にマップされないtest_char_i値 があります- Modelsim 10.0 レポート:integer'lowcharacter

# ** Fatal: (vsim-3390) Result ?(-2147483648) of attribute 'VAL is out of range NUL (0) to 'ÿ' (255).
#    Time: 0 ns  Iteration: 0  Process: /my_entity/line__15 File: attr.vhd
# Fatal error in Architecture my_arc at attr.vhd line 15
# 

を作成test_char_inaturalて に初期化すると0、期待どおりに動作します (少なくとも Modelsim では、iSim を試していません)。

于 2012-07-24T13:00:12.803 に答える
0

右側の信号が変更されると、裸の信号の割り当てが同時に更新されると思いました。つまり、割り当てに関係するすべてのシグナルに敏感なプロセスと同等です。

そのとおりです。

最初のインスタンスで test_char_c が更新されないのはなぜですか?

します。

上のすべての値の更新を報告する監視プロセスを使用した、最小限、完全、かつ検証可能な例test_char_c:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity my_entity is
end entity;

architecture my_arc of my_entity is
    signal test_char   : std_logic_vector(7 downto 0);
    signal test_char_c : character;
    signal test_char_i : natural; -- integer;
begin
    test_char   <= "01001010";
    test_char_i <= to_integer(unsigned(test_char));
    test_char_c <= character'val(test_char_i);

    process (test_char_c)
    begin
        report "test_char_c = " & character'image(test_char_c);
    end process;
end architecture my_arc;

test_char_iデフォルトの初期値 (INTEGER'LOW) を克服するための宣言の変更に注意してください。これにより、Martin Thompson によって報告された境界チェックの失敗が発生します。

これは、-1993 準拠の VHDL ツールを使用して分析、精緻化、およびシミュレートされました。

ghdl -r my_entity
../../src/ieee/numeric_std-body.v93:2098:7:@0ms:(アサーション警告): NUMERIC_STD.TO_INTEGER: メタ値が検出され、0 が返されました
my_entity.vhdl:19:9:@ 0ms:(レポート メモ): test_char_c = nul
my_entity.vhdl:19:9:@0ms:(レポート メモ): test_char_c = 'J'

パッケージ numeric_std からのアサーション警告は、test_charデフォルトの初期値「UUUUUUUU」が原因です。

最初に報告されたtest_char_c値は、報告した NUL であり、の初期値test_char_iが 0 (NUL へのマッピング) であるため発生します。

2 つ目は、 への同時単純シグナル割り当てに応答して、test_charが更新さtest_char_iれ、次に が更新されますtest_char_c(そして監視プロセスが再開されます)。test_charこれは、割り当てられたビット文字列を値 x"4A" (文字 'J' に対応)で反映します。

表示されている監視プロセスの代わりに、次の形式のアサーション ステートメントが必要な場合:

    assert test_char_c /= NUL
        report "test_char_c = " & character'image(test_char_c);

アサーション ステートメントの条件が評価され、false が検出されたときにアサートされるため、最初のレポート ステートメントのみが表示されることがわかります。

同様に、条件の「/=」が「=」に変更された場合、2 番目のレポート ステートメントのみが表示されます (「J」が表示されます)。

MCVe を提供しないと、問題を再現することはできません (または、当時発生していた ISIM のせいにすることはできません)。

于 2016-05-26T14:42:05.617 に答える