-1

具体的にいきます。

シミュレーションには Ubuntu 14.04LTS、GHDL コンパイラ、および GTKWave を使用しています。

シンプルな 2 マルチプレクサーをシミュレートするための 2 つのファイルがあります: mux2.vhd と mux2_testbench.vhd

これは、mux2.vhd のコードです。

-- Libraries

library ieee;
use ieee.std_logic_1164.all;


-- Entity declaration

entity mux2 is

    port(
        e0, e1 : in std_logic;
        c : in std_logic;
        output : out std_logic
    );

end mux2;


-- Architecture declaration

architecture mux2_arch of mux2 is

    begin
    process (e0, e1, c)

        begin
        if c = '0' then
            output <= e0;
        else
            output <= e1;
        end if;
    end process;
end mux2_arch;

テストベンチのコード

--Libraries

library ieee;
use ieee.std_logic_1164.all;

--Empty entity for simulation

entity mux2_testbench is
end mux2_testbench;

architecture testbench_arch of mux2_testbench is
    component test is
        port(
            c : in std_logic;
            e0, e1 : in std_logic;
            output : out std_logic
        );
    end component;

    signal c: std_logic;
    constant clk: time:=50 ns;
    signal e0: std_logic;
    signal e1: std_logic;
    signal output: std_logic;

    begin
        lab: test
        port map(
            c => c,
            e0 => e0,
            e1 => e1,
            output => output
        );



        process
        begin

            --Case 1: Control signal is low
            c <= '0';

            e0 <= '0';
            e1 <= '0';
            wait for 100 ns;
            e0 <= '0';
            e0 <= '1';
            wait for 100 ns;
            e0 <= '1';
            e0 <= '0';
            wait for 100 ns;
            e0 <= '1';
            e0 <= '1';
            wait for 100 ns;

            --Case 2: Control signal is high
            c <= '1';

            e0 <= '0';
            e1 <= '0';
            wait for 100 ns;
            e0 <= '0';
            e0 <= '1';
            wait for 100 ns;
            e0 <= '1';
            e0 <= '0';
            wait for 100 ns;
            e0 <= '1';
            e0 <= '1';
        end process;

end testbench_arch;

私がやっていること:

エラーなしで端末経由でコンパイルしています: ghdl -a mux2.vhdおよびghdl -a mux2_testbench.vhd

次に、テストベンチの実行可能ファイルを作成します: ghdl -e mux2_testbench

最後に、gtkwave を使用するために必要な vcd ファイルを作成します 。ghdl -r mux2_testbench --vcd=test.vcd &

シミュレーション: gtkwave test.vcd

このコードには 2 つの問題があります。 1. 信号 e0 と e1 に異なる値を書き込んでいますが、e1 はシミュレーションで何も示しません。常に「0」です。

  1. 出力信号はシミュレーションで値「U」を示します。これが何を意味するのかさえわからず、Googleで明確なものを見つけることができませんでした。

仲間の皆さん、よろしくお願いします。

4

2 に答える 2

1

ブライアンのコメントに合わせて、テストベンチでのテストの代わりに mux2 を使用する構成仕様を追加しました。

architecture testbench_arch of mux2_testbench is
    component test is
        port (
            c:       in  std_logic;
            e0, e1:  in  std_logic;
            output:  out std_logic
        );
    end component;

    signal c:       std_logic;
    constant clk:   time := 50 ns;
    signal e0:      std_logic;
    signal e1:      std_logic;
    signal output:  std_logic;

    for lab: test use entity work.mux2; -- added

begin
lab: 
    test
        port map (
            c => c,
            e0 => e0,
            e1 => e1,
            output => output
        );

    process
    begin

        --Case 1: Control signal is low
        c <= '0';

        e0 <= '0';
        e1 <= '0';
        wait for 100 ns;
        e0 <= '0';
        e0 <= '1';
        wait for 100 ns;
        e0 <= '1';
        e0 <= '0';
        wait for 100 ns;
        e0 <= '1';
        e0 <= '1';
        wait for 100 ns;

        --Case 2: Control signal is high
        c <= '1';

        e0 <= '0';
        e1 <= '0';
        wait for 100 ns;
        e0 <= '0';
        e0 <= '1';
        wait for 100 ns;
        e0 <= '1';
        e0 <= '0';
        wait for 100 ns;
        e0 <= '1';
        e0 <= '1';
        wait for 100 ns;  -- added to terminate the simulation
        wait;             -- added ""
    end process;

end architecture testbench_arch;

また、--vcd=test.vcd の代わりに --wave=testbench.ghw を使用しているときに、--stop-time=somvalue フラグを追加せずにシミュレーションが終了するように、2 つの待機ステートメントを追加しました。

(Gtkwave は、ghdl に固有の GHW ダンプ ファイル形式も受け入れます。これは圧縮された形式であり、そうでなければ継続的にループするシミュレーションを停止するために CTL-C を使用することはできません)。

これは与える:

mux2_testbench.png

常に低いというマシューの答えを尊重して、e1どの入力が表示されるかを区別することができ、その選択機能を提供することoutputを示していることに注意してください。c

「U」が表示されるのは、コンポーネント テストがアンバインドされ、エンティティ テストが作業ライブラリに見つからないためです。

上記の例のバインド指示は、構成仕様によって行われます。IEEE Std 1076-2008 7.3 構成仕様および 7.3.2 バインディング表示を参照してください。

また、Matthew が提唱するようにエンティティの直接インスタンス化を使用するか、バインディング指示を含む構成宣言を使用して、テスト コンポーネントのインスタンス化をそのままにすることもできます。

テストベンチを再利用する機能は、テスト対象ユニット (ラボ) への入力の刺激パターンによって制限されます。

于 2016-03-26T02:01:27.233 に答える