0

私は VHDL に不慣れで、私のコードはばかげているように見えるかもしれませんが、まだ苦労しています。Spartan 3 キットを使用して BCD カウンターを作成しようとしています。7 セグメントの多重化に問題があり、コンポーネントを使用する必要があることはわかっていますが、より簡単な方法を使用しました。合成で次のエラーが発生します。FPGA/CPLD ハードウェアの合成を有効にするために、XST では必要なすべての信号がセンシティビティ リストに存在すると想定されます。合成の結果は、当初の設計仕様とは異なる場合があることに注意してください。不足している信号は次のとおりです。ありがとうございました。

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity lab5 is
  port (clk      : in  std_logic;
        x        : in  std_logic;
        --count : inout  STD_LOGIC_VECTOR (3 downto 0);
        data_out : out std_logic_vector (6 downto 0);
        an       : out std_logic_vector (3 downto 0)
        );

end lab5;

architecture Behavioral of lab5 is
  signal counter    : std_logic_vector (3 downto 0) := (others => '0');
  signal prescaler  : std_logic_vector (25 downto 0);
  signal prescaler2 : std_logic_vector (11 downto 0);
  signal counter2   : std_logic_vector (1 downto 0) := (others => '0');
begin

  CounterProcess : process(CLK, x)
  begin
    --prescaler is used as a clock slower to increment the counter every 50M cycles(1 sec)
    if rising_edge(CLK) then
      if prescaler < "10111110101111000010000000" then
        prescaler <= prescaler+1;

      else
        prescaler <= (others => '0');
        if x = '0' then
          if counter = "1001" then
            counter <= "0000";
          else
            counter <= counter+1;
          end if;
        else
          if counter = "0000" then
            counter <= "1001";
          else
            counter <= counter-1;
          end if;
        end if;
      end if;
    end if;

  end process;

--count<=counter;

  Sevensegclock : process(CLK)
  begin
    if rising_edge(CLK) then
      --scale clock to count(which will be the segment selector) every 1024 cycle
      if prescaler2 < "010000000000" then
        prescaler2 <= prescaler2+1;

      else
        prescaler2 <= (others => '0');
        if counter2 = "11" then
          counter2 <= "00";
        else
          counter2 <= counter2+1;
        end if;
      end if;
    end if;

  end process;

  sevenseg : process(counter2, clk)
  begin
    --counter the segment selector used to activate selector and decode data
    if counter2 = "00" then
      an <= "1110";
      if counter(0) = '0' then
        data_out <= "0000001";
      else
        data_out <= "1001111";
      end if;

    end if;

    if counter2 = "01" then
      an <= "1101";
      if counter(1) = '0' then
        data_out <= "0000001";
      else
        data_out <= "1001111";
      end if;
    end if;

    if counter2 = "10" then
      an <= "1011";

      if counter(2) = '0' then
        data_out <= "0000001";
      else
        data_out <= "1001111";
      end if;
    end if;

    if counter2 = "11" then
      an <= "0111";
      if counter(3) = '0' then
        data_out <= "0000001";
      else
        data_out <= "1001111";
      end if;
    end if;

  end process;

end Behavioral;
4

1 に答える 1

1

開始する場所の 1 つは、各プロセスが順次要素 (フリップフロップ) を実装するか、組み合わせ要素 (ゲート) を実装するかを決定することです。

非同期リセットなしでシーケンシャル エレメント (フリップフロップ) を実装するプロセスのテンプレートは、次のようになります。

process (clk) is
begin
  if rising_edge(clk) then
    -- Code for assign to flip-flop outputs at rising edge
  end if;
end process;

組み合わせ要素 (ゲート) を実装するプロセスのテンプレートは、次のようになります。

process (all) is  -- "all" make sensitivity on all used signals
begin
  -- Code for assign to gate outputs
end process;

VHDL-2008 構文でのみ使用可能であることに注意してください(all)。それ以外の場合、以前の VHDL バージョンの構文では、すべての信号が機密リストに明示的にリストされます。

テンプレートの 1 つを一致させると、VHDL コードで記述されたデザインを実装する方法が合成ツールによって決定されます。ただし、コードがどちらのテンプレートとも一致しない場合、合成ツールは VHDL コードを FPGA にインプリメントする方法を判断するのに苦労する可能性があり、その結果、表示されるようなエラー メッセージが表示される場合があります。

テンプレートに基づいて、プロセスSevensegclockはシーケンシャル エレメント (フリップフロップ) を実装します。このプロセスに問題はありません。

ただし、プロセスは、順次要素または組み合わせ要素のいずれのテンプレートとも一致CounterProcesssevensegません。

プロセスについてはCounterProcess、シーケンシャル エレメント (フリップフロップ) を実装する必要があるように見えますが、センシティビティ リストにはx含まれています。解決策は、おそらくx機密リストから を削除することです。

processsevensegの場合、組み合わせ要素 (ゲート) を実装したいように見えますが、感度リストにはプロセスで使用されるすべてのシグナルが含まれているわけではなく、プロセスで使用されていないシグナルも含まれてclkいます。VHDL-2008 を使用している場合の解決策は、センシティビティ リストを に置き換えること (all)です。以前の VHDL バージョンを使用している場合は、センシティビティ リストがプロセスで使用されるすべてのシグナルをカバーするようにします(counter2, counter)

免責事項: 処理中のコードの論理的な正確性は確認していません。したがって、上記は、FPGA でさまざまな種類のデザイン エレメントを作成するためのプロセスの記述方法に関する一般的なガイドラインを提供するためのものです。

于 2013-11-29T22:10:49.790 に答える