2017-08-13 4 views
1

長さを減らしてstd_logic_vectorsの配列を作成しようとしています。私は、ジェネリックstd_logic_vectorで配列を作成し、ベクトルを生成するためにgenerateステートメントを使用しようとしました。ジェネリックSTD_LOGIC_VECTORを返す関数と一緒にVHDL長さを短縮してSTD_LOGIC_VECTORSの配列を生成する

architecture behavioral of dadda_mul_32bit is 

type and_planes is array (0 to 31) of std_logic_vector;  

begin 

generate_and_plane: 
    for i in 0 to 31 generate 
     and_planes(i) <= and_vector(a, b(i), i); 
    end generate generate_and_plane; 

end behavioral; 

function and_vector(vec: std_logic_vector; x: std_logic; length: natural) return std_logic_vector is 
    variable result: std_logic_vector(length - 1 downto 0); 
begin 
    for i in 0 to length - 1 loop 
     result(i) := vec(i) and x; 
    end loop; 

    return result; 
end function; 

私が間違って生成するステートメントを使用していますか?

+0

なぜあなたのAND結果にはaの長さがありませんか? – user1155120

答えて

3

and_planesは信号ではないタイプなので、割り当てることはできません! 部分的に制約された型を作成していますが、これはオブジェクト(シグナルなど)の宣言で制約を受ける必要があります。

VHDLでは、不揃いの配列はサポートされていません。 (各要素が異なるサイズであるアレイ)。これをシミュレーションに必要とする場合は、アクセスタイプを使用し、Cのような不揃いの配列をエミュレートすることができます。合成に必要な場合は、1次元配列とネストされた境界を計算する関数ベクター。ところで


は私のこの回答を参照してください。 VHDL-2008はオーバーロードを追加する:"and"(std_logic, std_logic_vector)なので、ベクトルの各ビットで1ビットの演算を計算するための関数は必要ありません。

-- slice 'a' and gate it by 'b(i)' 
and_planes(i) <= a(i downto 0) and b(i); 
関連する問題