Download: ramtest.zip
This project tests the memory access actions of a simple computer. The load instruction (Opcode 0x01) reads data from a specified memory address into the accumulator. The store instruction (Opcode 0x04) writes data from the accumulator into a specified memory address.
Memory can be examined in the simulator after running the program by clicking on the Logical Memories section in the left column of the simulation report tree list.
ramtest.v
module ramtest(clock, reset, mem_address, mem_data_out, data_register, pc, write_enable); input clock, reset; output [15:0] mem_data_out; output [15:0] data_register; output [7:0] pc; output [7:0] mem_address; //output [2:0] state; reg [2:0] state; reg [15:0] data_register; reg [7:0] pc; reg [7:0] mem_address; reg [7:0] data_address; output write_enable; wire [7:0] opcode; assign opcode = mem_data_out[15:8]; parameter reset_pc = 3'd0, decode = 3'd1, execute = 3'd2, store1 = 3'd3, store2 = 3'd4; // instantiate memory (256 16-bit words) mem mem_component( .address (mem_address), .data (data_register), .inclock (clock), .wren (write_enable), .q (mem_data_out) ); //assign write_enable = (state==store1?clock:1'b0); // this fails assign write_enable = (state==store1); // this works always case (state) reset_pc: mem_address <= 8'h00; decode: mem_address <= mem_data_out[7:0]; execute: mem_address <= pc; store1: mem_address <= data_address; store2: mem_address <= pc; default: mem_address <= 8'hff; endcase // finite state machine always @(posedge clock, negedge reset) begin if (~reset) state<=reset_pc; else case (state) reset_pc : begin pc <= 8'h00; data_register <= 16'h0000; state <= decode; end // decode opcode, increment program counter decode : begin pc <= pc + 8'h01; data_address <= mem_data_out[7:0]; // decode opcode case (opcode) 8'h01 : // load state <= execute; 8'h04 : // store state <= store1; default: state <= decode; endcase end // execute instruction, setup instruction address execute : begin data_register <= mem_data_out; state <= decode; end store1 : state <= store2; store2 : state <= decode; // default state transition default : state <= decode; endcase end endmodule
mem.v
// megafunction wizard: %LPM_RAM_DQ% // GENERATION: STANDARD // VERSION: WM1.0 // MODULE: altsyncram // ============================================================ // File Name: mem.v // Megafunction Name(s): // altsyncram // ============================================================ // ************************************************************ // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! // // 6.0 Build 178 04/27/2006 SJ Full Version // ************************************************************ //Copyright (C) 1991-2006 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 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. // synopsys translate_off `timescale 1 ps / 1 ps // synopsys translate_on module mem ( address, data, inclock, wren, q); input [7:0] address; input [15:0] data; input inclock; input wren; output [15:0] q; wire [15:0] sub_wire0; wire [15:0] q = sub_wire0[15:0]; altsyncram altsyncram_component ( .wren_a (wren), .clock0 (inclock), .address_a (address), .data_a (data), .q_a (sub_wire0), .aclr0 (1'b0), .aclr1 (1'b0), .address_b (1'b1), .addressstall_a (1'b0), .addressstall_b (1'b0), .byteena_a (1'b1), .byteena_b (1'b1), .clock1 (1'b1), .clocken0 (1'b1), .clocken1 (1'b1), .data_b (1'b1), .q_b (), .rden_b (1'b1), .wren_b (1'b0)); defparam altsyncram_component.clock_enable_input_a = "BYPASS", altsyncram_component.clock_enable_output_a = "BYPASS", altsyncram_component.init_file = "ramtest.mif", altsyncram_component.intended_device_family = "Cyclone II", altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO", altsyncram_component.lpm_type = "altsyncram", altsyncram_component.numwords_a = 256, altsyncram_component.operation_mode = "SINGLE_PORT", altsyncram_component.outdata_aclr_a = "NONE", altsyncram_component.outdata_reg_a = "UNREGISTERED", altsyncram_component.power_up_uninitialized = "FALSE", altsyncram_component.widthad_a = 8, altsyncram_component.width_a = 16, altsyncram_component.width_byteena_a = 1; 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 "0" // 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 "0" // Retrieval info: PRIVATE: JTAG_ID STRING "NONE" // Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" // Retrieval info: PRIVATE: MIFfilename STRING "ramtest.mif" // Retrieval info: PRIVATE: NUMWORDS_A NUMERIC "256" // Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" // Retrieval info: PRIVATE: RegAddr NUMERIC "1" // Retrieval info: PRIVATE: RegData NUMERIC "1" // Retrieval info: PRIVATE: RegOutput NUMERIC "0" // Retrieval info: PRIVATE: SingleClock NUMERIC "0" // Retrieval info: PRIVATE: UseDQRAM NUMERIC "1" // Retrieval info: PRIVATE: WRCONTROL_ACLR_A NUMERIC "0" // Retrieval info: PRIVATE: WidthAddr NUMERIC "8" // Retrieval info: PRIVATE: WidthData NUMERIC "16" // Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS" // Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS" // Retrieval info: CONSTANT: INIT_FILE STRING "ramtest.mif" // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone II" // Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=NO" // Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" // Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "256" // Retrieval info: CONSTANT: OPERATION_MODE STRING "SINGLE_PORT" // Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" // Retrieval info: CONSTANT: OUTDATA_REG_A STRING "UNREGISTERED" // Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" // Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "8" // Retrieval info: CONSTANT: WIDTH_A NUMERIC "16" // Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" // Retrieval info: USED_PORT: address 0 0 8 0 INPUT NODEFVAL address[7..0] // Retrieval info: USED_PORT: data 0 0 16 0 INPUT NODEFVAL data[15..0] // Retrieval info: USED_PORT: inclock 0 0 0 0 INPUT NODEFVAL inclock // Retrieval info: USED_PORT: q 0 0 16 0 OUTPUT NODEFVAL q[15..0] // Retrieval info: USED_PORT: wren 0 0 0 0 INPUT NODEFVAL wren // Retrieval info: CONNECT: @address_a 0 0 8 0 address 0 0 8 0 // Retrieval info: CONNECT: q 0 0 16 0 @q_a 0 0 16 0 // Retrieval info: CONNECT: @clock0 0 0 0 0 inclock 0 0 0 0 // Retrieval info: CONNECT: @data_a 0 0 16 0 data 0 0 16 0 // Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0 // Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all // Retrieval info: GEN_FILE: TYPE_NORMAL mem.v TRUE // Retrieval info: GEN_FILE: TYPE_NORMAL mem.inc FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL mem.cmp FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL mem.bsf FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL mem_inst.v FALSE // Retrieval info: GEN_FILE: TYPE_NORMAL mem_bb.v TRUE
fit.summary
Fitter Status : Successful - Wed Jul 18 09:34:08 2007 Quartus II Version : 6.0 Build 178 04/27/2006 SJ Full Version Revision Name : ramtest Top-level Entity Name : ramtest Family : Cyclone II Device : EP2C35F672C6 Timing Models : Final Total logic elements : 59 / 33,216 ( < 1 % ) Total registers : 37 Total pins : 51 / 475 ( 11 % ) Total virtual pins : 0 Total memory bits : 4,096 / 483,840 ( < 1 % ) Embedded Multiplier 9-bit elements : 0 / 70 ( 0 % ) Total PLLs : 0 / 4 ( 0 % )
tan.summary
-------------------------------------------------------------------------------------- Timing Analyzer Summary -------------------------------------------------------------------------------------- Type : Worst-case tsu Slack : N/A Required Time : None Actual Time : 1.224 ns From : reset To : data_address[7] From Clock : -- To Clock : clock Failed Paths : 0 Type : Worst-case tco Slack : N/A Required Time : None Actual Time : 12.037 ns From : mem:mem_component|altsyncram:altsyncram_component|altsyncram_dgg1:auto_generated|ram_block1a0~porta_address_reg7 To : mem_address[3] From Clock : clock To Clock : -- Failed Paths : 0 Type : Worst-case th Slack : N/A Required Time : None Actual Time : 0.236 ns From : reset To : data_register[15]~reg0 From Clock : -- To Clock : clock Failed Paths : 0 Type : Clock Setup: 'clock' Slack : N/A Required Time : None Actual Time : 197.78 MHz ( period = 5.056 ns ) From : mem:mem_component|altsyncram:altsyncram_component|altsyncram_dgg1:auto_generated|ram_block1a0~porta_address_reg7 To : state.store1 From Clock : clock To Clock : clock Failed Paths : 0 Type : Total number of failed paths Slack : Required Time : Actual Time : From : To : From Clock : To Clock : Failed Paths : 0 --------------------------------------------------------------------------------------
Maintained by John Loomis, last updated Wed Jul 18 09:40:28 2007