1

そのセグメントを何度も書く代わりに、コードセグメントを書いてそれを呼び出すことは可能ですか?つまり。以下に示すように、コードのセグメントを再利用したいと思います。

process (currentState)
begin
    case currentState is
    when requiredCoinsTensAnode => anodes <= "100000";--turn on the tens display
        case tensCount is
        when "0000" => segDisplay <= "1111110"; --0
        when "0001" => segDisplay <= "0110000"; --1
        when "0010" => segDisplay <= "1101101"; --2
        when "0011" => segDisplay <= "1111001"; --3
        when "0100" => segDisplay <= "0110011"; --4
        when "0101" => segDisplay <= "1011011"; --5
        when "0110" => segDisplay <= "1011111"; --6
        when "0111" => segDisplay <= "1110000"; --7
        when "1000" => segDisplay <= "1111111"; --8
        when others => segDisplay <= "1111011"; --9
        end case;
        nextState <= requiredCoinsUnitsAnode;--just displayed the tens digit, next we need to display the units digit
    when requiredCoinsUnitsAnode => anodes <= "010000";--turn on the units display
        case unitsCount is
        when "0000" => segDisplay <= "1111110"; --0
        when "0001" => segDisplay <= "0110000"; --1
        when "0010" => segDisplay <= "1101101"; --2
        when "0011" => segDisplay <= "1111001"; --3
        when "0100" => segDisplay <= "0110011"; --4
        when "0101" => segDisplay <= "1011011"; --5
        when "0110" => segDisplay <= "1011111"; --6
        when "0111" => segDisplay <= "1110000"; --7
        when "1000" => segDisplay <= "1111111"; --8
        when others => segDisplay <= "1111011"; --9
        end case;
        nextState <= insertedCoinsTensAnode;
    end case;
end process;
4

3 に答える 3

3

はい、VHDLで関数を使用できます。

http://www.csee.umbc.edu/portal/help/VHDL/design.html#funcdhttp://www.pldworld.com/_hdl/1/www.ireste.fr/fdl/vcl/lesd/を確認して
くださいles_3.htm

于 2012-05-20T09:03:47.747 に答える
3

raviが指摘しているように、関数は1つのオプションです。

function f_segDisplay (
  signal segCount : std_logic_vector(6 downto 0))
  return std_logic_vector(3 downto 0) is
begin  -- f_segDisplay
    case segCount is
      when "0000" => return "1111110";  --0
      when "0001" => return "0110000";  --1
      when "0010" => return "1101101";  --2
      when "0011" => return "1111001";  --3
      when "0100" => return "0110011";  --4
      when "0101" => return "1011011";  --5
      when "0110" => return "1011111";  --6
      when "0111" => return "1110000";  --7
      when "1000" => return "1111111";  --8
      when others => return "1111011";  --9
    end case;
end f_segDisplay;

process (currentState, tensCount, unitsCount)
begin
  case currentState is
    when requiredCoinsTensAnode =>
      anodes     <= "100000";          --turn on the tens display
      segDisplay <= f_segDisplay(tensCount);
      nextState  <= requiredCoinsUnitsAnode;
    when requiredCoinsUnitsAnode =>
      anodes     <= "010000";          --turn on the units display
      segDisplay <= f_segDisplay(unitsCount);
      nextState  <= insertedCoinsTensAnode;
  end case;
end process;

コンパイラとオプションによっては、関数コードをインラインに配置することを決定する場合があります。これにより、元のコードと同じように、ロジックの複数のインスタンスが配置されます。

別の方法は、共通のコードを別のプロセスに取り出すことです。

p_segdisplay : process (segCount)
begin  -- process p_segdisplay
  case segCount is
    when "0000" => segDisplay <= "1111110";  --0
    when "0001" => segDisplay <= "0110000";  --1
    when "0010" => segDisplay <= "1101101";  --2
    when "0011" => segDisplay <= "1111001";  --3
    when "0100" => segDisplay <= "0110011";  --4
    when "0101" => segDisplay <= "1011011";  --5
    when "0110" => segDisplay <= "1011111";  --6
    when "0111" => segDisplay <= "1110000";  --7
    when "1000" => segDisplay <= "1111111";  --8
    when others => segDisplay <= "1111011";  --9
  end case;
end process p_segdisplay;

process (currentState, tensCount, unitsCount)
begin
  case currentState is
    when requiredCoinsTensAnode =>
      anodes    <= "100000";          --turn on the tens display
      segCount  <= tensCount;
      nextState <= requiredCoinsUnitsAnode;
    when requiredCoinsUnitsAnode =>
      anodes    <= "010000";          --turn on the units display
      segCount  <= unitsCount;
      nextState <= insertedCoinsTensAnode;
  end case;
end process;

ところで:感度リストにはtensCountとunitsCountが必要です。

このような共通のリソースを抽象化することは、エリアまたは電力を意識した設計を行うときに役立つ手法です。

どちらも同じように機能するはずであり、完璧なツールは2つから同じロジックを生成しますが、完璧なツールがあることはめったにありません。さまざまなスタイルを試してください。一部のツールでより良い結果が得られるものもあれば、他のツールでより良い結果が得られるものもあります。

于 2012-05-20T10:57:14.560 に答える
1

そのコードはおそらくfunctionまたはで最適procedureです。

コードをVHDLでカプセル化するentityもう1つの方法です。

于 2012-05-21T12:06:38.157 に答える