Main Content

hdl.RAM

メモリの読み取り/書き込みアクセスのための Single Port RAM、Simple Dual Port RAM、または Dual Port RAM

説明

hdl.RAM は、Single Port RAM、Simple Dual Port RAM、または Dual Port RAM について、メモリ位置からの読み取りと書き込みを行います。出力データは 1 ステップ遅延します。入力データがスカラーの場合、アドレス入力と書き込みイネーブル入力はスカラーでなければならず、HDL Coder™ は単一の RAM ブロックを推定します。データがベクトルの場合、HDL Coder は並列 RAM バンクの配列を推定します。ベクトルのデータ入力では、アドレス入力と書き込みイネーブル入力はスカラーにもベクトルにもすることができます。書き込みイネーブル端子とアドレス端子にスカラー入力を指定すると、System object は同じ操作をそれぞれの RAM バンクに適用します。

hdl.RAM System object™ は、231 バイトの内部ストレージをもつことができます。RAM のサイズはアドレス幅、各ワードを格納するのに使用されるバイト数、RAM バンクの数を考慮します。

RAM のメモリ位置からの読み取り、または書き込みを行うには、次のようにします。

  1. hdl.RAM オブジェクトを作成して、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

ram = hdl.RAM は、メモリ位置への書き込み、または読み取りができる Single Port RAM System object を返します。

ram = hdl.RAM(Name,Value) は、1 つ以上の名前と値のペアを使用してプロパティが設定された Single Port RAM、Simple Dual Port RAM、または Dual Port RAM System object を返します。それぞれのプロパティ名は一重引用符で囲みます。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトを呼び出した後にプロパティ値を変更することはできません。オブジェクトは呼び出し時にロックされ、関数 release でロック解除されます。

プロパティが "調整可能" な場合は、いつでも値を変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

RAM のタイプ。次のいずれかとして指定します。

  • 'Single port' — Single Port RAM を作成します。入力は書き込みデータ、アドレス、および書き込みイネーブル、出力は読み取りデータです。

  • 'Simple dual port' — Simple Dual Port RAM を作成します。入力は書き込みデータ、書き込みアドレス、書き込みイネーブル、および読み取りアドレス、出力は読み取りアドレスからのデータです。

  • 'Dual port' — Dual Port RAM を作成します。入力は書き込みデータ、書き込みアドレス、書き込みイネーブル、および読み取りアドレス、出力は読み取りアドレスと書き込みアドレスからのデータです。

出力の書き込み動作。次のいずれかとして指定します。

  • 'New data' — アドレスの新しいデータを出力に送ります。

  • 'Old data' — アドレスの古いデータを出力に送ります。

依存関係

[RamType]'Single port' または 'Dual port' に設定する場合は、このプロパティを指定します。このプロパティは Simple Dual Port RAM オブジェクトには適用されません。

System object の最初のシミュレーション出力。次のいずれかとして指定します。

  • スカラー値。

  • 初期値と RAM ワードが 1 対 1 でマッピングされたベクトル。

使用法

説明

wrEn が false の場合、dataOut = ram(wrData,rwAddress,wrEn) はメモリ位置 rwAddress にある値を読み取ります。wrEn が true の場合、値 wrData をメモリ位置 rwAddress に書き込みます。dataOutrwAddress にある新しいデータまたは古いデータです。Single Port RAM System object を作成する場合は、この構文を使用します。

wrEn が true の場合、rdDataOut = ram(wrData,wrAddress,wrEn,rdAddress) は値 wrData をメモリ位置 wrAddress に書き込みます。rdDataOut はアドレス位置 rdAddress にある古いデータです。Simple Dual Port RAM System object を作成する場合は、この構文を使用します。

wrEn が true の場合、[wrDataOut,rdDataOut] = ram(wrData,wrAddress,wrEn,rdAddress) は値 wrData をメモリ位置 wrAddress に書き込みます。wrDataOut はメモリ位置 wrAddress にある新しいデータまたは古いデータです。rdDataOut はアドレス位置 rdAddress にある古いデータです。Dual Port RAM System object を作成する場合は、この構文を使用します。

入力引数

すべて展開する

wrEn が true の場合に RAM のメモリ位置に書き込むデータ。この値は doublesinglehalfinteger、または fixed-point (fi) オブジェクトのいずれかで、実数または複素数にできます。hdl.RAM ブロックは、アドレスの計算に内部的に固定小数点データ型を使用します。これは、結果として Fixed-Point Designer™ 製品ライセンスのチェックアウトになります。

データ型: single | double | half | int8 | int16 | uint8 | uint16 | fi

wrEn が true の場合に wrData を書き込むアドレス。wrEn が false の場合、System object はメモリ位置 rwAddress にある値を読み取ります。この値は fixed-point (fi) または integer のいずれかで、符号なしの 231 ビット長でなければなりません。Single Port RAM オブジェクトを作成する場合は、このアドレスを指定します。

メモ

入力データが組み込みの integer データ型である場合でも、RAM バンクが使用される場合、hdl.RAM ブロックはアドレスの計算に内部的に固定小数点データ型を使用します。これは、結果として Fixed-Point Designer 製品ライセンスのチェックアウトになります。

データ型: uint8 | uint16 | fi

wrEn が true の場合、wrData を RAM のメモリ位置に書き込みます。Single Port RAM を作成する場合、wrEn が false のとき、System object はメモリ位置にある値を読み取ります。この値は logical でなければなりません。

データ型: logical

Simple Dual Port RAM または Dual Port RAM System object を作成するときにデータを読み取るアドレス。この値は fixed-point (fi) または integer のいずれかで、符号なしの 231 ビット長でなければなりません。

メモ

入力データが組み込みの integer データ型である場合でも、RAM バンクが使用される場合、hdl.RAM ブロックはアドレスの計算に内部的に固定小数点データ型を使用します。これは、結果として Fixed-Point Designer 製品ライセンスのチェックアウトになります。

データ型: uint8 | uint16 | fi

Simple Dual Port RAM または Dual Port RAM System object を作成するときにデータを書き込むアドレス。この値は fixed-point (fi) または integer のいずれかで、符号なしの 231 ビット長でなければなりません。

メモ

入力データが組み込みの integer データ型である場合でも、RAM バンクが使用される場合、hdl.RAM ブロックはアドレスの計算に内部的に固定小数点データ型を使用します。これは、結果として Fixed-Point Designer 製品ライセンスのチェックアウトになります。

データ型: uint8 | uint16 | fi

出力引数

すべて展開する

wrEn が false のときに System object が Single Port RAM オブジェクトのメモリ位置 rwAddress から読み取る出力データ。

Simple Dual Port RAM または Dual Port RAM System object のメモリ位置 rdAddress から System object が読み取る古い出力データ。

Simple Dual Port RAM または Dual Port RAM System object のメモリ位置 wrAddress から System object が読み取る新しい出力データまたは古い出力データ。

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、以下の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて折りたたむ

RAM のメモリ位置からの読み取り、または書き込みを行う System object を作成します。WriteOutputValueOld data に設定して、書き込みアドレスに格納されている以前の値を返します。

出力データ端子は渡された読み取り/書き込みアドレスに対応しています。書き込み操作中に、書き込みアドレスにある古いデータは出力として送信されます。

メモ: このオブジェクト構文は R2016b 以降でのみ実行されます。それよりも以前のリリースを使用している場合は、オブジェクトのそれぞれの呼び出しを等価の step 構文で置き換えます。たとえば、myObject(x)step(myObject,x) で置き換えます。

ram_1p = hdl.RAM('RAMType','Single port',...
                           'WriteOutputValue','Old data')
ram_1p = 
  hdl.RAM with properties:

             RAMType: 'Single port'
    WriteOutputValue: 'Old data'
     RAMInitialValue: 0

dataLength    = 10;
dataIn = 1:10;
dataOut = zeros(1,dataLength);

メモリにカウント パターンを書き込みます。最初の書き込みでの以前の値はすべてゼロです。

for ii = 1:dataLength
  addressIn   = uint8(ii-1);
  writeEnable = true;
  dataOut(ii) = ram_1p(dataIn(ii),addressIn,writeEnable);
end
dataOut
dataOut = 1×10

     0     0     0     0     0     0     0     0     0     0

データを読み戻します。

for ii = 1:dataLength
  addressIn   = uint8(ii-1);
  writeEnable = false;
  dataOut(ii) = ram_1p(dataIn(ii),addressIn,writeEnable);
end
dataOut
dataOut = 1×10

     0     1     2     3     4     5     6     7     8     9

ここで、カウントを逆順で書き込みます。以前の値は元のカウントです。

for ii = 1:dataLength
  addressIn   = uint8(ii-1);
  writeEnable = true;
  dataOut(ii) = ram_1p(dataIn(dataLength-ii+1),addressIn,writeEnable);
end
dataOut
dataOut = 1×10

    10     1     2     3     4     5     6     7     8     9

Single Port RAM に書き込み、新しく書き込まれた値を読み取る System object を作成します。

メモ: このオブジェクト構文は R2016b 以降でのみ実行されます。それよりも以前のリリースを使用している場合は、オブジェクトのそれぞれの呼び出しを等価の step 構文で置き換えます。たとえば、myObject(x)step(myObject,x) で置き換えます。

Single Port RAM System object を作成します。位置を書き込むと、オブジェクトは新しい値を返します。RAM のサイズはアドレスのビット幅とオブジェクトへの最初の呼び出しでの書き込みデータから推定されます。

ram_1p = hdl.RAM('RAMType','Single port','WriteOutputValue','New data');
dataLength       = 16;
[dataIn,dataOut] = deal(uint8(zeros(1,dataLength)));

生成されたデータを System object にランダムに書き込み、続いてデータを再度読み取ります。

for ii = 1:dataLength
  dataIn(ii)  = randi([0 63],1,1,'uint8');
  addressIn   = fi((ii-1),0,4,0);
  writeEnable = true;
  dataOut(ii) = ram_1p(dataIn(ii),addressIn,writeEnable);
end  
dataOut
dataOut = 1x16 uint8 row vector

    0   52   57    8   58   40    6   17   35   61   61   10   62   61   31   51

for ii = 1:dataLength
  addressIn   = fi((ii-1),0,4,0);
  writeEnable = false;
  dataOut(ii) = ram_1p(dataIn(ii),addressIn,writeEnable);
end
dataOut
dataOut = 1x16 uint8 row vector

    9   52   57    8   58   40    6   17   35   61   61   10   62   61   31   51

RAM のさまざまなメモリ位置からの読み取り、または書き込みを行う System object を作成します。

出力データ端子は読み取りアドレスに対応しています。書き込み操作と同じアドレスで読み取り操作が行われる場合、そのアドレスにある古いデータは出力として読み取られます。RAM のサイズはアドレスのビット幅とオブジェクトへの最初の呼び出しでの書き込みデータから推定されます。

メモ: このオブジェクト構文は R2016b 以降でのみ実行されます。それよりも以前のリリースを使用している場合は、オブジェクトのそれぞれの呼び出しを等価の step 構文で置き換えます。たとえば、myObject(x)step(myObject,x) で置き換えます。

ram_2p = hdl.RAM('RAMType','Simple dual port');
dataLength       = 16;
[dataIn,dataOut] = deal(uint8(zeros(1,dataLength)));

生成されたデータを System object にランダムに書き込み、古いデータを同じアドレスから読み取ります。

for ii = 1:dataLength
  dataIn(ii)  = randi([0 63],1,1,'uint8');
  wrAddr  = fi((ii-1),0,4,0);
  writeEnable = true;
  dataOut(ii) = ram_2p(dataIn(ii),wrAddr,writeEnable,wrAddr);
end  
dataOut
dataOut = 1x16 uint8 row vector

   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

さまざまなアドレスから書き込みと読み取りを行います。オブジェクトは読み取り結果を 1 サイクルの遅延の後に返します。

for ii = 1:dataLength
  wrAddr   = fi((ii-1),0,4,0);
  rdAddr   = fi(dataLength-ii+1,0,4,0);
  writeEnable = true;
  dataOut(ii) = ram_2p(dataIn(ii),wrAddr,writeEnable,rdAddr);
end
dataOut
dataOut = 1x16 uint8 row vector

    0    9    9   51   31   61   62   10   61   61   35   17    6   40   58    8

RAM のさまざまなメモリ位置からの読み取り、または書き込みを行う System object を作成します。

書き込み出力データ端子と読み取り出力データ端子の 2 つの出力端子があります。書き込み出力データ端子は書き込みアドレスの新しいデータを送ります。読み取り出力データ端子は読み取りアドレスの古いデータを送ります。RAM のサイズはアドレスのビット幅とオブジェクトへの最初の呼び出しでの書き込みデータから推定されます。

メモ: このオブジェクト構文は R2016b 以降でのみ実行されます。それよりも以前のリリースを使用している場合は、オブジェクトのそれぞれの呼び出しを等価の step 構文で置き換えます。たとえば、myObject(x)step(myObject,x) で置き換えます。

ram_2p = hdl.RAM('RAMType','Dual port','WriteOutputValue','New data');
dataLength       = 16;
[dataIn,wrDataOut,rdDataOut] = deal(uint8(zeros(1,dataLength)));

生成されたデータを System object にランダムに書き込み、古いデータを同じアドレスから読み取ります。

for ii = 1:dataLength
  dataIn(ii)  = randi([0 63],1,1,'uint8');
  wrAddr  = fi((ii-1),0,4,0);
  writeEnable = true;
  [wrDataOut(ii),rdDataOut(ii)] = ram_2p(dataIn(ii),wrAddr,writeEnable,wrAddr);
end  
wrDataOut
wrDataOut = 1x16 uint8 row vector

    0   52   57    8   58   40    6   17   35   61   61   10   62   61   31   51

rdDataOut
rdDataOut = 1x16 uint8 row vector

   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

さまざまなアドレスから書き込みと読み取りを行います。オブジェクトは読み取り結果を 1 サイクルの遅延の後に返します。

for ii = 1:dataLength
  wrAddr   = fi((ii-1),0,4,0);
  rdAddr   = fi(dataLength-ii+1,0,4,0);
  writeEnable = true;
  [wrDataOut(ii),rdDataOut(ii)] = ram_2p(dataIn(ii),wrAddr,writeEnable,rdAddr);
end
wrDataOut
wrDataOut = 1x16 uint8 row vector

    9   52   57    8   58   40    6   17   35   61   61   10   62   61   31   51

rdDataOut
rdDataOut = 1x16 uint8 row vector

    0    9    9   51   31   61   62   10   61   61   35   17    6   40   58    8

ベクトル データを Dual Port RAM に書き込むことができ、ベクトル データを読み取ることができる System object を作成します。ベクトルの各要素は RAM の個別のバンクに対応します。この例では、4 つの 16 ビット バンクを作成します。各バンクには 8 つのエントリがあります。

メモ: このオブジェクト構文は R2016b 以降でのみ実行されます。それよりも以前のリリースを使用している場合は、オブジェクトのそれぞれの呼び出しを等価の step 構文で置き換えます。たとえば、myObject(x)step(myObject,x) で置き換えます。

Dual Port RAM System object を作成します。

ram_2p = hdl.RAM('RAMType','Dual port','WriteOutputValue','New data');

ベクトル書き込みデータとアドレスを作成します。3 ビット アドレス (8 つの位置用) を使用して、16 ビット データを書き込みます。読み取りアドレスと書き込みアドレスは独立しています。出力データにメモリを割り当てます。

ramDataIn = fi(randi((2^16)-1,1,4),0,16,0);
ramReadAddr = fi([1,1,1,1],0,3,0);
ramWriteAddr = fi([1,1,1,1],0,3,0);
[wrOut,rdOut] = deal(fi(zeros(1,4),0,16,0));

まず、バンク 1 とバンク 4 に位置を書き込み、続いてすべてのバンクを読み取ります。書き込みデータは wrOut 出力引数にエコーされます。オブジェクトは読み取り結果を 1 サイクルの遅延の後に返します。

[wrOut,rdOut] = ram_2p(ramDataIn,ramWriteAddr,[true,false,false,true],ramReadAddr);
[wrOut,rdOut] = ram_2p(ramDataIn,ramWriteAddr,[false,false,false,false],ramReadAddr);
[wrOut,rdOut] = ram_2p(ramDataIn,ramWriteAddr,[false,false,false,false],ramReadAddr)
wrOut = 
       53393           0           0       59859

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 16
        FractionLength: 0
rdOut = 
       53393           0           0       59859

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Unsigned
            WordLength: 16
        FractionLength: 0

アルゴリズム

すべて展開する

Simulink® モデルで、MATLAB System ブロック内または MATLAB Function ブロック内の hdl.RAM を使用できます。MATLAB System ブロックの出力をログ記録する場合、出力データには少なくとも 3 つの次元があります。これは、MATLAB System ブロックに少なくとも 2 つの次元と、時間データが追加される 3 番目の次元があるためです。たとえば、ブロックにスカラー データを入力する場合、ログ記録された出力データには次元 1x1xN があります。ここで、N はタイム ステップの数です。入力の次元と同じである出力の次元を取得するには、[出力次元][参照入力端子から派生] に設定された Reshape ブロックを出力に追加します。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

HDL コード生成
HDL Coder™ を使用して FPGA 設計および ASIC 設計のための Verilog および VHDL のコードを生成します。

固定小数点の変換
Fixed-Point Designer™ を使用して固定小数点システムの設計とシミュレーションを行います。

バージョン履歴

R2015a で導入