関数は、エンティティよりも明らかに記述が冗長ではありません。しかし、それは次のような多くの欠点を意味します。
- 同等の一般的なキーワードはありません
- 可能な出力は1つだけです
関数は再帰的に呼び出すことができるようです。エンティティの場合はそうではないでしょうか?もしそうなら、美的目的以外の機能を使用する正当な理由はありますか?
関数は、エンティティよりも明らかに記述が冗長ではありません。しかし、それは次のような多くの欠点を意味します。
関数は再帰的に呼び出すことができるようです。エンティティの場合はそうではないでしょうか?もしそうなら、美的目的以外の機能を使用する正当な理由はありますか?
関数はハードウェアを直接作成することはできません。そのためには、アーキテクチャ内に存在する必要があります。function
すべての機能を(またはprocedure
)に入れて、それをただ呼び出すのを止めるものは何もありませんprocess
。
あなたの他のポイントのいくつかについて:
プロシージャを使用すると、複数のパラメータを使用できます。inout
out
エンティティは再発する可能性があります...考慮してください:
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;
あまり便利ではありませんが、うまく合成してシミュレートします。
なぜあなたが混乱しているのかがわかります。もう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を返します。
どういうわけかプロシージャや関数を使用せずにこれらすべてを実行できる可能性がありますが、それは間違いなくもっと面倒です。
vhdlの関数を使用すると、コードの保守と読み取りが簡単になります。一般に、アーキテクチャは非常に大きく、デバッグ中に問題のある関数を簡単に見つけて修正でき、アーキテクチャ本体全体を分析する必要はありません。
小さなコードの場合は役に立ちませんが、より大きなマシンでは、機能を賢く考えると理解が深まります。
これには規則がないので、すべてのコメントを歓迎します。
要するに:関数の利点は