coletucker12

lab7code

Nov 20th, 2019
551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 10.15 KB | None | 0 0
  1. --- CONTROL ---
  2. library ieee;
  3. use ieee.std_logic_1164.all;
  4. use ieee.std_logic_unsigned.all;
  5.  
  6. Entity Control is
  7.     port(
  8.         op              :   in  std_logic_vector( 3 downto 0);
  9.         alu_op      :   out std_logic_vector( 1 downto 0);
  10.         alu_src     :   out std_logic;
  11.         reg_dest        :   out std_logic;
  12.         reg_load        :   out std_logic;
  13.         reg_src     :   out std_logic_vector(1 downto 0);
  14.         mem_read        :   out std_logic;
  15.         mem_write   :   out std_logic
  16.         );
  17. End Control;
  18.  
  19. architecture syn of Control is
  20.  
  21. begin
  22.     process (op) is
  23.     begin
  24.         case op is
  25.  
  26.             -- op=0, ADD
  27.             when x"0" =>
  28.                 alu_op      <=  "00";
  29.                 alu_src     <=  '0';
  30.                 reg_dest        <=  '0';
  31.                 reg_load        <=  '1';
  32.                 reg_src     <=  "01";
  33.                 mem_read        <=  '0';
  34.                 mem_write   <=  '0';
  35.  
  36.             -- op=1, SUB
  37.             when x"1" =>
  38.                 alu_op      <=  "01";
  39.                 alu_src     <=  '0';
  40.                 reg_dest        <=  '0';
  41.                 reg_load        <=  '1';
  42.                 reg_src     <=  "01";
  43.                 mem_read        <=  '0';
  44.                 mem_write   <=  '0';
  45.  
  46.             -- op=2, AND
  47.             when x"2" =>
  48.                 alu_op      <=  "10";
  49.                 alu_src     <=  '0';
  50.                 reg_dest        <=  '0';
  51.                 reg_load        <=  '1';
  52.                 reg_src     <=  "01";
  53.                 mem_read        <=  '0';
  54.                 mem_write   <=  '0';
  55.  
  56.             -- op=3, OR
  57.             when x"3" =>
  58.                 alu_op      <=  "11";
  59.                 alu_src     <=  '0';
  60.                 reg_dest        <=  '0';
  61.                 reg_load        <=  '1';
  62.                 reg_src     <=  "01";
  63.                 mem_read        <=  '0';
  64.                 mem_write   <=  '0';
  65.  
  66.             -- op=4, ADDi
  67.             when x"4" =>
  68.                 alu_op      <=  "00";
  69.                 alu_src     <=  '1';
  70.                 reg_dest        <=  '0';
  71.                 reg_load        <=  '1';
  72.                 reg_src     <=  "01";
  73.                 mem_read        <=  '0';
  74.                 mem_write   <=  '0';
  75.  
  76.             -- op=5, SUBi
  77.             when x"5" =>
  78.                 alu_op      <=  "01";
  79.                 alu_src     <=  '1';
  80.                 reg_dest        <=  '0';
  81.                 reg_load        <=  '1';
  82.                 reg_src     <=  "01";
  83.                 mem_read        <=  '0';
  84.                 mem_write   <=  '0';
  85.  
  86.             -- op=8, LW
  87.             when x"8" =>
  88.                 alu_op      <=  "00";
  89.                 alu_src     <=  '1';
  90.                 reg_dest        <=  '0';
  91.                 reg_load        <=  '1';
  92.                 reg_src     <=  "00";
  93.                 mem_read        <=  '1';
  94.                 mem_write   <=  '0';
  95.  
  96.             -- op=C, SW
  97.             when x"C" =>
  98.                 alu_op      <=  "00";
  99.                 alu_src     <=  '1';
  100.                 reg_dest        <=  '1';
  101.                 reg_load        <=  '0';
  102.                 reg_src     <=  "01";
  103.                 mem_read        <=  '0';
  104.                 mem_write   <=  '1';
  105.    
  106.             -- op=7, SLT
  107.  
  108.             -- Not for this lab
  109.  
  110.  
  111.             when others =>
  112.                 alu_op  <=  "00";
  113.                 alu_src <=  '0';               
  114.                 reg_dest    <=  '0';
  115.                 reg_load    <=  '0';
  116.                 reg_src <=  "01";
  117.                 mem_read    <=  '0';
  118.                 mem_write<= '0';
  119.  
  120.         end case;
  121.     end process;
  122. end syn;
  123. --- CONTROL END ---
  124.  
  125. --- CPU_2214 ---
  126.  
  127. library IEEE;
  128. use IEEE.STD_LOGIC_1164.ALL;
  129. use ieee.std_logic_arith.all;
  130. use ieee.std_logic_unsigned.all;
  131.  
  132.  
  133. entity CPU_2214 is
  134.     port(
  135.         clk : in std_logic;
  136.         clear : in std_logic;
  137.         mem_dump : in std_logic := '0';
  138.         instruction : in std_logic_vector(15 downto 0)
  139.     );
  140. end CPU_2214;
  141.  
  142. architecture Behavioral of CPU_2214 is
  143.     COMPONENT ALU_16Bit
  144.         port(  
  145.             A           :   in      std_logic_vector(15 downto 0);
  146.             B           :   in      std_logic_vector(15 downto 0);
  147.             S           :   in      std_logic_vector(1 downto 0);
  148.             Sout        :   out     std_logic_vector(15 downto 0);
  149.             Cout        :   out std_logic
  150.         );
  151.     END COMPONENT;
  152.    
  153.     COMPONENT Registers
  154.         port(
  155.             clk         :   in   std_logic;
  156.             clear           :   in  std_logic;
  157.            
  158.             a_addr      :   in   std_logic_vector( 3 downto 0);
  159.             a_data      :   in   std_logic_vector(15 downto 0);
  160.             load            :   in   std_logic;
  161.            
  162.             b_addr      :   in   std_logic_vector( 3 downto 0);
  163.             c_addr      :   in   std_logic_vector( 3 downto 0);
  164.            
  165.             b_data      :   out std_logic_vector(15 downto 0);
  166.             c_data      :   out std_logic_vector(15 downto 0)
  167.         );
  168.     END COMPONENT;
  169.  
  170.     COMPONENT Control
  171.         port(
  172.             op              :   in  std_logic_vector( 3 downto 0);
  173.             alu_op      :   out std_logic_vector( 1 downto 0);
  174.             alu_src     :   out std_logic;
  175.             reg_dest        :   out std_logic;
  176.             reg_load        :   out std_logic;
  177.             reg_src     :   out std_logic_vector( 1 downto 0);
  178.             mem_read        :   out std_logic;
  179.             mem_write   :   out std_logic
  180.         );
  181.     end component;
  182.  
  183.     component Signextend
  184.         port(
  185.             immIn           :   in  std_logic_vector( 3 downto 0);
  186.             immOut      :   out std_logic_vector(15 downto 0)
  187.         );
  188.     end component;
  189.  
  190.     component mux3_1
  191.    generic (WIDTH : positive:=16);
  192.     port(
  193.         Input1      :   in      std_logic_vector(WIDTH-1    downto 0);
  194.         Input2      :   in      std_logic_vector(WIDTH-1    downto 0);
  195.         Input3      :   in      std_logic_vector(WIDTH-1    downto 0);
  196.         S               :   in      std_logic_vector(1          downto 0);
  197.         Sout            :   out std_logic_vector(WIDTH-1    downto 0));
  198.     end component;
  199.  
  200.     component mux2_1
  201.    generic (WIDTH : positive:=16);
  202.     port(
  203.         Input1      :   in      std_logic_vector(WIDTH-1    downto 0);
  204.         Input2      :   in      std_logic_vector(WIDTH-1    downto 0);
  205.         S               :   in      std_logic;
  206.         Sout            :   out std_logic_vector(WIDTH-1    downto 0));
  207.     end component;
  208.  
  209.  
  210.     component Memory
  211.    generic (
  212.        INPUT : string := "in.txt";
  213.        OUTPUT : string := "out.txt"
  214.    );
  215.     port (
  216.         clk             : in std_logic;  
  217.         read_en         : in std_logic;
  218.         write_en        : in std_logic;
  219.         addr            : in std_logic_vector(15 downto 0);
  220.         data_in         : in std_logic_vector(15 downto 0);
  221.         data_out        : out std_logic_vector(15 downto 0);
  222.         mem_dump        : in std_logic := '0'
  223.     );
  224.     end component;
  225.     -- Signals
  226.     signal   op                     :   std_logic_vector( 3 downto 0)   ;
  227.     signal  rd                      :   std_logic_vector( 3 downto 0)   ;
  228.     signal  rs                      :   std_logic_vector( 3 downto 0)   ;
  229.     signal  rt                      :   std_logic_vector( 3 downto 0)   ;
  230.    
  231.     signal  alu_result          :   std_logic_vector(15 downto 0)   ;
  232.     signal  cout                    :   std_logic                           ;
  233.     signal  alu_src_mux_out :   std_logic_vector(15 downto 0)   ;
  234.     signal  sign_ex_out         :   std_logic_vector(15 downto 0)   ;
  235.     signal  rs_data             :   std_logic_vector(15 downto 0)   ;
  236.     signal  rt_data             :   std_logic_vector(15 downto 0)   ;
  237.     signal  reg_dest_mux_out    :   std_logic_vector( 3 downto 0)   ;
  238.     signal  reg_src_mux_out :   std_logic_vector(15 downto 0)   ;
  239.     signal  mem_dataout         :   std_logic_vector(15 downto 0)   ;
  240.  
  241.     signal  ctrl_alu_src        :   std_logic                           ;
  242.     signal  ctrl_alu_op         :   std_logic_vector( 1 downto 0)   ;
  243.     signal  ctrl_reg_dest       :   std_logic                           ;
  244.     signal  ctrl_reg_src        :   std_logic_vector( 1 downto 0)   ;
  245.     signal  ctrl_reg_load       :   std_logic                           ;
  246.     signal  ctrl_mem_read       :   std_logic                           ;
  247.     signal  ctrl_mem_write      :   std_logic                           ;
  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              =>      instruction(15 downto 12),
  262.         alu_op      =>      ctrl_alu_op,
  263.         alu_src     =>      ctrl_alu_src,
  264.         reg_dest        =>      ctrl_reg_dest,
  265.         reg_load        =>      ctrl_reg_load,
  266.         reg_src     =>      ctrl_reg_src,
  267.         mem_read        =>      ctrl_mem_read,
  268.         mem_write   =>      ctrl_mem_write
  269.     );
  270.    
  271.     CPU_reg_dest_mux:       mux2_1 generic map(4) port map(
  272.         Input1      =>      rt,
  273.         Input2      =>      rd,
  274.         S               =>      ctrl_reg_dest,
  275.         Sout            =>      reg_dest_mux_out
  276.     );
  277.    
  278.     CPU_signextend_0:       Signextend port map(
  279.         immIn           =>      rt,
  280.         immOut      =>      sign_ex_out
  281.     ); 
  282.    
  283.     CPU_Registers_0:        Registers port map(
  284.         clk         =>      clk,
  285.         clear           =>      clear,
  286.         a_addr      =>      rd,
  287.         a_data      =>      reg_src_mux_out,
  288.         load            =>      ctrl_reg_load,
  289.         b_addr      =>      rs,
  290.         c_addr      =>      reg_dest_mux_out,
  291.         b_data      =>      rs_data,
  292.         c_data      =>      rt_data
  293.     );
  294.  
  295.     --------------------------------------------------------------------------
  296.     -- Execute
  297.     --------------------------------------------------------------------------
  298.     CPU_alu_src_mux:        mux2_1 generic map(16) port map(
  299.         Input1      =>      rt_data,
  300.         Input2      =>      sign_ex_out,
  301.         S               =>      ctrl_alu_src,
  302.         Sout            =>      alu_src_mux_out
  303.     );
  304.    
  305.     CPU_ALU_0:              ALU_16Bit port map(
  306.         A               =>      rs_data,
  307.         B               =>      alu_src_mux_out,
  308.         S               =>      ctrl_alu_op,
  309.         Sout            =>      alu_result,
  310.         Cout            =>      cout
  311.     );
  312.  
  313.     --------------------------------------------------------------------------
  314.     -- Memory
  315.     --------------------------------------------------------------------------
  316.     CPU_MEM_0:Memory port map(
  317.         clk         =>      clk,
  318.         read_en     =>      ctrl_mem_read,
  319.         write_en        =>      ctrl_mem_write,
  320.         addr            =>      alu_result,
  321.         data_in     =>      rt_data,
  322.         data_out        =>      mem_dataout,
  323.         mem_dump    =>      '0'
  324.     );
  325.  
  326.     --------------------------------------------------------------------------
  327.     -- Write Back
  328.     --------------------------------------------------------------------------
  329.     CPU_reg_src_mux:        mux3_1 generic map(16) port map(
  330.         Input1      =>      mem_dataout,
  331.         Input2      =>      alu_result,
  332.         Input3      =>      x"0000",
  333.         S               =>      ctrl_reg_src,
  334.         Sout            =>      reg_src_mux_out
  335.     );
  336.  
  337. end Behavioral;
  338. --- CPU_2214 END ---
  339.  
  340. --- CPU_2214_TB ---
  341. library ieee;
  342. use ieee.std_logic_1164.all;
  343.  
  344.  
  345. entity CPU_2214_Test is
  346. end entity CPU_2214_Test;
  347.  
  348.  
  349.     architecture mixed of CPU_2214_Test is
  350.     constant tick : time := 100 ns;
  351.     signal reset, clock : std_logic;
  352.      signal mem_dump : std_logic := '0';
  353.     signal instruction : std_logic_vector(0 to 15);
  354. begin
  355.     uut : entity work.CPU_2214
  356.         port map(
  357.             clk     => clock,
  358.             clear   => reset,
  359.             instruction => instruction,
  360.                 mem_dump    => mem_dump
  361.         );
  362.  
  363.     driver : process is
  364.     begin
  365.         -- reset the system
  366.         reset <= '0'; instruction <= x"0000"; wait for 50 ns;
  367.         reset <= '1';
  368.          
  369.           -- ADDI r3, r0, 5   (r3 = 5)
  370.         instruction <= x"4305"; wait for tick;
  371.  
  372.         -- ADDI r4, r0, 2   (r4 = 2)
  373.         instruction <= x"4402"; wait for tick;
  374.  
  375.         -- SW r3, 0(r0)     (M[0] = 5)
  376.         instruction <= x"C300"; wait for tick;
  377.  
  378.         -- SW r4, 4(r0)     (M[4] = 2)
  379.         instruction <= x"C404"; wait for tick;
  380.  
  381.         -- ADDI r6, r0, 4   (r6 = 4)
  382.         instruction <= x"4604"; wait for tick;
  383.  
  384.         -- LW r7, 0(r6)     (r7 = 2)
  385.         instruction <= x"8760"; wait for tick;
  386.  
  387.         -- LW r8, 0(r0)     (r8 = 5)
  388.         instruction <= x"8800"; wait for tick;
  389.          
  390.           -- ADD r9,r7,r8     (r9 = 7)
  391.         instruction <= x"0978"; wait for tick;
  392.         wait;
  393.     end process driver;
  394.  
  395.     clock_p : process is
  396.     begin
  397.         for i in 0 to 50 loop
  398.             clock <= '1'; wait for tick/2;
  399.             clock <= '0'; wait for tick/2;
  400.         end loop;
  401.         wait;
  402.     end process clock_p;
  403. end architecture mixed;
  404. --- CPU_2214_TB END ---
Advertisement
Add Comment
Please, Sign In to add comment