0

私は2つのデザインを持っています:

library ieee;
use ieee.std_logic_1164.all;

entity eq_test1 is

  port (a,b : IN std_logic_vector (1 downto 0);
        o   : OUT std_logic); 
end eq_test1;

architecture strange_behavior of eq_test1 is
begin  
    P: process (a,b)
    begin
        if a = b then o <= '1';
        else o <= '0';
        end if;
    end process P;
end strange_behavior;

Modelsim で a を「00」に、b を「0L」に強制すると、o が「0」になることが示されます。したがって、L は 0 として解釈されず、"00" = "0L" は false です。Ok。

しかし、同じデザインを追加すると

use ieee.std_logic_unsigned.all;

リストに対して、動作が異なります。次に、"00" = "0L" は true を返すため、L は 0 と同じです (0 は '1' になります)。その未署名のパッケージが含まれていると、「0X」=「0Z」でも true が返されます。

誰でも理由を説明できますか?

4

3 に答える 3

2

std_logic_unsignedの定義を見てください。次のように「=」の元の定義を置き換えます

function "="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
begin
    return   UNSIGNED(L) = UNSIGNED(R);
end;

UNSIGNED 型はリテラル 'h' と 'l' を認識しない整数型であるため、それに応じて整数値に解決され、したがって 'l' は UNSIGNED と同等のセマンティックである '0' になります。

于 2013-07-23T09:11:18.677 に答える
2

簡単な答えは、std_logic_unsignedとその意図された置換numeric_std_unsignedが、'H' と 'L' を '1' と '0' として適切に処理することです。

「符号なし」パッケージは、std_logic_unsigned を符号なしの数値として扱います。以下にいくつかの利点を示します。

  • 「H」と「L」の適切な取り扱い
  • 入力の数値処理、特にサイズが異なる場合
  • Addr = 0( ) ではなく整数 ( Addr = "0000")とstd_logic_vector の混在をサポート
  • >、>=、<、<= をオーバーロードするため、辞書の順序付けではなく、数学的な順序付けを行います。サイズが異なる場合は重要です。

ベンダー (合成) が VHDL-2008 マッチング関係演算子を実装するまでは、これらのパッケージのいずれかを使用すること?= ?/= ?> ?>= ?<?<=お勧めします。一致するリレーショナルを実装するときは、新しい設計でそれらを使用することをお勧めします。

VHDL-2008 機能の詳細については、http: //www.synthworks.com/blog/vhdl-standards/ を参照してください。

于 2013-07-23T15:46:40.960 に答える