2017-10-10 4 views
-1

vhdlで制約のないベクトルを返す最良の方法は何ですか?vhdlで制約のない配列を返す

function func(selector : natural) return std_logic_vector is 
begin 
    case selector is 
     when 3 => return std_logic_vector("11"); 
     when 4 => return std_logic_vector("101"); 
     when others => return std_logic_vector("0"); 
    end case; 
end function; 

この場合、文字列リテラルは型変換オペランドにはなりません。したがって、動作しません。信号セレクタは一般的なものなので、合成可能である必要はありません。

+4

数値リテラル3と4の後に構文エラーがあります。タイプを明示的に指定する修飾表現を使用することを意味しますか?修飾された式: 'std_logic_vector '(" 11 ")'、 'std_logic_vector'(" 101 ");'および 'std_logic_vector '(" 0 ")'表示されていないエラーメッセージは、文字列をstd_logic_vectorに変換すると入力できないことを示します。要素の型は同じではありません(文字とstd_ulogic)。それらの ':は "=>"でなければなりません。 – user1155120

+0

:<=はここでは間違いでしたが、不要なコードを使わずにstackexchangeに新しい部分をタイプしました。元のコードには "<="もあります。しかし、それはあなたが括弧の前で言及した 'と一緒に働く。たくさんありがとう。この場合、この関数がどのように呼び出されたかについてのヒントを教えてください。 これを回答にコピーしてください、私は受け入れられたとマークします! –

+0

質問を編集してください... – JHBonarius

答えて

1

これはできません。あなたの関数からの戻り値は、呼び出し時に何かに関連付ける必要があり、何かが固定幅でなければならない。言い換えれば、あなたのようなことを言わなければならないでしょう:

s <= func(n); 

s固定幅を持っていますので、あなたの関数からのすべての戻り値は、同じ幅を持っている必要があります。

+0

私の関数の戻り値は、束縛されていない配列型を持つジェネリックマップで使用されます。ジェネリックマップ(func(n))と同様です。ジェネリックの幅は下位レベルで評価されます。 –

+1

@FranzForstmayrこの場合、あなたが何を求めているのか分かりません。これは '3 => return" 11 ";'と言うことができます。 –

+0

これが可能であることはわかっていませんでした。私は、私はちょうど複雑すぎると思ったことを見た! –

関連する問題