8

関数は、エンティティよりも明らかに記述が冗長ではありません。しかし、それは次のような多くの欠点を意味します。

  • 同等の一般的なキーワードはありません
  • 可能な出力は1つだけです

関数は再帰的に呼び出すことができるようです。エンティティの場合はそうではないでしょうか?もしそうなら、美的目的以外の機能を使用する正当な理由はありますか?

4

3 に答える 3

7

関数はハードウェアを直接作成することはできません。そのためには、アーキテクチャ内に存在する必要があります。functionすべての機能を(またはprocedure)に入れて、それをただ呼び出すのを止めるものは何もありませんprocess

あなたの他のポイントのいくつかについて:

  • プロシージャを使用すると、複数のパラメータを使用できます。inoutout

  • エンティティ再発する可能性があります...考慮してください:

    entity recurse is
        generic (
            depth : integer := 1;
            param : integer := 3);
        port (
            a : in  integer;
            b : out integer);
    end entity recurse;
    
    architecture a1 of recurse is   
        signal c : integer;
    begin
        c <= a + 1;
        bottom: if depth = param generate
            b <= a + 1;
        end generate bottom;
    
        mid:if depth /= param generate
            recurse_1: entity work.recurse
                generic map (
                    param => param,
                    depth => depth+1)
                port map (
                    a     => c,
                    b     => b);
        end generate mid;
    end architecture a1;
    

あまり便利ではありませんが、うまく合成してシミュレートします。

  • そして最後に、もちろん、あなたは美的目的のためにのみ関数を使用します(ほとんどのプログラミングタイプが私の経験で行う美的定義に保守性と可読性を含めると仮定します)。列挙型、エンティティ、レコード、およびその他の言語機能全体を「美的目的」でのみ使用します。アセンブリニーモニックでさえ美的です!たぶん、DIPスイッチの切り替えに戻る必要があります:)
于 2013-01-21T18:49:45.303 に答える
5

なぜあなたが混乱しているのかがわかります。もう1つの良い質問は、なぜプロシージャ関数の両方があるのか​​ということです。(VHDLは時々非常にエレガントではないようです!)

そうは言っても、私は常に手順と機能の両方を使用していますが、ほとんどはテストベンチで使用しています。たとえば、しばらく前に作成したファイアウォールシステムのテストベンチの場合pd_tb_send_udp_packet()、メインプロセスで繰り返し使用するというプロシージャを作成しました。

pd_tb_send_udp_packet("10.10.10.2", 1234, false);
pd_tb_send_udp_packet("10.10.10.1", 1234, true);
pd_tb_send_udp_packet("10.10.10.1", 1235, false);
pd_tb_send_udp_packet("ff02:100::1", 1234, false);
pd_tb_send_udp_packet("ff02:101::1", 1234, true);

この手順では、指定されたaddr / portを使用してランダムなUDPパケットを生成し、ファイアウォールシステムに送信してから、最後のブールパラメータに基づいて転送されるかどうかをテストします。これがその最初の行で、ライブラリの関数を使用しています。

if f_atvtb_is_ipv6_addr(dest_ip_addr) then
  v_ipv6 := true;
  v_ipv6_addr := f_atvtb_ipv6_addr(dest_ip_addr);
else
  v_ipv6 := false;
  v_ipv4_addr := f_atvtb_ip_addr(dest_ip_addr);
end if;

後者の2つは、文字列入力からそれぞれ128ビットと32ビットのstd_logic_vectorsを返します。

どういうわけかプロシージャや関数を使用せずにこれらすべてを実行できる可能性がありますが、それは間違いなくもっと面倒です。

于 2013-01-22T10:16:33.853 に答える
5

vhdlの関数を使用すると、コードの保守と読み取りが簡単になります。一般に、アーキテクチャは非常に大きく、デバッグ中に問題のある関数を簡単に見つけて修正でき、アーキテクチャ本体全体を分析する必要はありません。

小さなコードの場合は役に立ちませんが、より大きなマシンでは、機能を賢く考えると理解が深まります。

これには規則がないので、すべてのコメントを歓迎します。

要するに:関数の利点は

  • オーバーロード
  • 演算子の定義
  • したがって、演算子のオーバーロード
  • コードのより良い構造
于 2013-01-21T17:28:47.967 に答える