--This module implements an algorithm for adding 12 iteregers 
--stored in MEM[256]-MEM[268]
--solution stored in R3

--This program was taken from "Introduction to Computing Systems"
--by Yale Patt and Sanjay Patel page 104

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.std_logic_arith.all;

entity ram_module is
   port(clk		: in std_logic;
      enable		: in std_logic;
      R_W			: in std_logic;
      addr		: in std_logic_vector (15 downto 0);  
      data_in		: in std_logic_vector (15 downto 0);	
      data_out	: out std_logic_vector (15 downto 0));

end ram_module;	


architecture BHV of ram_module is	   


type memory is array (0 to 334) of std_logic_vector(15 downto 0);

signal reg : memory := (


   "1110001100000000",		--LEA R1 x0100 
   "0101011011100000",		--AND R3 x0000
   "0101010010100000",		--AND R2 x0000
   "0001010010101100",		--ADD R2 R2 x000C
   "0000010000001010",		--BRz x000A
   "0110100001000000",		--LDR R4 R1
   "0001011011000100",		--ADD R3 R3 R4
   "0001001001100001",		--ADD R1 R1 x0001
   "0001010010111111",		--ADD R2 R2 x1111
   "0000111000000100",		--BRnzp x0004			
   "1111111111111111",		--HALT
   "0000000000000000",	
   "0000000000000000",	
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		--15
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		--30
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		--45
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		--60
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		--75
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		--90
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000001",
   "0000000000000001",
   "0000000000000001",
   "0000000000000001",
   "0000000000000001",
   "0000000000000001",		--105
   "0000000000000001",
   "0000000000000001",
   "0000000000000001",
   "0000000000000001",
   "0000000000000001",
   "0000000000000001",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		--120
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",						 	
   "0000000000000000",		
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",		
   "0000000000000000",		
   "0000000000000000",		
   "0000000000000000",					
   "0000000000000000",		
   "0000000000000000",		
   "0000000000000000",	  
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000001",
   "0000000000000001",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",						 	
   "0000000000000000",		
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",		
   "0000000000000000",		
   "0000000000000000",		
   "0000000000000000",					
   "0000000000000000",		
   "0000000000000000",		
   "0000000000000000",	  
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000001",		--interger
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",		
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000000",
   "0000000000000001",
   "0000000000000001"
);	 

begin
   process(clk, enable, R_W, addr)
   begin
	
   if (enable = '1') then
      if (clk = '1' and clk' event) then 	
         if (R_W = '1') then
            data_out <= reg(conv_integer(addr));
         else
            reg(conv_integer(addr)) <=  data_in;
         end if;	
      else 
      end if;	
   end if;
			
end process;
end BHV;