"main"プロシージャ は、 "subproc"を使用して結果を変数 t0とt1に蓄積し、最後に返される2つのネストされたプロシージャを持っています。これはすべて を1クロックサイクルで計算する必要があり、回路は多かれ少なかれ単純な論理ゲート(xor、or、および)で構成されています( )。VHDLでのサブプロシージャコール
Acutal (variable t0) for formal "a" is not a signal
subprocureを入力、 などの信号を必要としますが、私はメインの手続きの際にそれに変数を渡したいと理にかなって:私は以下のように回路を記述するために をしようとすると、私は次のエラーを取得します。 のキャストでこの問題を回避する簡単な方法はありますか?
おかげ
procedure subproc
(
signal a : in std_logic_vector(31 downto 0);
signal b : in std_logic_vector(31 downto 0);
signal c : in std_logic_vector(31 downto 0);
signal d : in std_logic_vector(31 downto 0);
signal e : out std_logic_vector(31 downto 0);
signal f : out std_logic_vector(31 downto 0)
)
is
variable x : std_logic_vector(31 downto 0);
variable y : std_logic_vector(31 downto 0);
begin
x := (others => '0');
y := (others => '0');
for i in 0 to 31 loop
x(i) := (a(i) xor b(i)) and (c(i) xor d(i));
y(i) := (a(i) xor b(i)) or ((d(i) xor c(i)) xor b(i));
end loop;
e <= x(31 downto 0);
f <= y(31 downto 0);
end;
procedure main
(
signal a : in std_logic_vector(31 downto 0);
signal b : in std_logic_vector(31 downto 0);
signal r : out std_logic_vector(31 downto 0)
)
is
variable res : std_logic_vector(31 downto 0);
variable t0, t1 : std_logic_vector(31 downto 0);
constant c : std_logic_vector(31 downto 0) := X"fedcba90";
constant d : std_logic_vector(31 downto 0) := X"7654321f";
begin
t0 := (others => '0');
t1 := (others => '0');
for i in 0 to 31 loop
if ((c(i) = '0') && (d(i) = '1')) then
subproc(t0, t1,
a, b, t0, t1);
end if;
end loop;
r <= t0;
end;