0

私はオンラインで書籍 (Free Range VHDL) を読んで VHDL を学習しており、Xilinx ISE Webpack 14.7 を介して Nexsys2 にサンプルを実装しています。Free Range VHDL のテキストを読み直しており、現在、プロセスについて説明している章にいます。プロセスとは何か、どのように機能するかについてはしっかりと理解していますが、例を実装しましたが、結果はわかりません。

次のコードを使用して、8 対 1 のマルチプレクサを実装しました。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity mux81 is
    port( d_in : in std_logic_vector(7 downto 0);
            sel : in std_logic_vector(2 downto 0);
            ce : in std_logic;
            F : out std_logic);
end mux81;

architecture my_mux81 of mux81 is
begin
mux_proc: process(d_in, sel, ce)
    begin
        if (ce = '1') then
            if (sel = "111") then
                F <= d_in(7);
            elsif (sel = "110") then
                F <= d_in(6);
            elsif (sel = "101") then
                F <= d_in(5);
            elsif (sel = "100") then
                F <= d_in(4);
            elsif (sel = "011") then
                F <= d_in(3);
            elsif (sel = "010") then
                F <= d_in(2);
            elsif (sel = "001") then
                F <= d_in(1);
            elsif (sel = "000") then
                F <= d_in(0);
            else
                F <= '0';   
            end if;
        else
            F <= '0';
        end if;
    end process mux_proc;
end my_mux81;

「ce」信号が「1」の場合にのみマルチプレクサ操作を実行します。すべてが期待どおりに機能しました。次に、感度リストから「ce」シグナルを削除して実験を試みました。プロセスステートメントに関する私の理解に基づいて、機密リストのシグナルが変更された場合にのみ実行する必要があります。「ce」信号を削除することにより、回路は「ce」の変更のみに応答しなくなります。変更された回路は次のとおりです。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity mux81 is
    port( d_in : in std_logic_vector(7 downto 0);
            sel : in std_logic_vector(2 downto 0);
            ce : in std_logic;
            F : out std_logic);
end mux81;

architecture my_mux81 of mux81 is
begin
mux_proc: process(d_in, sel)
    begin
        if (ce = '1') then
            if (sel = "111") then
                F <= d_in(7);
            elsif (sel = "110") then
                F <= d_in(6);
            elsif (sel = "101") then
                F <= d_in(5);
            elsif (sel = "100") then
                F <= d_in(4);
            elsif (sel = "011") then
                F <= d_in(3);
            elsif (sel = "010") then
                F <= d_in(2);
            elsif (sel = "001") then
                F <= d_in(1);
            elsif (sel = "000") then
                F <= d_in(0);
            else
                F <= '0';   
            end if;
        else
            F <= '0';
        end if;
    end process mux_proc;
end my_mux81;

ご覧のとおり、唯一の変更点は、機密リストから「ce」が削除されたことです。ただし、この回路を実装すると、センシティビティ リストに「ce」が含まれていたバージョンとまったく同じように動作します。つまり、シグナル「d_in」と「sel」を一定に保ちながら、「ce」を変更すると、プロセス ステートメントが実行され、「ce」がまだセンシティビティ リストにあるかのように出力シグナルが変更されます。合成を実行しても、警告は表示されませんでした。プログラムが「ce」も監視する必要があると仮定したようですが、警告も生成する必要があると思いました...

助けてくれてありがとう!

4

1 に答える 1

1

センシティビティ リストは、多くの合成ツールで無視されます。合成ツールからの警告を確認すると、おそらく CE 信号の欠落に関する警告が表示されます。

不完全なセンシティビティ リストは、シミュレーションと合成後の動作が同じではないため、問題の悪名高い原因です。

通常、レベル センシティブ ラッチは使用しません。それらはあらゆる種類の問題を引き起こし、単純な古い同期ロジックよりも検証が困難です。

レベル センシティブ ラッチを本当に作成したい場合は、FPGA ベンダーが提供するものをインスタンス化するか、合成ツールでラッチを推測させるために使用するコーディング スタイルを決定する必要があります。

于 2014-08-09T19:53:11.483 に答える