1

そのため、VHDL の宿題に取り組んでいましたが、テストベンチで問題が発生しています。基本的に、私のテストベンチは、多数のフリップフロップのさまざまな可能性を実行しています。ただし、フリップフロップの 1 つの結果として「U」が発生し続けます。その理由は正確にわかっていますが、修正方法がわかりません。

基本的に、私の T フリップフロップでは、XOR 演算を実行するときに Q が設定されていないため、XOR 演算の後にプログラムが Q に値を代入することはありません。基本的に、Q が定義されていない場合、Q をたとえば 0 に設定する方法が必要です。

参考までに、Tフリップフロップの私のコードは次のとおりです

library ieee;
use ieee.std_logic_1164.all;

entity T_FF is
  port (
        T, clk : in std_logic;
        Q : inout std_logic);
end T_FF;

architecture behv of T_FF is
begin
  process (clk) is
    variable hold1, hold2 : std_logic;
    begin
      if (clk'event) then
        hold1 := Q and (not T);
        hold2 := T and (not Q);
        Q <= hold1 or hold2;
      end if;
  end process;
end behv;

そしてテストベンチ:

library ieee;
use ieee.std_logic_1164.all;

entity tb is
end tb;

architecture behv of tb is
  -- Component declaration
  component T_FF is 
    port (
        T, clk : in std_logic;
        Q : inout std_logic);
  end component;

  signal sT : std_logic :='0';
  signal sclk : std_logic :='0';

  signal sQT : std_logic :='0';

  for TFF : T_FF use entity work.T_FF(behv);

  begin
    TFF: T_FF port map (T=>sT, clk=>sclk, Q=>sQT);

    sclk <= not sclk after 50 ns;
    sT <= not sT after 100 ns;

end;
4

2 に答える 2

2

Chris Laplante さんには申し訳ありませんが、あなたの質問は VHSIC ハードウェア記述言語 (VHDL) に関する非常に有効な質問のようです。(Very High Scale Integrate Circuit の頭字語である VHSIC)。よく意図された Wiki の説明にもかかわらず、VHDL は汎用プログラミング言語ではありません。実行は、シミュレーション時間または実装に依存する方法で、連続するデルタ サイクルの数によって制限されます。ハリー・ハリソンの言い回しを借りると、VHDL はハードウェアです。つまり、electronics.stackexchange.com vhdl タグがトラフィックを使用できるということです。

テスト ベンチは、インスタンス化された T_FF の正式な T の実際の値である sT のデフォルト値を既に提供しています。ラベル付けされていないプロセスから、変数 hold1 と hold 2 が T と Q の積であることがわかります。そのため、パッケージ本体 std_logic_1164 で AND テーブルまたは NOT テーブル ルックアップの Q の既知の値が問題であり、'U' 以外の値が生成されます。

-- truth table for "not" function
CONSTANT not_table: stdlogic_1d :=
--  -------------------------------------------------
--  |   U    X    0    1    Z    W    L    H    -   |
--  -------------------------------------------------
     ( 'U', 'X', '1', '0', 'X', 'X', '1', '0', 'X' );

-- truth table for "and" function
CONSTANT and_table : stdlogic_table := (
--      ----------------------------------------------------
--      |  U    X    0    1    Z    W    L    H    -         |   |
--      ----------------------------------------------------
        ( 'U', 'U', '0', 'U', 'U', 'U', '0', 'U', 'U' ),  -- | U |
        ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | X |
        ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ),  -- | 0 |
        ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | 1 |
        ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | Z |
        ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' ),  -- | W |
        ( '0', '0', '0', '0', '0', '0', '0', '0', '0' ),  -- | L |
        ( 'U', 'X', '0', '1', 'X', 'X', '0', '1', 'X' ),  -- | H |
        ( 'U', 'X', '0', 'X', 'X', 'X', '0', 'X', 'X' )   -- | - |
);

2 つの表から、「U」または「X」以外のものを配信するには、入力が「0」、「1」、「H」、または「L」のいずれかでなければならないことがわかります。(横軸は 1 つの入力を表し、縦軸は 2 つの入力 AND 関数のもう 1 つの入力を表します。結果の値は、1 つまたは両方の軸と交差する値の配列にあります)。

したがって、Q はこれら 4 つの値のいずれかに初期化する必要があります。これには 2 つの方法があります。FPGA で初期化を反映してセットまたはリセット条件に自然なバイアスを与えるか、Q にアクティブ リセットを適用します (関連する質問VHDL - 非同期アップ/ダウン カウンターへの回答を参照してください)。 )。

Q ポート モードを inout にしてフィードバックに直接使用することを選択したため、リセットを提供することが最善の選択です。また、T_FF には設計エラーがあり、両方のクロック エッジで動作しますが、これは clk'event を clk = '1' で修飾して一方のエッジ (立ち上がりエッジ) でのみ動作させることで解決できます。

  process (clk, RESET) is
    variable hold1, hold2 : std_logic;
    begin
        if RESET = '1' then
            Q <= '0';
        else 
            if (clk'event AND clk = '1') then
                hold1 := Q and (not T);
                hold2 := T and (not Q);
                Q <= hold1 or hold2;
            end if;
        end if;
  end process;

(両方のエッジを使用する「失敗モード」は、正しい周波数であるが、クロックの低いボーに対してのみ有効な出力を生成することです。試してみてください)。

したがって、T_FF のポートに非同期 RESET を追加し、tb でコンポーネント宣言とインスタンス化ステートメントを追加し、tb に sRESET を追加して true に初期化すると、一定時間後に false になると、T_FF シミュレーションは次のようになります。

RESET と認定されたクロック イベントを追加した t_ff シミュレーション

合成に準拠した VHDL に関する IEEE 規格、IEEE Std 1076.6-2004 というタイトルの IEEE Standard for VHDL Register Transfer Level (RTL) Synthesis があり、ここで使用される構造について説明しています。RESET が T_FF のラベルなしプロセ​​ス ステートメントのセンシティビティ リストに追加されていることに注意してください。

于 2013-11-04T03:13:40.657 に答える
0

ここには実際には 2 つの問題があります。(1) 構築しようとしているものについて。(2) コード自体。

1)あなたが構築しようとしているものについて:

T 型フリップフロップを作成しようとしています。これは通常、出力の反転バージョンを入力に接続するだけで、D タイプのフリップフロップで構築されます。あなたの場合、T = 0のときにTFFを停止できるように、「トグルイネーブル」信号(コードではTと呼ばれます)も必要です。これは、TFF 入力が XOR ゲートを通過しなければならないことを意味します。

このような XOR ゲートは、(AND-OR 層) または直接 XOR ゲートを使用して構築できます。FPGA の DFF は既にイネーブル ポート (DFF 内部の XOR 機能) を使用して構築されているため、XOR オプションを使用してロジックを節約し、動作を高速化することをお勧めします。しかし、明らかに、他のオプションも機能します。

2) コードについて:

  • Q は inout ではなくバッファです
  • "and clk='1'" を含める (-> raise_edge(clk))
  • 変数 hold1、hold2 を削除
  • Q <= (T and notQ) または (not T and Q) の代わりに Q <= T xor Q を使用します。

library ieee;
use ieee.std_logic_1164.all;
--------------------------------------------
entity T_FF is
  port (
    T, clk: in std_logic;
    Q : buffer std_logic); 
end T_FF;
--------------------------------------------
architecture behv of T_FF is
begin
  process (clk) is
  begin
    if rising_edge(clk) then
      Q <= (T and not Q) or (not T and Q);
      --Q <= T xor Q; --preferred option
    end if;
  end process;
end behv;
--------------------------------------------
于 2013-11-06T19:09:36.150 に答える