Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
17252 Discussions

Using Single Port Ram module in a parent module

Altera_Forum
Honored Contributor II
1,293 Views

I am trying to use the RAM 1-port mega function in an upper level module but I can't find any examples how to use the RAM module once it is attached. Everywhere I see how to instantiate it, but once that is done, how do I use it? By changing the variables in always statements in the parent module are they automatically changed int he RAM module? I really just need an example. 

My code is as follows. 

 

This is my parent module 

 

module UseRam(in,out, write_enable, clk, counter); input counter; input write_enable; input clk; input in; output out; single_port_ram_bb ram1( .data(in), .address(counter), .wren(write_enable), .clock(clk), .q(out)); endmodule  

 

 

I'm starting simple, just channeling one module's inputs into the next, however I don't understand what's happening in the mega function module. The whole thing compiles but nothing happens when I change the inputs. 

 

This is what the mega function manager creates. For a RAM 1-port 

 

 

// megafunction wizard: %RAM: 1-PORT%VBB% // GENERATION: STANDARD // VERSION: WM1.0 // MODULE: altsyncram // ============================================================ // File Name: single_port_ram.v // Megafunction Name(s): // altsyncram // // Simulation Library Files(s): // altera_mf // ============================================================ // ************************************************************ // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! // // 12.1 Build 243 01/31/2013 SP 1 SJ Web Edition // ************************************************************ //Copyright (C) 1991-2012 Altera Corporation //Your use of Altera Corporation's design tools, logic functions //and other software and tools, and its AMPP partner logic //functions, and any output files from any of the foregoing //(including device programming or simulation files), and any //associated documentation or information are expressly subject //to the terms and conditions of the Altera Program License //Subscription Agreement, Altera MegaCore Function License //Agreement, or other applicable license agreement, including, //without limitation, that your use is for the sole purpose of //programming logic devices manufactured by Altera and sold by //Altera or its authorized distributors. Please refer to the //applicable agreement for further details. module single_port_ram_bb ( address, clock, data, wren, q); input address; input clock; input data; input wren; output q; `ifndef ALTERA_RESERVED_QIS // synopsys translate_off `endif tri1 clock; `ifndef ALTERA_RESERVED_QIS // synopsys translate_on `endif endmodule // ============================================================ // CNX file retrieval info // ============================================================ // Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" // Retrieval info: PRIVATE: AclrAddr NUMERIC "0" // Retrieval info: PRIVATE: AclrByte NUMERIC "0" // Retrieval info: PRIVATE: AclrData NUMERIC "0" // Retrieval info: PRIVATE: AclrOutput NUMERIC "0" // Retrieval info: PRIVATE: BYTE_ENABLE NUMERIC "0" // Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" // Retrieval info: PRIVATE: BlankMemory NUMERIC "1" // Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" // Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" // Retrieval info: PRIVATE: Clken NUMERIC "0" // Retrieval info: PRIVATE: DataBusSeparated NUMERIC "1" // Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" // Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" // Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" // Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone II" // Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "1" // Retrieval info: PRIVATE: JTAG_ID STRING "Ram1" // Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" // Retrieval info: PRIVATE: MIFfilename STRING "" // Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "32" // Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "2" // Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3" // Retrieval info: PRIVATE: RegAddr NUMERIC "1" // Retrieval info: PRIVATE: RegData NUMERIC "1" // Retrieval info: PRIVATE: RegOutput NUMERIC "1" // Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0" // Retrieval info: PRIVATE: SingleClock NUMERIC "1" // Retrieval info: PRIVATE: UseDQRAM NUMERIC "1" // Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0" // Retrieval info: PRIVATE: WidthAddr NUMERIC "5" // Retrieval info: PRIVATE: WidthData NUMERIC "8" // Retrieval info: PRIVATE: rden NUMERIC "0" // Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all // Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" // Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone II" // Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=Ram1" // Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" // Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "32" // Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT" // Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" // Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" // Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" // Retrieval info: CONSTANT: RAM_BLOCK_TYPE STRING "M4K" // Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "5" // Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" // Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" // Retrieval info: USED_PORT: address 0 0 5 0 INPUT NODEFVAL "address" // Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock" // Retrieval info: USED_PORT: data 0 0 8 0 INPUT NODEFVAL "data" // Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL "q" // Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL "wren" // Retrieval info: CONNECT: at address_a 0 0 5 0 address 0 0 5 0 // Retrieval info: CONNECT: at clock0 0 0 0 0 clock 0 0 0 0 // Retrieval info: CONNECT: at data_a 0 0 8 0 data 0 0 8 0 // Retrieval info: CONNECT: at wren_a 0 0 0 0 wren 0 0 0 0 // Retrieval info: CONNECT: q 0 0 8 0 at q_a 0 0 8 0 // Retrieval info: GEN_FILE: TYPE_NORMAL single_port_ram.v TRUE // Retrieval info: GEN_FILE: TYPE_NORMAL single_port_ram.inc FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL single_port_ram.cmp FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL single_port_ram.bsf FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL single_port_ram_inst.v TRUE // Retrieval info: GEN_FILE: TYPE_NORMAL single_port_ram_bb.v TRUE // Retrieval info: LIB_FILE: altera_mf  

 

Finally, I've seen this layout for a ram module on the internet and in the Quartus II template file. 

 

// Quartus II Verilog Template // Single port RAM with single read/write address module single_port_ram# (parameter DATA_WIDTH=8, parameter ADDR_WIDTH=6) ( input data, input addr, input we, clk, output q ); // Declare the RAM variable reg ram; // Variable to hold the registered read address reg addr_reg; always at (posedge clk) begin // Write if (we) ram <= data; addr_reg <= addr; end // Continuous assignment implies read returns NEW data. // This is the natural behavior of the TriMatrix memory // blocks in Single Port mode. assign q = ram; endmodule  

 

This module makes sense, I can see what's going on. If I compile it by itself, I can plug in values and get them back out. however, I don't know how to make it use M4K blocks to save space. And I can't get it to work when I instantiate it in an upper module. 

 

Any and all advice on RAM modules will be greatly appreciated. Thanks
0 Kudos
1 Reply
Altera_Forum
Honored Contributor II
511 Views

When you set write_enable high input data will be written to addressed location. Otherwise data is read from addressed location. What do you want to do with the ram?

0 Kudos
Reply