Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

hdl.RAM

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

説明

hdl.RAM System object™ は、Single Port RAM、Simple Dual Port RAM、Dual Port RAM、True Dual Port RAM、または Simple Tri 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、True Dual Port RAM、または Simple Tri 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 を作成します。入力は書き込みデータ、書き込みアドレス、書き込みイネーブル、および読み取りアドレス、出力は読み取りアドレスと書き込みアドレスからのデータです。

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

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

ターゲット ハードウェアで非同期読み取り機能を使用するオプション。数値または logical 1 (true) または 0 (false) として指定します。非同期読み取りがサポートされているボードでは、ハードウェアで 1 サイクル待機せずに即時に読み取り命令を実行できます。このプロパティは、RAMTypeTrue dual port として指定した場合には使用できません。

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

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

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

依存関係

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

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

  • スカラー値。

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

使用法

説明

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

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

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

[wrDataOutA,wrDataOutB] = ram(wrDataA,wrAddressA,wrEnA,wrDataB,wrAddressB,wrEnB) は、wrEnAtrue の場合に値 wrDataA をメモリ位置 wrAddressA に書き込み、wrEnBtrue の場合に値 wrDataB をメモリ位置 wrAddressB に書き込みます。wrDataOutA はメモリ位置 wrAddressA にある新しいデータまたは古いデータです。wrDataOutB はメモリ位置 wrAddressB にある新しいデータまたは古いデータです。wrAddressAwrAddressB を同じアドレスにすることはできません。True Dual Port RAM System object を作成する場合は、この構文を使用します。

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

入力引数

すべて展開する

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

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

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

メモ

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

データ型: uint8 | uint16 | fi

書き込みイネーブル。数値または logical 1 (true) または 0 (false) として指定します。wrEntrue の場合、wrData を RAM のメモリ位置に書き込みます。Single Port RAM を作成する場合、wrEnfalse のとき、System object はメモリ位置にある値を読み取ります。

データ型: logical

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

メモ

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

データ型: uint8 | uint16 | fi

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

メモ

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

データ型: uint8 | uint16 | fi

wrEnAtrue の場合に RAM のメモリ位置に書き込むデータ。スカラーまたはベクトルとして指定します。この値は doublesinglehalfinteger、または fixed-point (fi) オブジェクトのいずれかで、実数または複素数にできます。この書き込みデータは、True Dual Port RAM の System object で使用します。RAM バンクが使用される場合、hdl.RAM System object はアドレスの計算に内部的に固定小数点データ型を使用します。結果として、Fixed-Point Designer 製品ライセンスのチェックアウトが行われます。

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

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

メモ

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

データ型: uint8 | uint16 | fi

書き込みイネーブル。数値または logical 1 (true) または 0 (false) として指定します。wrEnAtrue の場合、wrDataA を RAM のメモリ位置に書き込みます。このイネーブルは、True Dual Port RAM の System object で使用します。

データ型: logical

wrEnBtrue の場合に RAM のメモリ位置に書き込むデータ。スカラーまたはベクトルとして指定します。この値は doublesinglehalfinteger、または fixed-point (fi) オブジェクトのいずれかで、実数または複素数にできます。この書き込みデータは、True Dual Port RAM の System object で使用します。RAM バンクが使用される場合、hdl.RAM System object はアドレスの計算に内部的に固定小数点データ型を使用します。結果として、Fixed-Point Designer 製品ライセンスのチェックアウトが行われます。

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

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

メモ

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

データ型: uint8 | uint16 | fi

書き込みイネーブル。数値または logical 1 (true) または 0 (false) として指定します。wrEnBtrue の場合、wrDataB を RAM のメモリ位置に書き込みます。このイネーブルは、True Dual Port RAM の System object で使用します。

データ型: logical

Simple Tri Port RAM の System object を作成するときに rdDataOutA でデータの読み取りおよび格納を行うアドレス。スカラーまたはベクトルとして指定します。この値は fixed-point (fi) または integer のいずれかで、符号なしの 231 ビット長でなければなりません。

メモ

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

データ型: uint8 | uint16 | fi

Simple Tri Port RAM の System object を作成するときに rdDataOutA でデータの読み取りおよび格納を行うアドレス。スカラーまたはベクトルとして指定します。この値は fixed-point (fi) または integer のいずれかで、符号なしの 231 ビット長でなければなりません。

メモ

入力データが組み込みの integer データ型である場合でも、RAM バンクが使用される場合、hdl.RAM System object はアドレスの計算に内部的に固定小数点データ型を使用します。結果として、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 が読み取る新しい出力データまたは古い出力データ。スカラーまたはベクトルとして返されます。

True Dual Port RAM System object のメモリ位置 wrAddressA から System object が読み取る新しい出力データまたは古い出力データ。スカラーまたはベクトルとして返されます。

True Dual Port RAM System object のメモリ位置 wrAddressB から System object が読み取る新しい出力データまたは古い出力データ。スカラーまたはベクトルとして返されます。

Simple Tri Port RAM System object のメモリ位置 rdAddressA から System object が読み取る古い出力データ。スカラーまたはベクトルとして返されます。

Simple Tri Port RAM System object のメモリ位置 rdAddressB から System object が読み取る古い出力データ。スカラーまたはベクトルとして返されます。

オブジェクト関数

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

release(obj)

すべて展開する

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

すべて折りたたむ

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

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

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

             RAMType: 'Single port'
           AsyncRead: false
    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 を作成します。

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 のサイズはアドレスのビット幅とオブジェクトへの最初の呼び出しでの書き込みデータから推定されます。

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 のサイズはアドレスのビット幅とオブジェクトへの最初の呼び出しでの書き込みデータから推定されます。

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 つのエントリがあります。

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 System object を使用できます。MATLAB System ブロックの出力をログ記録する場合、出力データには少なくとも 3 つの次元があります。これは、MATLAB System ブロックに少なくとも 2 つの次元と、時間データが追加される 3 番目の次元があるためです。たとえば、ブロックにスカラー データを入力する場合、ログ記録された出力データは 1×1×N 次元です。ここで、N はタイム ステップの数です。入力の次元と同じである出力の次元を取得するには、[出力次元] パラメーターが [参照入力端子から派生] に設定された Reshape ブロックを出力に追加します。

拡張機能

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

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

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

バージョン履歴

R2015a で導入