UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

AR# 2104

SYNPLIFY - How do I instantiate RAM or ROM in HDL (Verilog/VHDL)?

Description

General Description:

How do I instantiate RAM or ROM in HDL (Verilog/VHDL) using Synplify?

Solution

You can instantiate RAM/ROM cells by using the Xilinx family library supplied with Synplify. Please see (Xilinx Answer 244) for details of instantiating Xilinx-specific cells.

The following example illustrates the creation of a 16x8 ROM using the Xilinx ROM16x1 component:

`include "<install_path>/lib/xilinx/xc4000.v"

module rom_16x8 (o, a);

input [3:0] a;

output [7:0] o;

ROM16X1 u0 (.O (o[0]), .A0 (a[0]), .A1 (a[1]), .A2 (a[2]), .A3 (a[3]))

/* synthesis xc_props="INIT=FFFF" */;

ROM16X1 u1 (.O (o[1]), .A0 (a[0]), .A1 (a[1]), .A2 (a[2]), .A3 (a[3]))

/* synthesis xc_props="INIT=ABCD" */;

ROM16X1 u2 (.O (o[2]), .A0 (a[0]), .A1 (a[1]), .A2 (a[2]), .A3 (a[3]))

/* synthesis xc_props="INIT=BCDE" */;

ROM16X1 u3 (.O (o[3]), .A0 (a[0]), .A1 (a[1]), .A2 (a[2]), .A3 (a[3]))

/* synthesis xc_props="INIT=CDEF" */;

ROM16X1 u4 (.O (o[4]), .A0 (a[0]), .A1 (a[1]), .A2 (a[2]), .A3 (a[3]))

/* synthesis xc_props="INIT=CCDD" */;

ROM16X1 u5 (.O (o[5]), .A0 (a[0]), .A1 (a[1]), .A2 (a[2]), .A3 (a[3]))

/* synthesis xc_props="INIT=0000" */;

ROM16X1 u6 (.O (o[6]), .A0 (a[0]), .A1 (a[1]), .A2 (a[2]), .A3 (a[3]))

/* synthesis xc_props="INIT=0010" */;

ROM16X1 u7 (.O (o[7]), .A0 (a[0]), .A1 (a[1]), .A2 (a[2]), .A3 (a[3]))

/* synthesis xc_props="INIT=1100" */;

endmodule

The following example illustrates the creation of a 16x8 ROM using the Xilinx ROM16x1 component:

library IEEE;

use IEEE.std_logic_1164.all;

library xc4000;

use xc4000.components.all;

library synplify;

use synplify.attributes.all;

entity rom_16x1 is

generic (init_val : string := "0000" );

port (O : out std_logic;

A3, A2, A1, A0: in std_logic);

end rom_16x1;

architecture xilinx of rom_16x1 is

attribute xc_props: string;

attribute xc_props of u1 : label is "INIT=" & init_val;

begin

U1 : ROM16X1 port map (O => O, A0 => A0, A1 => A1, A2 => A2, A3 => A3);

end xilinx;

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_unsigned.all;

entity rom_16x8 is

port (o: out std_logic_vector(7 downto 0);

a: in std_logic_vector(3 downto 0));

end rom_16x8;

architecture xilinx of rom_16x8 is

component rom_16x1

generic (init_val: string := "0000");

port (O : out std_logic;

A3, A2, A1, A0 : in std_logic);

end component;

begin

U0 : rom_16x1 generic map ("FFFF")

port map (O => o(0), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

U1 : rom_16x1 generic map ("ABCD")

port map (O => o(1), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

U2 : rom_16x1 generic map ("BCDE")

port map (O => o(2), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

U3 : rom_16x1 generic map ("CDEF")

port map (O => o(3), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

U4 : rom_16x1 generic map ("CCDD")

port map (O => o(4), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

U5 : rom_16x1 generic map ("0000")

port map (O => o(5), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

U6 : rom_16x1 generic map ("0010")

port map (O => o(6), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

U7 : rom_16x1 generic map ("1100")

port map (O => o(7), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

end xilinx;

The following example illustrates the creation of a 16x4 RAM using the Xilinx RAM16X1S component:

`include "/products/synplify/lib/xilinx/xc4000.v"

module RAM_INIT_EX1 (DATA_BUS, ADDR, WE, CLK);

input [3:0] ADDR;

inout [3:0] DATA_BUS;

input WE, CLK;

wire [3:0] DATA_OUT;

// Only for Simulation -- the defparam will not synthesize

// Use the defparam for RTL simulation.

// There is no defparam needed for Post-PAR simulation.

// synthesis translate_off

defparam RAM0.INIT="0101", RAM1.INIT="AAAA",

RAM2.INIT="FFFF", RAM3.INIT="5555";

// synthesis translate_on

assign DATA_BUS = !WE ? DATA_OUT : 4'hz;

// Instantaition of 4 16X1 Synchronous RAMs

// Use the xc_props attribute to pass the INIT property

RAM16X1S RAM3 (.O (DATA_OUT[3]), .D (DATA_BUS[3]),

.A3 (ADDR[3]), .A2 (ADDR[2]), .A1 (ADDR[1]),

.A0 (ADDR[0]), .WE (WE), .WCLK (CLK))

/* synthesis xc_props="INIT=5555" */;

RAM16X1S RAM2 (.O (DATA_OUT[2]), .D (DATA_BUS[2]),

.A3 (ADDR[3]), .A2 (ADDR[2]), .A1 (ADDR[1]),

.A0 (ADDR[0]), .WE (WE), .WCLK (CLK))

/* synthesis xc_props="INIT=FFFF" */;

RAM16X1S RAM1 (.O (DATA_OUT[1]), .D (DATA_BUS[1]),

.A3 (ADDR[3]), .A2 (ADDR[2]), .A1 (ADDR[1]),

.A0 (ADDR[0]), .WE (WE), .WCLK (CLK))

/* synthesis xc_props="INIT=AAAA" */;

RAM16X1S RAM0 (.O (DATA_OUT[0]), .D (DATA_BUS[0]),

.A3 (ADDR[3]), .A2 (ADDR[2]), .A1 (ADDR[1]),

.A0 (ADDR[0]), .WE (WE), .WCLK (CLK))

/* synthesis xc_props="INIT=0101" */;

endmodule

The following example illustrates the creation of a 16x4s RAM using the Xilinx RAM16x1S component:

library IEEE;

use IEEE.std_logic_1164.all;

library xc4000;

use xc4000.components.all;

library synplify;

use synplify.attributes.all;

entity ram_16x1s is

generic (init_val : string := "0000" );

port (O : out std_logic;

D : in std_logic;

A3, A2, A1, A0: in std_logic;

WE, CLK : in std_logic);

end ram_16x1s;

architecture xilinx of ram_16x1s is

attribute xc_props: string;

attribute xc_props of u1 : label is "INIT=" & init_val;

begin

U1 : RAM16X1S port map (O => O, WE => WE, WCLK => CLK, D => D, A0 => A0, A1 => A1, A2 => A2, A3 => A3);

end xilinx;

library IEEE;

use IEEE.std_logic_1164.all;

use IEEE.std_logic_unsigned.all;

entity ram_16x4s is

port (o: out std_logic_vector(3 downto 0);

we : in std_logic;

clk : in std_logic;

d: in std_logic_vector(3 downto 0);

a: in std_logic_vector(3 downto 0));

end ram_16x4s;

architecture xilinx of ram_16x4s is

component ram_16x1s

generic (init_val: string := "0000");

port (O : out std_logic;

D : in std_logic;

A3, A2, A1, A0 : in std_logic;

WE, CLK : in std_logic);

end component;

begin

U0 : ram_16x1s generic map ("FFFF")

port map (O => o(0), WE => we, CLK => clk, D => d(0), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

U1 : ram_16x1s generic map ("ABCD")

port map (O => o(1), WE => we, CLK => clk, D => d(1), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

U2 : ram_16x1s generic map ("BCDE")

port map (O => o(2), WE => we, CLK => clk, D => d(2), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

U3 : ram_16x1s generic map ("CDEF")

port map (O => o(3), WE => we, CLK => clk, D => d(3), A0 => a(0), A1 => a(1), A2 => a(2), A3 => a(3));

end xilinx;

AR# 2104
Date Created 08/21/2007
Last Updated 12/15/2012
Status Active
Type General Article