2016-04-15 14 views
2

INTENTION変換:VHDL std_logic_vectorsのアレイはSTD_LOGIC_VECTORに

IはZedBoardにRAMからデータを読んでいるが、私は、次のバッファ

type mem_word is array (0 to 127) of std_logic_vector(31 downto 0); 
signal buffer_word : mem_word; 

を使用するように、RAMは、32ビットのロングワードからなるものの次に、中間のリニアバッファで線形にデータを扱いたいと思います。

signal buffer_linear : std_logic_vector(4095 downto 0); 
buffer_linear <= buffer_word; -- !!! PROBLEM 

(buffer_wordの)特定の単語の位置を再計算することなく、

QUESTION:

私は1長いSTD_LOGIC_VECTORにstd_logic_vectorsの配列から取得するにはどうすればよいですか?ループ内で128語を連結しないようにする方法はありますか? (上記のようなもの)buffer_linear < = buffer_word;

答えて

4

ベクトルベクトルから1次元ベクトルに変換する関数が必要です。

私の次の例では、タイプ名T_SLVV_32を使用して、内部ベクトルが32ビット長のベクトルのベクトルであることを示しています。 (T_SLMと呼ばれる実際の2次元STD_LOGIC行列タイプについては、リンクされたソースファイルを参照してください)。だからT_SLVV_32mem_wordと同じです。

subtype T_SLV_32 is STD_LOGIC_VECTOR(31 downto 0); 
type T_SLVV_32 is array(NATURAL range <>) of T_SLV_32; 

function to_slv(slvv : T_SLVV_32) return STD_LOGIC_VECTOR is 
    variable slv : STD_LOGIC_VECTOR((slvv'length * 32) - 1 downto 0); 
begin 
    for i in slvv'range loop 
    slv((i * 32) + 31 downto (i * 32))  := slvv(i); 
    end loop; 
    return slv; 
end function; 

使用法:

buffer_linear <= to_slv(buffer_word); 

この関数には、ロジック、単に配線を作成しません。
注:メモリのすべてのビットに一度にアクセスすると、RAMまたはROMメモリブロックを推論する合成ツールが防止されます。

出典:PoC.vectors

などと逆方向のベクトルや行列を変換の詳細例については、GitHubの時の私のベクトルのパッケージを参照してください。

+0

RAMブロックを使用できる条件は何ですか?一度にアクセスされるビットには制限がありますか? –

+2

@MartinGあなたの最善の策は、合成ツールのメモリ推論パターンを調べることです。たとえば、http://www.xilinx.com/support/documentation/sw_manuals/xilinx2014_1/ug901-vivado-synthesis.pdfページ95以降 –

+0

条件には、読み込みと書き込みのプロセスが両方とも同期していることが含まれている可能性があります。 BlockRamは同期RAMであり、いくつかの上限(32または64)ビットが同時に読み取られるため、クロック同期プロセスが必要です。 –