hdl.RAM

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

Описание

hdl.RAM считывает и записывает в места памяти одну, простую двойную или двухпортовую оперативную память. Данные выходы задерживаются на один шаг. Если ваши входные данные скаляра, входные входы адреса и записи должны быть скалярными, и HDL- Coder™ выводит один блок оперативной памяти. Если ваши данные являются вектором, HDL Coder выводит массив параллельных банков оперативной памяти. При входе векторных данных входы включения адреса и записи могут быть как скалярами, так и векторами. Когда вы задаете скалярные входы для портов write enable и address, системный объект применяет ту же операцию к каждому банку ОЗУ.

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

Чтобы читать или записать в места памяти в оперативной памяти:

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

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

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

Создание

Описание

пример

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

пример

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

Свойства

расширить все

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

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

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

Тип ОЗУ, заданный как:

  • 'Single port' - Создайте один порт ОЗУ с разрешениями Write data, Address и Write as inputs и Read data as the output.

  • 'Simple dual port' - Создайте простую двухпортовую ОЗУ с данными записи, адресом записи, включением записи и адресом чтения в качестве входов и данных с адреса чтения в качестве выходов.

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

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

  • 'New data' - Отправлять новые данные по адресу на выход.

  • Old data' - Отправлять старые данные по адресу на выход.

Зависимости

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

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

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

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

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

Описание

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

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

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

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

расширить все

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

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

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

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

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

Типы данных: logical

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

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

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

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

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

расширить все

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

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

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

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

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

release(obj)

расширить все

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

Примеры

свернуть все

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

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

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

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

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

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

Выход данных соответствует адресу чтения. Если операция чтения выполняется по тому же адресу, что и операция записи, старые данные по этому адресу считываются как выходы. Размер ОЗУ выводится из битовой ширины адреса и записывается данные при первом вызове объекта.

Примечание.Синтаксис объекта выполняется только в 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;
  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

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

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

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

Существует два выходных порта: выходной порт записи и выходной порт чтения. Выход данных записи отправляет новые данные по адресу записи. Выход данных отправляет старые данные по адресу чтения. Размер ОЗУ выводится из битовой ширины адреса и записывается данные при первом вызове объекта.

Примечание.Синтаксис объекта выполняется только в 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

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

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

Создайте двухпортовый объект RAM System.

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=1×4 object
       53393           0           0       59859

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

rdOut=1×4 object
       53393           0           0       59859

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

Алгоритмы

расширить все

В вашем Simulink® модель, вы можете использовать hdl.RAM внутри MATLAB System или блока MATLAB Function. Если вы логгируете выход блока MATLAB System, выходные данные имеют по крайней мере три размерности, потому что блок MATLAB System имеет по крайней мере две размерности, и данные времени добавляют третью размерность. Для примера, если вы вводите скалярные данные в блок, записанные выходом данные имеют размерность 1x1xN, где N количество временных шагов. Чтобы получить выходную размерность, такую же как и входную размерность, добавьте блок Reshape на выходе с набором Output dimensionality Derive from reference input port.

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

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

.

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

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

Введенный в R2015a