4

「ドントケア」入力を持ち、「ドントケア」を直接表現する VHDL 関数を実装するにはどうすればよいですか?

Free Range VHDLの演習 4.8-2a では、次のことを求められます。

...選択した信号の割り当てを使用して、これらの関数を実装する VHDL モデルを記述します。

a) F (A、B、C、D) = A'CD' + B'C + BCD'

このコードは機能します:

library ieee;
use ieee.std_logic_1164.all;

entity funca_selected is
  port (
    a: in std_ulogic;
    b: in std_ulogic;
    c: in std_ulogic;
    d: in std_ulogic;
    x: out std_ulogic);
end entity;

architecture rtl of funca_selected is
  signal s: std_ulogic_vector(3 downto 0);
begin
  s <= a & b & c & d;
  with s select x <=
    '1' when "0010" | "0110" | "0011" | "1010" | "1011" | "1110",
    '0' when others;
end architecture;

ただし、関数定義の表現としては不十分です。コードが定義により厳密に一致するように、「ドントケア」入力を使用してコーディングしたいと考えています。これにより、作業が少なくなり、正しくするのが簡単になります。私はこれを試しました:

  with s select x <=
    '1' when "0-10" | "-01-" | "-110",
    '0' when others;

これは機能しません: テスト ベッドでこの機能を実行すると、結果は常に「0」になります。

GHDL バージョン 0.29+gcc4.3.i386 を使用しています。

VHDL関数はどのように「ドントケア」入力を表現できますか?

4

4 に答える 4

2

ザイリンクス ISE 14.6 で両方のバージョンのロジックを試したところ、両方のバージョンで動作しましたが、注意点がいくつかあります。まず、「ドント ケア」バージョンの RTL 回路図を明示的バージョンと比較すると、「ドント ケア」バージョンの方がはるかに単純で、より最適化されています。「ドントケア」バージョンには 4 つの論理ゲートがあり、ゲートあたりの最大入力ラインは 3 ラインです。明示的なバージョンには 7 つの論理ゲートがあり、ゲートあたりの最大入力ラインは 6 ラインです。

2 つのバージョンをテスト ベンチするとき、4 つの異なるシミュレーション オプションがあります。行動モデルでは、「気にしない」バージョンの出力は、あなたが述べたように平らな線であり、「気にしない」バージョンは機能しないように見えますが、他の3つのシミュレーションオプションすべてで、両方のバージョンが完全に機能し、出力されます同一です。したがって、ビヘイビア モデルは VHDL コードの「ドント ケア」部分を処理する方法を認識していないように見えますが、コードは合成可能であり、VHDL コードで「ドント ケア」を使用することは非常に価値があります。

于 2014-04-27T19:31:57.493 に答える
1

はい、ghdl は IEEE Std 1076-1993 に準拠していることしか期待できませんが、そこには 1 つまたは 2 つの穴があります。

最初の項 (A̅CD̅) が必要ないことに気付いた場合、関数はより単純になる可能性があります。結果はそれに依存しません。最初の積項は出力で明らかになりません。

選択されたシグナル割り当ての評価対象が式であることは関係ありません。MortenZdk の同時シグナル割り当てステートメントの式を使用できます。

library ieee;
use ieee.std_logic_1164.all;

entity f_test is
end;
architecture test of f_test is

    subtype vector is  std_logic_vector (3 downto 0);
    type    vectorstream is array (0 to 15) of vector;

    constant stimulous: vectorstream  :=(
    x"0",x"1",x"2",x"3",x"4",X"5",x"6",x"7",
    x"8",x"9",x"A",x"B",x"C",x"D",x"E",X"F"
    );

    signal index: integer range 0 to 15;

    signal a,b,c,d: std_logic;

    signal x:   std_logic;

begin
Test_Vectors:
    process
        variable TV: std_logic_vector(3 downto 0);
    begin
        -- first term is valid
        for i in vectorstream'range loop

                index <= (i);   -- make vector index  visible in waveform
                TV  := vector(stimulous(i));
                a <= TV(3); b <= TV(2); c <= TV(1); d <= TV(0);  
                wait for 10 ns;                      
            end loop;

            wait;  -- ends simulation

    end process;
EVALUATE:  -- "the code more closely matches the definition"

    with TO_X01(
                ( not a           and c and not d) or  -- b is don't care
                (           not b and c          ) or  -- a, d are don't care
                (               b and c and not d)     -- a is don't care
               ) select x <= '1' when '1',
                             '0' when '0',
                             'X' when 'X';  -- equivalent of 'else 'X' in 
                                            -- concurrent signal assignment

end;

TO_X01 は強度ストリッパーと呼ばれ、パッケージ std_logic_1164 からのもので、「X」、「0」または「1」のいずれかに評価されます。

選択されたシグナルの割り当てには、条件付きのシグナルの割り当てと同等のものがあり、両方をプロセスとして表すことができます。

ghdl -a f_test.vhdl
ghdl -r f_test --wave=f_test.ghw
open f_test.ghw

gtkwave シミュレーション結果

タイプ X01 にマップされた std_Logic_1164 パッケージの「and」および「or」の stdlogic_table で指定されているように、他の要素値を伝播するデモンストレーションを追加して、選択した信号割り当てステートメントの選択肢の数を減らすことができます。

また、select x <= '1' when '1' では、最初の '1' は std_logic 値を参照し、2 番目の '1' は X01 型の値を参照することに注意してください。

A̅CD̅ の最初の積項行をコメントアウトして、結果 x に影響がないことを示すことができます。

于 2013-07-28T23:08:18.550 に答える