hdl. RAM

Один, простой двойной, или двухпортовый RAM для доступа для чтения-записи памяти

Описание

hdl.RAM читает из и пишет в ячейки памяти для одного, простого двойного, или двухпортового RAM. Выходные данные задерживаются один шаг. Если ваши входные данные являются скаляром, адрес и входные параметры разрешения записи должны быть скаляром, andHDL Coder™ выводит один блок RAM. Если ваши данные являются вектором, HDL Coder выводит массив параллельных банков RAM. С векторным вводом данных адрес и входные параметры разрешения записи могут быть оба скалярами или векторами. Когда вы задаете скалярные входные параметры для разрешения записи и обращаетесь к портам, системный объект применяет ту же операцию к каждому банку RAM.

Система hdl.RAM object™ может иметь байты 231 внутренней памяти. Размер RAM учитывает ширину адреса, количество байтов, которые используются, чтобы сохранить каждое слово и количество банков RAM.

Читать из или записать в ячейки памяти в RAM:

  1. Создайте объект hdl.RAM и установите его свойства.

  2. Вызовите объект с аргументами, как будто это была функция.

Чтобы узнать больше, как Системные объекты работают, смотрите то, Что Системные объекты? MATLAB.

Создание

Синтаксис

ram = hdl.RAM
ram = hdl.RAM(Name,Value)

Описание

пример

ram = hdl.RAM возвращает один Системный объект порта RAM, в который можно записать или считать из ячейки памяти.

пример

ram = hdl.RAM(Name,Value) возвращает один, простой двойной, или двухпортовый Системный объект RAM с набором свойств с помощью одной или нескольких пар "имя-значение". Заключите каждое имя свойства в одинарные кавычки.

Свойства

развернуть все

Если в противном случае не обозначено, свойства являются ненастраиваемыми, что означает, что вы не можете изменить их значения после вызова объекта. Объекты блокируют, когда вы вызываете их, и функция release разблокировала их.

Если свойство является настраиваемым, можно изменить его значение в любое время.

Для получения дополнительной информации об изменении значений свойств смотрите Разработку системы в MATLAB Используя Системные объекты (MATLAB).

Тип RAM, заданного как также:

  • 'Single port' — Создайте один порт RAM с, Записывают данные, Адрес и Разрешение записи как входные параметры и Считанные данные как вывод.

  • 'Simple dual port' — Создайте простой двухпортовый RAM с, Записывают данные, адрес Записи, Разрешение записи и адрес Рида как входные параметры и данные из адреса чтения как вывод.

  • 'Dual port' — Создайте двухпортовый RAM с, Записывают данные, адрес Записи, Разрешение записи и адрес Рида как входные параметры и данные из адреса чтения и адреса записи как выходные параметры.

Поведение для Write вывод, заданный как также:

  • 'New data' — Отошлите новые данные в адресе к выводу.

  • Old data' — Отошлите старые данные в адресе к выводу.

Зависимости

Задайте это свойство, когда вы установите RamType на 'Single port' или 'Dual port'. Это свойство не запрашивает объект Simple Dual Port RAM.

Начальная симуляция вывод Системного объекта, заданного как также:

  • Скалярное значение.

  • Вектор со взаимно-однозначным отображением между начальным значением и словами RAM.

Использование

Для версий ранее, чем R2016b, используйте функцию step, чтобы запустить алгоритм Системного объекта. Аргументы к step являются объектом, который вы создали, сопровождаемый аргументами, показанными в этом разделе.

Например, y = step(obj,x) и y = obj(x) выполняют эквивалентные операции.

Синтаксис

dataOut = ram(wrData,rwAddress,wrEn)
rdDataOut = ram(wrData,wrAddress,wrEn,rdAddress)
[wrDataOut,rdDataOut] = ram(wrData,wrAddress,wrEn,rdAddress)

Описание

dataOut = ram(wrData,rwAddress,wrEn) читает значение в ячейке памяти rwAddress, когда wrEn является ложным. Когда wrEn верен, вы пишете значению wrData в ячейку памяти rwAddress. dataOut является новыми или старыми данными в rwAddress. Используйте этот синтаксис, когда вы создадите один Системный объект порта RAM.

rdDataOut = ram(wrData,wrAddress,wrEn,rdAddress) пишет значение wrData в ячейку памяти wrAddress, когда wrEn верен. rdDataOut является старыми данными в местоположении адреса rdAddress. Используйте этот синтаксис, когда вы создадите простой двухпортовый Системный объект RAM.

[wrDataOut,rdDataOut] = ram(wrData,wrAddress,wrEn,rdAddress) пишет значение wrData в ячейку памяти wrAddress, когда wrEn верен. wrDataOut является новыми или старыми данными в ячейке памяти wrAddress. rdDataOut является старыми данными в местоположении адреса rdAddress. Используйте этот синтаксис, когда вы создадите двухпортовый Системный объект RAM.

Входные параметры

развернуть все

Данные, которые вы пишете в местоположение Оперативной памяти, когда wrEn верен. Это значение может быть double, single, integer или объектом fixed-point (fi), и может быть действительным или комплексным.

Типы данных: single | double | int8 | int16 | uint8 | uint16 | fi

Обратитесь к этому, вы вписываете в wrData, когда wrEn верен. Системный объект читает значение в ячейке памяти rwAddress, когда wrEn является ложным. Это значение может быть или fixed-point (fi) или integer, и должно быть действительным и без знака. Задайте этот адрес, когда вы создадите один объект порта RAM.

Типы данных: uint8 | uint16 | fi

Когда wrEn верен, вы пишете wrData в местоположение Оперативной памяти. Если вы создаете один порт RAM, Системный объект читает значение в ячейке памяти, когда wrEn является ложным. Это значение должно быть логическим.

Типы данных: логический

Обратитесь к этому, вы считываете данные из того, когда вы создаете простой двухпортовый RAM или двухпортовый Системный объект RAM. Это значение может быть или fixed-point (fi) или integer, и должно быть действительным и без знака.

Типы данных: uint8 | uint16 | fi

Обратитесь к этому, вы вписываете в данные, когда вы создаете простой двухпортовый RAM или двухпортовый Системный объект RAM. Это значение может быть или fixed-point (fi) или integer, и должно быть действительным и без знака.

Типы данных: uint8 | uint16 | fi

Выходные аргументы

развернуть все

Выходные данные, что Системный объект читает из ячейки памяти rwAddress один объект порта RAM, когда wrEn является ложным.

Старые выходные данные, что Системный объект читает из ячейки памяти rdAddress простого двухпортового RAM или двухпортового Системного объекта RAM.

Новые или старые выходные данные, что Системный объект читает из ячейки памяти wrAddress простого двухпортового RAM или двухпортового Системного объекта RAM.

Функции объекта

Чтобы использовать объектную функцию, задайте Системный объект как первый входной параметр. Например, чтобы выпустить системные ресурсы Системного объекта под названием obj, используйте этот синтаксис:

release(obj)

развернуть все

stepЗапустите алгоритм Системного объекта
releaseВысвободите средства и позвольте изменения в значениях свойств Системного объекта и введите характеристики
resetСбросьте внутренние состояния Системного объекта

Примеры

развернуть все

Создайте Системный объект, чтобы читать из или записать в ячейку памяти в RAM. Установите WriteOutputValue на Old 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

Создайте Системный объект, который пишет в один порт RAM и читает недавно записанное значение.

Примечание: Этот объектный синтаксис запускается только в R2016b или позже. Если вы используете более ранний релиз, заменяете каждый вызов объекта с эквивалентным синтаксисом step. Например, замените myObject(x) на step(myObject,x).

Создайте однопортовый Системный объект RAM. Когда вы пишете местоположение, объект возвращает новое значение. Размер RAM выведен из bitwidth адреса, и запишите данные на первом вызове объекта.

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

Запись случайным образом сгенерировала данные к Системному объекту, и затем считала данные назад снова.

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.

Порт выходных данных соответствует адресу чтения. Если операция чтения выполняется в том же адресе как операция записи, старые данные в том адресе считаны как вывод. Размер RAM выведен из bitwidth адреса, и запишите данные на первом вызове объекта.

Примечание: Этот объектный синтаксис запускается только в R2016b или позже. Если вы используете более ранний релиз, заменяете каждый вызов объекта с эквивалентным синтаксисом step. Например, замените myObject(x) на step(myObject,x).

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

Запись случайным образом сгенерировала данные к Системному объекту и считала старые данные из того же адреса.

for ii = 1:dataLength
  dataIn(ii)  = randi([0 63],1,1,'uint8');
  wrAddr  = fi((ii-1),0,4,0);
  writeEnable = true;
  ataOut(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

Запишите и читайте из различных адресов. Объект возвращает результат чтения после одной задержки цикла.

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.

Существует два выходных порта: порт выходных данных записи и порт выходных данных чтения. Порт выходных данных записи отсылает новые данные в адресе записи. Порт выходных данных чтения отсылает старые данные в адресе чтения. Размер RAM выведен из bitwidth адреса, и запишите данные на первом вызове объекта.

Примечание: Этот объектный синтаксис запускается только в 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)));

Запись случайным образом сгенерировала данные к Системному объекту и считала старые данные из того же адреса.

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

Запишите и читайте из различных адресов. Объект возвращает результат чтения после одной задержки цикла.

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

Создайте Системный объект, который может записать векторные данные в двухпортовый RAM и считать векторные данные. Каждый элемент вектора соответствует отдельному банку RAM. Этот пример создает 4 16-битных банка. Каждый банк имеет восемь записей.

Примечание: Этот объектный синтаксис запускается только в R2016b или позже. Если вы используете более ранний релиз, заменяете каждый вызов объекта с эквивалентным синтаксисом step. Например, замените myObject(x) на step(myObject,x).

Создайте двухпортовый Системный объект RAM.

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. Объект возвращает результаты чтения после одной задержки цикла.

[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® можно использовать hdl.RAM в Системе MATLAB или блоке MATLAB function. Если вы регистрируете вывод блока MATLAB System, выходные данные имеет, по крайней мере, три измерения, потому что блок MATLAB System имеет по крайней мере две размерности, и данные времени добавляют третью размерность. Например, если вы вводите скалярные данные к блоку, регистрируемые выходные данные имеет размерность 1x1xN, где N является количеством временных шагов. Чтобы получить выходную размерность, которая является тем же самым как входная размерность, добавьте блок Reshape при выводе с набором Output dimensionality к Derive from reference input port.

Расширенные возможности

Генерация кода C/C++
Генерация кода C и C++ с помощью MATLAB® Coder™.

Генерация HDL-кода
Сгенерируйте Verilog и код VHDL для FPGA и проекты ASIC с помощью HDL Coder™.

Преобразование фиксированной точки
Преобразуйте алгоритмы с плавающей точкой в фиксированную точку с помощью Fixed-Point Designer™.

Представленный в R2015a