Advertisement
coletucker12

lab6code

Nov 11th, 2019
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 7.58 KB | None | 0 0
  1. -- CPU_2214 TESTBENCH
  2. library ieee;
  3. use ieee.std_logic_1164.all;
  4.  
  5.  
  6. entity CPU_2214_Test is
  7. end entity CPU_2214_Test;
  8.  
  9.  
  10. architecture mixed of CPU_2214_Test is
  11.     constant tick : time := 100 ns;
  12.     signal reset, clock : std_logic;
  13.     signal instruction : std_logic_vector(0 to 15);
  14.      signal sout : std_logic_vector(15 downto 0);
  15. begin
  16.     CPU_2214_Sim : entity work.CPU_2214
  17.         port map(
  18.             clk     => clock,
  19.             clear   => reset,
  20.             instruction => instruction,
  21.                 sout => sout
  22.         );
  23.  
  24.     driver : process is
  25.     begin
  26.         -- reset the system
  27.         reset <= '0'; instruction <= x"0000"; wait for 50 ns;
  28.         reset <= '1';
  29.  
  30.         -- ADD r2, r1, r1  
  31.         instruction <= x"0211"; wait for tick;
  32.  
  33.         -- ADDI r3, r2, 5  
  34.         instruction <= x"4325"; wait for tick;
  35.  
  36.         -- SUB r4, r3, r2  
  37.         instruction <= x"1432"; wait for tick;
  38.  
  39.         -- SUBI r5, r4, -4  
  40.         instruction <= x"5544"; wait for tick;
  41.  
  42.         -- AND r6, r3, r5  
  43.         instruction <= x"2635"; wait for tick;
  44.  
  45.         -- OR r7, r5, r4    
  46.         instruction <= x"3754"; wait for tick;
  47.  
  48.         wait;
  49.     end process driver;
  50.  
  51.     clock_p : process is
  52.     begin
  53.         for i in 0 to 18 loop
  54.             clock <= '1'; wait for tick/2;
  55.             clock <= '0'; wait for tick/2;
  56.         end loop;
  57.         wait;
  58.     end process clock_p;
  59. end architecture mixed;
  60. ---------------------------------------------------------------------------------------------------------------------------------------
  61. -- SIGN EXTEND
  62. library ieee;
  63. use ieee.std_logic_1164.all;
  64. use ieee.std_logic_unsigned.all;
  65.  
  66. Entity Signextend is
  67.     port(
  68.         immIn           :   in      std_logic_vector( 3 downto 0);
  69.         immOut      :   out std_logic_vector(15 downto 0)
  70.         );
  71. End Signextend;
  72.  
  73. architecture syn of Signextend is
  74.  
  75. begin
  76.     immOut(0)   <=  immIn(0);
  77.     immOut(1)   <=  immIn(1);
  78.     immOut(2)   <=  immIn(2);
  79.     immOut(3)   <=  immIn(3);
  80.     immOut(4)   <=  immIn(3);
  81.     immOut(5)   <=  immIn(3);
  82.     immOut(6)   <=  immIn(3);
  83.     immOut(7)   <=  immIn(3);
  84.     immOut(8)   <=  immIn(3);
  85.     immOut(9)   <=  immIn(3);
  86.     immOut(10)  <=  immIn(3);
  87.     immOut(11)  <=  immIn(3);
  88.     immOut(12)  <=  immIn(3);
  89.     immOut(13)  <=  immIn(3);
  90.     immOut(14)  <=  immIn(3);
  91.     immOut(15)  <=  immIn(3);
  92. end syn;
  93. ---------------------------------------------------------------------------------------------------------------------------------------
  94. -- CONTROL
  95. library ieee;
  96. use ieee.std_logic_1164.all;
  97. use ieee.std_logic_unsigned.all;
  98.  
  99. Entity Control is
  100.     port(
  101.         op          :   in  std_logic_vector( 3 downto 0);
  102.         alu_op      :   out std_logic_vector( 1 downto 0);
  103.         alu_src     :   out std_logic
  104.         );
  105. End Control;
  106.  
  107. architecture syn of Control is
  108.  
  109. begin
  110.     process (op) is
  111.     begin
  112.         case op is
  113.  
  114.             -- op=0, ADD
  115.             when x"0" =>
  116.                 alu_op      <=  "00";
  117.                 alu_src     <=  '0';
  118.  
  119.             -- op=1, SUB
  120.             when x"1" =>
  121.                 alu_op      <=  "01";
  122.                 alu_src     <=  '0';
  123.        
  124.  
  125.             -- op=2, AND
  126.             when x"2" =>
  127.                 alu_op      <= "10";
  128.                 alu_src     <= '0';
  129.  
  130.             -- op=3, OR
  131.             when x"3" =>
  132.                 alu_op      <=  "11";
  133.                 alu_src     <= '0';
  134.            
  135.  
  136.             -- op=4, ADDi
  137.             when x"4" =>
  138.                 alu_op      <= "00";
  139.                 alu_src     <= '1';
  140.                
  141.  
  142.             -- op=5, SUBi
  143.             when x"5" =>
  144.                 alu_op      <= "01";
  145.                 alu_src     <= '1';
  146.  
  147.             -- op=8, LW
  148.             -- Not for this lab
  149.  
  150.             -- op=C, SW
  151.             -- Not for this lab
  152.    
  153.             -- op=7, SLT
  154.             -- Not for this lab
  155.  
  156.             when others =>
  157.                 alu_op  <=  "00";
  158.                 alu_src <=  '0';               
  159.  
  160.         end case;
  161.     end process;
  162. end syn;
  163. ---------------------------------------------------------------------------------------------------------------------------------------
  164. -- CPU 2214 MODULE
  165.  
  166. library IEEE;
  167. use IEEE.STD_LOGIC_1164.ALL;
  168. use ieee.std_logic_arith.all;
  169. use ieee.std_logic_unsigned.all;
  170.  
  171.  
  172. entity CPU_2214 is
  173.     port(
  174.         clk : in std_logic;
  175.         clear : in std_logic;
  176.         instruction : in std_logic_vector(15 downto 0);
  177.         sout       : out std_logic_vector(15 downto 0)
  178.     );
  179. end CPU_2214;
  180.  
  181. architecture Behavioral of CPU_2214 is
  182.     COMPONENT ALU_16Bit
  183.         port(  
  184.         A       :   in      std_logic_vector(15 downto 0);
  185.         B       :   in      std_logic_vector(15 downto 0);
  186.         S       :   in      std_logic_vector(1 downto 0);
  187.         Sout    :   out     std_logic_vector(15 downto 0);
  188.         Cout    :   out std_logic
  189.         );
  190.     END COMPONENT;
  191.    
  192.     COMPONENT Registers
  193.         port(
  194.         clk :   in   std_logic;
  195.         clear   :   in  std_logic;
  196.        
  197.         a_addr: in   std_logic_vector( 3 downto 0);
  198.         a_data: in   std_logic_vector(15 downto 0);
  199.         load    :   in   std_logic;
  200.        
  201.         b_addr: in   std_logic_vector( 3 downto 0);
  202.         c_addr: in   std_logic_vector( 3 downto 0);
  203.        
  204.         b_data: out std_logic_vector(15 downto 0);
  205.         c_data: out std_logic_vector(15 downto 0)
  206.         );
  207.     END COMPONENT;
  208.  
  209.     COMPONENT Control
  210.         port(
  211.         op              :   in  std_logic_vector( 3 downto 0);
  212.         alu_op      :   out std_logic_vector( 1 downto 0);
  213.         alu_src     :   out std_logic
  214.         );
  215.     end component;
  216.  
  217.     component Signextend
  218.         port(
  219.         immIn           :   in  std_logic_vector( 3 downto 0);
  220.         immOut      :   out std_logic_vector(15 downto 0)
  221.         );
  222.     end component;
  223.  
  224.     component mux2_1
  225.    generic (WIDTH : positive:=16);
  226.     port(
  227.         Input1      :   in      std_logic_vector(WIDTH-1    downto 0);
  228.         Input2      :   in      std_logic_vector(WIDTH-1    downto 0);
  229.         S               :   in      std_logic;
  230.         Sout            :   out std_logic_vector(WIDTH-1    downto 0));
  231.     end component;
  232.  
  233.     -- Signals
  234.     signal  op                      :   std_logic_vector( 3 downto 0)   ;
  235.     signal  rd                      :   std_logic_vector( 3 downto 0)   ;
  236.     signal  rs                      :   std_logic_vector( 3 downto 0)   ;
  237.     signal  rt                      :   std_logic_vector( 3 downto 0)   ;
  238.     signal  sout_alu                :   std_logic_vector(15 downto 0)   ;
  239.     signal  cout                    :   std_logic                           ;
  240.     signal  rs_data             :   std_logic_vector(15 downto 0)   ;
  241.     signal  rt_data             :   std_logic_vector(15 downto 0)   ;
  242.     signal ctrl_alu_op    : std_logic_vector(1 downto 0);
  243.     signal ctrl_alu_src   : std_logic;
  244.     signal sign_out       : std_logic_vector(15 downto 0);
  245.     signal mux_out        : std_logic_vector(15 downto 0);
  246.  
  247.     -- more signals
  248.  
  249. begin
  250.     --------------------------------------------------------------------------
  251.     -- Instruction Fetch
  252.     --------------------------------------------------------------------------
  253.     op      <=  instruction(15 downto 12);
  254.     rd      <= instruction(11 downto  8);
  255.     rs      <= instruction(7  downto  4);
  256.     rt      <= instruction(3  downto  0);
  257.     --------------------------------------------------------------------------
  258.     -- Instruction Decode
  259.     --------------------------------------------------------------------------
  260.     CPU_Control_0:          Control port map(
  261.         op          =>  op,
  262.         alu_op  =>  ctrl_alu_op,
  263.         alu_src =>  ctrl_alu_src
  264.     );
  265.  
  266.     CPU_Registers_0:        Registers port map(
  267.         clk     =>  clk,
  268.         clear       =>  clear,
  269.        
  270.         a_addr  =>  rd,
  271.         a_data  =>  sout_alu,
  272.         load        =>  '1',
  273.        
  274.         b_addr  =>  rs,
  275.         c_addr  =>  rt,
  276.        
  277.         b_data  =>  rs_data,
  278.         c_data  =>  rt_data
  279.     );
  280.  
  281.     CPU_signextend_0:       Signextend port map(
  282.         immIn       =>  rt,
  283.         immOut  =>  sign_out
  284.     ); 
  285.  
  286.     --------------------------------------------------------------------------
  287.     -- Execute
  288.     --------------------------------------------------------------------------
  289.     CPU_alu_src_mux:        mux2_1 generic map(16) port map(
  290.         Input1  => rt_data,
  291.         Input2  =>  sign_out,
  292.         S           =>  ctrl_alu_src,
  293.         Sout        =>  mux_out
  294.     );
  295.    
  296.     CPU_ALU_0:              ALU_16Bit port map(
  297.         A           =>  rs_data,
  298.         B           =>  mux_out,
  299.         S           =>  ctrl_alu_op,
  300.         Sout        =>  sout_alu,
  301.         Cout        =>  cout
  302.     );
  303.    
  304.     sout <= sout_alu;
  305.  
  306.     --------------------------------------------------------------------------
  307.     -- Memory
  308.     --------------------------------------------------------------------------
  309.  
  310.     -- Not for this lab
  311.  
  312.     --------------------------------------------------------------------------
  313.     -- Write Back
  314.     --------------------------------------------------------------------------
  315.  
  316.     -- Not for this lab
  317.  
  318. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement