exponenta event banner

hdl. RAM

Одно-, просто двухпортовая или двухпортовая ОЗУ для доступа к памяти для чтения/записи

Описание

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

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

Для чтения из или записи в места памяти в ОЗУ:

  1. Создать hdl.RAM и задайте его свойства.

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

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

Создание

Описание

пример

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

пример

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

Свойства

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

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

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

Дополнительные сведения об изменении значений свойств см. в разделе Проектирование системы в MATLAB с использованием системных объектов.

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

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

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

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

Поведение для вывода записи, указанное как:

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

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

Зависимости

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

Начальный результат моделирования объекта System, указанный как:

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

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

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

Описание

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

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

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

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

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

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

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

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

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

Когда wrEn true, вы пишете wrData в ячейку памяти ОЗУ. При создании ОЗУ с одним портом системный объект считывает значение в области памяти, когда wrEn имеет значение false. Это значение должно быть логическим.

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

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

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

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

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

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

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

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

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

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

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

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

release(obj)

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

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

Примеры

свернуть все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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 или функционального блока MATLAB. При регистрации вывода системного блока MATLAB выходные данные имеют по крайней мере три измерения, поскольку системный блок MATLAB имеет по крайней мере два измерения, а временные данные добавляют третье измерение. Например, при вводе скалярных данных в блок записанные выходные данные имеют размерность 1x1xN, где N - количество временных шагов. Чтобы получить выходной размер, аналогичный входному размеру, добавьте блок изменения формы на выходе с параметром «Выходная размерность», равным Derive from reference input port.

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.

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

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

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