Single Port RAM System
Single-port RAM that supports sequential read and write operations
Libraries:
HDL Coder /
HDL RAMs
Alternative Configurations of Single Port RAM System Block:
Simple Dual Port RAM System | Dual Port RAM System | Simple Tri Port RAM System | True Dual Port RAM System
Description
The Single Port RAM System block models a single-port RAM that supports
sequential read and write operations. To configure this block, open the block and set
the Type of RAM parameter to Single
port
. By using this block, you can:
Create parallel RAM banks by using vector data at the din, addr, and we ports.
Specify an initial value for the RAM using the Initial output of RAM parameter.
Perform asynchronous read in target hardware by selecting the Use asynchronous read feature in target hardware parameter.
Perform cycle-accurate read operation by selecting the Model RAM with one cycle of delay parameter.
Use the column-write method to write to specified bits in an addressed memory location.
Examples
This example shows how to use the column-write method to specify the writable portions of bits in an address location for Single Port RAM System block. You can then generate HDL code for the model.
Simulate Model
Load and open the column_write_sram
model. The DUT
subsystem contains Single Port RAM System block, the data type of the din
and we
ports determines the writable portion of bits in an addressed memory location.
load_system("column_write_sram"); open_system("column_write_sram/DUT");
The value at the din
port is an integer with a value of 980
, the value at the addr
port is an integer with a value of 25
, and the value at the we
port is an integer with a value of 6
. The binary representation of the we
port value indicates that the block selects the third and second columns for writing data in the addressed memory location in the RAM. When you simulate the model, the value at the output dout
port is 976
. To change these values according to your requirements, see Using the Column-Write Method to Selectively Write to Columns.
sim('column_write_sram.slx'); open_system("column_write_sram");
Generate HDL code
Use HDL Coder™ to generate the HDL code for the model. To generate HDL code for DUT
subsystem, run this makehdl
command:
makehdl("column_write_sram/DUT");
### Working on the model <a href="matlab:open_system('column_write_sram')">column_write_sram</a> ### Generating HDL for <a href="matlab:open_system('column_write_sram/DUT')">column_write_sram/DUT</a> ### Using the config set for model <a href="matlab:configset.showParameterGroup('column_write_sram', { 'HDL Code Generation' } )">column_write_sram</a> for HDL code generation parameters. ### Running HDL checks on the model 'column_write_sram'. ### Begin compilation of the model 'column_write_sram'... ### Working on the model 'column_write_sram'... ### Working on... <a href="matlab:configset.internal.open('column_write_sram', 'GenerateModel')">GenerateModel</a> ### Begin model generation 'gm_column_write_sram'... ### Copying DUT to the generated model.... ### Model generation complete. ### Generated model saved at <a href="matlab:open_system('hdlsrc/column_write_sram/gm_column_write_sram.slx')">hdlsrc/column_write_sram/gm_column_write_sram.slx</a> ### Begin VHDL Code Generation for 'column_write_sram'. ### Working on column_write_sram/DUT/SinglePortRAM_generic as hdlsrc/column_write_sram/SinglePortRAM_generic.vhd. ### Working on column_write_sram/DUT as hdlsrc/column_write_sram/DUT.vhd. ### Code Generation for 'column_write_sram' completed. ### Generating HTML files for code generation report at <a href="matlab:hdlcoder.report.openDdg('/tmp/Bdoc25a_2864802_2630442/tp4452170f/hdlcoder-ex10710190/hdlsrc/column_write_sram/html/index.html')">index.html</a> ### Creating HDL Code Generation Check Report file:///tmp/Bdoc25a_2864802_2630442/tp4452170f/hdlcoder-ex10710190/hdlsrc/column_write_sram/DUT_report.html ### HDL check for 'column_write_sram' complete with 0 errors, 1 warnings, and 0 messages. ### HDL code generation complete.
Limitations
When you build the FPGA bitstream for the RAM, the global reset logic does not reset the RAM contents. To reset the RAM, implement the reset logic.
The RAM address can be either
fixed-point (fi)
orinteger
, must be unsigned, and must be between2
and31
bits long.
Ports
Input
Data to write, specified as a scalar or a vector. You can write the
data into the RAM memory location when the write enable signal at port
we is true
. This value can
be an integer, or of type double
,
single
or half
. The value can
also be a fi
object and can be real or
complex.
Bus Support:
You can use non-virtual bus and arrays of buses for HDL code generation.
Data Types: single
| double
| half
| int8
| int16
| uint8
| uint16
| Boolean
| fixed point
Address to write or read, specified as a scalar or a vector. Use this
address to write data to RAM when the signal at port
we is true
. The block reads
the value from the specified memory location when the signal at port
we is false. This value can be either a
fixed-point (fi)
or an unsigned
integer
and must be between 2
and 31
bits long.
Data Types: uint8
| uint16
| fixed point
Write enable, specified as a scalar or a vector. When the signal at
the port we is true
, the block
writes the data into the specified memory location. When the signal at
the port we is false
, the block
reads the value from the memory location specified by the
addr port.
Note
To use column-write method, the data type must be an
integer
or a
fixed-point
.
Data Types: uint8
| uint16
| uint32
| uint64
| Boolean
| fixed point
Output
Output data, returned as a scalar or a vector. The RAM reads data from
the memory location specified by the addr port when
the signal at port we is
false
.
Parameters
Main
Type of RAM, specified as either:
Single port
— Create a single port RAM with write data, address, and write enable data as inputs and read data as the output.Simple dual port
— Create a simple dual port RAM with write data, write address, write enable, and read address as inputs, and data from the read address as the output.Dual port
— Create a dual port RAM with write data, write address, write enable, and read address as inputs, and data from the read address and write address as the outputs.True dual port
— Create a true dual port RAM with write dataa
andb
, write and read addresses fora
andb
, and write enablea
andb
as inputs and data from write addressesa
andb
as the outputs.Simple tri port
— Create a simple tri port RAM with write data, write address, write enable, and read addressesa
andb
as inputs and data from read addressesa
andb
as the outputs.
The code generator dynamically configures the input and output ports of the block based on the RAM type that you specify.
Programmatic Use
Block Parameter:
RAMType |
Type: character vector, string |
Values:
Dual port | Simple dual
port | Single port |
True dual port | Simple tri
port |
Default:
Single port |
Enable this option to allow the hardware to execute a read instruction immediately, without waiting one cycle.
Programmatic Use
Block Parameter:
AsyncRead |
Type: character vector, string |
Values:
'on' | 'off' |
Default:
'off' |
Select the behavior for write output as New data
or
Old data
:
New data
— Send out new data at the address to the output.Old data
— Send out old data at the address to the output.
Dependencies
To enable this parameter, clear the Use asynchronous read feature in target hardware parameter.
Programmatic Use
Block Parameter:
WriteOutputValue |
Type: character vector, string |
Values:
New data | Old
data |
Default:
New data |
Specify the initial simulation output of the RAM by using one of these options:
A scalar value.
A vector with a one-to-one mapping between the initial value and the RAM words.
An n-by-m matrix with a one-to-one mapping between the initial values and the RAM words in the RAM banks, where n represents the number of RAM banks and m represents the number of address locations in the RAM block, or vice-versa.
Programmatic Use
Block Parameter:
RAMInitialValue |
Type: integer, floating point |
Values:
0.0 | Scalar | Vector |
Default:
0.0 |
Data Types: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
Advanced
Since R2024b
When you select this parameter, the RAM delays the input data by one cycle before the output can read it. Use this option to ensure the block is cycle-accurate with the generated HDL code.
When you clear this parameter, the RAM reads and outputs the input data immediately, but adds one cycle of latency during HDL code generation. Use this option to leverage clock-rate pipelining when you specify an oversampling value or work with multirate models.
Dependencies
To enable this parameter, clear the Use asynchronous read feature in target hardware parameter.
Programmatic Use
Block Parameter:
ModelRAMDelay |
Type: character vector, string |
Values:
'on' | 'off' |
Default:
'on' |
Since R2025a
When you set this parameter to
serial
, the code generator infers parallel banks of RAM from vector inputs to RAM System block.When you set this parameter to
parallel
:The code generator does not scale up RAM consumption with the size of the vector input when you generate HDL Code. Instead, it applies each operation of the input signals one at a time, starting with the first index. Enabling serial access allows you to leverage multicycle RAM access at a faster clock rate while modeling with a vector input at the data rate.
If the RAM System block exists in a clock-rate pipelining region, the serialization uses a clock-rate implementation instead of local multirate implementation.
Dependencies
To enable this parameter, clear the Model RAM with one cycle of delay parameter or enable the Use asynchronous read feature in target hardware parameter.
Programmatic Use
Block Parameter:
VectorAccess |
Type: character vector, string |
Values:
'serial' | 'parallel' |
Default:
'serial' |
Alternative Configurations
The Simple
Dual Port RAM System block models RAM that supports simultaneous
read and write operations through a single output port for read data. To
configure this block, open the block and set the Type of
RAM parameter to Simple dual
port
.
Libraries:
HDL Coder /
HDL RAMs
The Dual
Port RAM System block models RAM that supports simultaneous read
and write operations through output ports for read data and write data. This
blocks allows concurrent access to different memory addresses. To configure
this block, open the block and set the Type of RAM
parameter to Dual port
.
Libraries:
HDL Coder /
HDL RAMs
The Simple
Tri Port RAM System block models RAM that supports simultaneous
read and write operations through two output ports for read data. This
blocks allows concurrent access to different memory addresses. To configure
this block, open the block and set the Type of RAM
parameter to Simple tri port
.
Libraries:
HDL Coder /
HDL RAMs
The True
Dual Port RAM System block models RAM that supports simultaneous
read and write operations through two output ports for read data. This
blocks allows concurrent access to different memory addresses for both read
and write operations. To configure this block, open the block and set the
Type of RAM parameter to True dual
port
.
Libraries:
HDL Coder /
HDL RAMs
More About
You can use the column-write method to view the RAM as a collection of equally sized columns. During a write cycle, you can write into each of these columns separately. The data type and value of the write enable input, along with the data type of write data input, determine the size of each column and the columns in which the block writes in the addressed memory location.
In this context:
DT is the data type of the write data input signal
din
.DW is the data width of the input data, which is equal to word length of the
din
value.DTWE is the data type of the write enable signal
we
. This signal determines which columns the block writes in the addressed memory location. The block writes the columns based on the position of the 1s in the binary representation of the value ofwe
.NC is the number of columns which you can partition the RAM space to write the data, which is equal to word length of
we
value.WC is the width of each column, which is equal to DW divided by NC.
The table summarizes the relationship among the data types of the write data input, the data types of write enable input, the number of columns, and the width of each column.
DT | DW | DTWE | NC | WC in Bits |
---|---|---|---|---|
uint16 | 16 | ufix4 | 4 | 4 |
uint32 | 32 | ufix4 | 4 | 8 |
uint64 | 64 | ufix4 | 4 | 16 |
uint32 | 32 | uint8 | 8 | 4 |
uint64 | 64 | uint8 | 8 | 8 |
int32 | 32 | uint16 | 16 | 2 |
For example, if DT is uint16
and
WE is ufix4
, then DW is
equal to 16, NC is equal to 4, and WC is equal
to 4 bits. If the input to din
is 980
, its
binary representation is 0000001111010100
. The column-wise
representation of din
is c4 = 0000
, c3 =
0011
, c2 = 1101
, and c1 =
0100
, where c1 is the first column.
The table summarizes the results of using the column-write method for different input combinations.
Value of we | Binary Representation of
we | Columns Selected for Writing in RAM | Data at Memory Location | dout | |
---|---|---|---|---|---|
Before Performing Write Operation | After Performing Write Operation | ||||
3 | 0011 | c2, c1 | c4 = c3 =
c2 =
c1 =
| c4 = c3 =
c2 =
c1 =
| 212 |
4 | 0100 | c3 | c4 = c3 =
c2 =
c1 =
| c4 = c3 =
c2 = c1 =
| 768 |
6 | 0110 | c3, c2 | c4 = c3 =
c2 =
c1 =
| c4 = c3 =
c2 =
c1 =
| 976 |
9 | 1001 | c4, c1 | c4 = c3 =
c2 =
c1 =
| c4 = c3 =
c2 =
c1 =
| 4 |
9 | 1001 | c4, c1 | c4 = c3 =
c2 =
c1 =
| c4 = c3 =
c2 =
c1 =
| 4084 |
Inputs with signed data types and with non-zero fraction lengths are not supported by the write enable input port.
The word length of the write data input must a multiple of the word length of the write enable.
Extended Capabilities
C/C++ Code Generation
Generate C and C++ code using Simulink® Coder™.
HDL Coder™ provides additional configuration options that affect HDL implementation and synthesized logic.
The block has a MATLABSystem
architecture which
indicates that the block implementation uses the hdl.RAM
System object™.
General | |
---|---|
ConstrainedOutputPipeline | Number of registers to place at
the outputs by moving existing delays within your design. Distributed
pipelining does not redistribute these registers. The default is
|
InputPipeline | Number of input pipeline stages
to insert in the generated code. Distributed pipelining and constrained
output pipelining can move these registers. The default is
|
OutputPipeline | Number of output pipeline stages
to insert in the generated code. Distributed pipelining and constrained
output pipelining can move these registers. The default is
|
RAMDirective | Specify whether to map RAM blocks in your design to RAM
blocks on the target FPGA. For UltraRAM mapping,
Initial output of RAM must
be set to |
This block supports code generation for complex signals.
The block does not support:
Nested bus at the data port.
Non-zero values at the Initial output of RAM when using non-virtual bus input to the data port.
Version History
Introduced in R2017bYou can use Single Port RAM System block inside a data rate feedback loop and use clock-rate pipelining optimization. This model design is helpful for applications that require programmable or tunable lookup tables without having to regenerate bitstreams.
Use the new parameter Model RAM with one cycle of delay to model delay in your simulation. Model RAM with one cycle of delay is enabled by default and is disabled when Use asynchronous read feature in target hardware is enabled.
These parameters are renamed:
Previous Name | Current Name |
---|---|
Specify the type of RAM | Type of RAM |
Enable asynchronous reads | Use asynchronous read feature in target hardware |
Specify the output data for a write operation | Behavior for write output |
Specify the RAM initial value | Initial output of RAM |
In this block, you can use the column-write method to selectively modify specific parts of the memory without altering the remaining parts at a specified memory address.
In this block, you can initialize RAM banks with unique initial values.
The block now supports HDL code generation for input data specified as an array of buses.
The block now supports HDL code generation with input data of type
Half
or
Boolean
.
See Also
Objects
Blocks
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: United States.
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)