2011-01-18 7 views
0

"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;  

答えて

0

なぜあなただ​​けの変数の代わりに信号としてsubprocパラメータを定義していませんか?

2

まず第一に、あなたの句は、Cスタイルで書かれている「場合」。あなたは言うつもりです:

if (c(i) = '0') and (d(i) = '1') then 

しかし、実際問題は、あなたが議論としてSIGNALsを取ることとしてプロシージャを記述しているということです。あなたは結果を変数に代入したい場合は、別の手順の署名を宣言する必要があります:

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); 
variable e : out std_logic_vector(31 downto 0); 
variable f : out std_logic_vector(31 downto 0)) 

しかし、彼らは変数の代入されるように、その後、あなたはまた、efにすべての割り当てを変更する必要があります。

e := x(31 downto 0);