Advertisement
nex036ara

rom2

Jan 22nd, 2012
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 3.63 KB | None | 0 0
  1. ----------------------------------------------------------------------------------
  2. -- Logicko projektovanje racunarskih sistema 1
  3. -- 2011/2012
  4. -- Lab 7
  5. --
  6. -- Instruction ROM
  7. --
  8. -- author: Branislav Nikolic
  9. ----------------------------------------------------------------------------------
  10.  
  11. library IEEE;
  12. use IEEE.STD_LOGIC_1164.ALL;
  13. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  14.  
  15. entity instr_rom is
  16.     Port ( iA : in  STD_LOGIC_VECTOR (4 downto 0);
  17.            oQ : out  STD_LOGIC_VECTOR (14 downto 0));
  18. end instr_rom;
  19.  
  20. architecture Behavioral of instr_rom is
  21.  
  22.     -- ALU instructions --
  23.     constant cMOV : std_logic_vector(5 downto 0) := "000000";
  24.     constant cADD : std_logic_vector(5 downto 0) := "000001";
  25.     constant cSUB : std_logic_vector(5 downto 0) := "000010";
  26.     constant cAND : std_logic_vector(5 downto 0) := "000011";
  27.     constant cOR : std_logic_vector(5 downto 0) := "000100";
  28.     constant cNOT : std_logic_vector(5 downto 0) := "000101";
  29.     constant cINC : std_logic_vector(5 downto 0) := "000110";
  30.     constant cDEC : std_logic_vector(5 downto 0) := "000111";
  31.     constant cSHL : std_logic_vector(5 downto 0) := "001000";
  32.     constant cSHR : std_logic_vector(5 downto 0) := "001001";
  33.     constant cASHL : std_logic_vector(5 downto 0) := "001010";
  34.     constant cASHR : std_logic_vector(5 downto 0) := "001011";
  35.      constant cJMP:  std_logic_vector(5 downto 0) :="010000";
  36.      constant cJMPZ:  std_logic_vector(5 downto 0) :="010001";
  37.      constant cJMPS:  std_logic_vector(5 downto 0) :="010010";
  38.     constant cJMC:  std_logic_vector(5 downto 0) :="010011";
  39.      constant cJMPNZ:  std_logic_vector(5 downto 0) :="010101";
  40.      constant cJMPNS:  std_logic_vector(5 downto 0) :="010110";
  41.     constant cJMNC:  std_logic_vector(5 downto 0) :="010111";
  42.      
  43.     -- Other instructions --
  44.     constant cLD : std_logic_vector(5 downto 0) := "100000";
  45.     constant cST : std_logic_vector(5 downto 0) := "110000";
  46.    
  47.     -- Registers --
  48.     constant cR0 : std_logic_vector(2 downto 0) := "000";
  49.     constant cR1 : std_logic_vector(2 downto 0) := "001";
  50.     constant cR2 : std_logic_vector(2 downto 0) := "010";
  51.     constant cR3 : std_logic_vector(2 downto 0) := "011";
  52.     constant cR4 : std_logic_vector(2 downto 0) := "100";
  53.     constant cR5 : std_logic_vector(2 downto 0) := "101";
  54.     constant cR6 : std_logic_vector(2 downto 0) := "110";
  55.     constant cR7 : std_logic_vector(2 downto 0) := "111";  
  56.     constant cRX : std_logic_vector(2 downto 0) := "---"; -- reg field not used
  57.    
  58. begin
  59.  process(iA)begin
  60.     case (iA)is
  61.                    
  62. --definition parameters:
  63.     when "00000"=>  oQ<= cLD &cR1 &cRX &cR1;
  64.     when "00001" =>         oQ<= cLD &cR2 &cRX &cR2;
  65.     when "00010" =>         oQ<= cLD &cR3 &cRX &cR3;
  66.     when"00011" =>      oQ<= cINC &cR1 &cR1 &cRX;
  67.     when"00100" =>      oQ<= cASHL &cR1 &cR1 &cRX;
  68.     when "00101" =>         oQ<= cASHL &cR1 &cR1 &cRX; --R1=4
  69.     when "00110" =>         oQ<= cINC &cR2 &cR2 &cRX; --R2=1
  70.     when "00111" =>         oQ<= cINC &cR3 &cR3 &cRX;
  71.     when "01000" =>         oQ<= cASHL &cR3 &cR3 &cRX;
  72.     when "01001"=>      oQ<= cASHL &cR3 &cR3 &cRX;
  73.     when "01010"=>      oQ<= cASHL &cR3 &cR3 &cRX;
  74.     when "01011"=>      oQ<= cDEC &cR3 &cR3 &cRX; --R3=7
  75.            
  76. --loop:
  77.     when "01100"=>      oQ<= cSUB &cR0 &cR2 &cR1;
  78.     when "01101"=>              oQ<= cJMPS &"000010000";
  79. --do_if_true(R4<-7)
  80.         when "01110"=>  oQ<= cMOV &cR4 &cR3 &cRX;
  81.         when "01111" =>     oQ<= cJMP &"000010011";
  82. --do_if_false
  83.         when "10000" => oQ<= cDEC &cR1 &cR1 &cRX;
  84.         when "10001" => oQ<= cINC &cR2 &cR2 &cRX;
  85.         when "10010"=>  oQ<= cJMP &"000001100"; --jmp to loop
  86. --end(anything stupid)         
  87.         when "10011"=> oQ<= cMOV &cR0 &cR0 &cRX;
  88.        
  89.     when others => oQ<= (others => '0');
  90.  
  91.     end case;
  92. end process;     
  93.          
  94.  
  95. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement