Advertisement
coletucker12

lab8code

Nov 20th, 2019
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 10.56 KB | None | 0 0
  1. --- CONTROL START ---
  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.             when x"7" =>
  108.                 alu_op      <=  "01";
  109.                 alu_src     <=  '0';
  110.                 reg_dest        <=  '0';
  111.                 reg_load        <=  '1';
  112.                 reg_src     <=  "11";
  113.                 mem_read        <=  '0';
  114.                 mem_write   <=  '0';
  115.  
  116.             when others =>
  117.                 alu_op  <=  "00";
  118.                 alu_src <=  '0';               
  119.                 reg_dest    <=  '0';
  120.                 reg_load    <=  '0';
  121.                 reg_src <=  "01";
  122.                 mem_read    <=  '0';
  123.                 mem_write<= '0';
  124.  
  125.         end case;
  126.     end process;
  127. end syn;
  128. --- CONTROL END ---
  129.  
  130. --- CPU_2214 START ---
  131.  
  132. library IEEE;
  133. use IEEE.STD_LOGIC_1164.ALL;
  134. use ieee.std_logic_arith.all;
  135. use ieee.std_logic_unsigned.all;
  136.  
  137.  
  138. entity CPU_2214 is
  139.     port(
  140.         clk : in std_logic;
  141.         clear : in std_logic;
  142.         mem_dump : in std_logic := '0';
  143.         instruction : in std_logic_vector(15 downto 0)
  144.     );
  145. end CPU_2214;
  146.  
  147. architecture Behavioral of CPU_2214 is
  148.     COMPONENT ALU_16Bit
  149.         port(  
  150.             A           :   in      std_logic_vector(15 downto 0);
  151.             B           :   in      std_logic_vector(15 downto 0);
  152.             S           :   in      std_logic_vector(1 downto 0);
  153.             Sout        :   out     std_logic_vector(15 downto 0);
  154.             Cout        :   out std_logic
  155.         );
  156.     END COMPONENT;
  157.    
  158.     COMPONENT Registers
  159.         port(
  160.             clk         :   in   std_logic;
  161.             clear       :   in  std_logic;
  162.            
  163.             a_addr      :   in   std_logic_vector( 3 downto 0);
  164.             a_data      :   in   std_logic_vector(15 downto 0);
  165.             load        :   in   std_logic;
  166.            
  167.             b_addr      :   in   std_logic_vector( 3 downto 0);
  168.             c_addr      :   in   std_logic_vector( 3 downto 0);
  169.            
  170.             b_data      :   out std_logic_vector(15 downto 0);
  171.             c_data      :   out std_logic_vector(15 downto 0)
  172.         );
  173.     END COMPONENT;
  174.  
  175.     COMPONENT Control
  176.         port(
  177.             op          :   in  std_logic_vector( 3 downto 0);
  178.             alu_op      :   out std_logic_vector( 1 downto 0);
  179.             alu_src     :   out std_logic;
  180.             reg_dest    :   out std_logic;
  181.             reg_load    :   out std_logic;
  182.             reg_src     :   out std_logic_vector( 1 downto 0);
  183.             mem_read    :   out std_logic;
  184.             mem_write   :   out std_logic
  185.         );
  186.     end component;
  187.  
  188.     component Signextend
  189.         port(
  190.             immIn       :   in  std_logic_vector( 3 downto 0);
  191.             immOut      :   out std_logic_vector(15 downto 0)
  192.         );
  193.     end component;
  194.  
  195.     component mux3_1
  196.    generic (WIDTH : positive:=16);
  197.     port(
  198.         Input1      :   in      std_logic_vector(WIDTH-1    downto 0);
  199.         Input2      :   in      std_logic_vector(WIDTH-1    downto 0);
  200.         Input3      :   in      std_logic_vector(WIDTH-1    downto 0);
  201.         S               :   in      std_logic_vector(1          downto 0);
  202.         Sout            :   out std_logic_vector(WIDTH-1    downto 0));
  203.     end component;
  204.  
  205.     component mux2_1
  206.    generic (WIDTH : positive:=16);
  207.     port(
  208.         Input1      :   in      std_logic_vector(WIDTH-1    downto 0);
  209.         Input2      :   in      std_logic_vector(WIDTH-1    downto 0);
  210.         S               :   in      std_logic;
  211.         Sout            :   out std_logic_vector(WIDTH-1    downto 0));
  212.     end component;
  213.  
  214.  
  215.     component Memory
  216.    generic (
  217.        INPUT : string := "in.txt";
  218.        OUTPUT : string := "out.txt"
  219.    );
  220.     port (
  221.         clk : in std_logic;  
  222.         read_en : in std_logic;
  223.         write_en : in std_logic;
  224.         addr : in std_logic_vector(15 downto 0);
  225.         data_in : in std_logic_vector(15 downto 0);
  226.         data_out : out std_logic_vector(15 downto 0);
  227.         mem_dump : in std_logic := '0'
  228.     );
  229.     end component;
  230.     -- Signals
  231.     signal   op                     :   std_logic_vector( 3 downto 0)   ;
  232.     signal  rd                      :   std_logic_vector( 3 downto 0)   ;
  233.     signal  rs                      :   std_logic_vector( 3 downto 0)   ;
  234.     signal  rt                      :   std_logic_vector( 3 downto 0)   ;
  235.    
  236.     signal  alu_result          :   std_logic_vector(15 downto 0);
  237.     signal  alu_src_mux_out :   std_logic_vector(15 downto 0);
  238.     signal  sign_ex_out         :   std_logic_vector(15 downto 0);
  239.     signal  rs_data             :   std_logic_vector(15 downto 0);
  240.     signal  rt_data             :   std_logic_vector(15 downto 0);
  241.     signal  reg_dest_mux_out    :   std_logic_vector( 3 downto 0);
  242.     signal  reg_src_mux_out :   std_logic_vector(15 downto 0);
  243.     signal  mem_dataout         :   std_logic_vector(15 downto 0);
  244.  
  245.     signal  ctrl_alu_src        :   std_logic;
  246.     signal  ctrl_alu_op         :   std_logic_vector( 1 downto 0);
  247.     signal  ctrl_reg_dest       :   std_logic;
  248.     signal  ctrl_reg_src        :   std_logic_vector( 1 downto 0);
  249.     signal  ctrl_reg_load       :   std_logic;
  250.     signal  ctrl_mem_read       :   std_logic;
  251.     signal  ctrl_mem_write      :   std_logic;
  252.    
  253.     signal  slt_input           :   std_logic_vector(15 downto 0);
  254.  
  255. begin
  256.     --------------------------------------------------------------------------
  257.     -- Instruction Fetch
  258.     --------------------------------------------------------------------------
  259.     op      <=  instruction(15 downto 12);
  260.     rd      <= instruction(11 downto  8);
  261.     rs      <= instruction(7  downto  4);
  262.     rt      <= instruction(3  downto  0);
  263.     --------------------------------------------------------------------------
  264.     -- Instruction Decode
  265.     --------------------------------------------------------------------------
  266.     CPU_Control_0:          Control port map(
  267.         op              =>      op,
  268.         alu_op      =>      ctrl_alu_op,
  269.         alu_src     =>      ctrl_alu_src,
  270.         reg_dest        =>      ctrl_reg_dest,
  271.         reg_load        =>      ctrl_reg_load,
  272.         reg_src     =>      ctrl_reg_src,
  273.         mem_read        =>      ctrl_mem_read,
  274.         mem_write   =>      ctrl_mem_write
  275.     );
  276.  
  277.     CPU_Registers_0:        Registers port map(
  278.         clk         =>      clk,
  279.         clear           =>      clear,
  280.         a_addr      =>      rd,
  281.         a_data      =>      reg_src_mux_out,
  282.         load            =>      ctrl_reg_load,
  283.         b_addr      =>      rs,
  284.         c_addr      =>      reg_dest_mux_out,
  285.         b_data      =>      rs_data,
  286.         c_data      =>      rt_data
  287.     );
  288.  
  289.     CPU_signextend_0:       Signextend port map(
  290.         immIn           =>      rt,
  291.         immOut      =>      sign_ex_out
  292.     ); 
  293.  
  294.     CPU_reg_dest_mux:       mux2_1 generic map(4) port map(
  295.         Input1      =>      rt,
  296.         Input2      =>      rd,
  297.         S               =>      ctrl_reg_dest,
  298.         Sout            =>      reg_dest_mux_out
  299.     );
  300.  
  301.     --------------------------------------------------------------------------
  302.     -- Execute
  303.     --------------------------------------------------------------------------
  304.     CPU_alu_src_mux:        mux2_1 generic map(16) port map(
  305.         Input1      =>      rt_data,
  306.         Input2      =>      sign_ex_out,
  307.         S               =>      ctrl_alu_src,
  308.         Sout            =>      alu_src_mux_out
  309.     );
  310.    
  311.     CPU_ALU_0:              ALU_16Bit port map(
  312.         A               =>      rs_data,
  313.         B               =>      alu_src_mux_out,
  314.         S               =>      ctrl_alu_op,
  315.         Sout            =>      alu_result,
  316.         Cout            =>      open
  317.     );
  318.    
  319.     --------------------------------------------------------------------------
  320.     -- Memory
  321.     --------------------------------------------------------------------------
  322.     CPU_MEM_0:Memory port map(
  323.         clk         =>      clk,
  324.         read_en     =>      ctrl_mem_read,
  325.         write_en        =>      ctrl_mem_write,
  326.         addr            =>      alu_result,
  327.         data_in     =>      rt_data,
  328.         data_out        =>      mem_dataout,
  329.         mem_dump    =>      '0'
  330.     );
  331.  
  332.     --------------------------------------------------------------------------
  333.     -- Write Back alu_result and
  334.     --------------------------------------------------------------------------
  335.     slt_input <= "000000000000000"&(alu_result(15));
  336.     CPU_reg_src_mux:        mux3_1 generic map(16) port map(
  337.         Input1      =>      mem_dataout,
  338.         Input2      =>      alu_result,
  339.         Input3      =>      slt_input,
  340.         S               =>      ctrl_reg_src,
  341.         Sout            =>      reg_src_mux_out
  342.     );
  343.  
  344. end Behavioral;
  345. --- CPU_2214 END ---
  346.  
  347. --- CPU_2214_TB START ---
  348. library ieee;
  349. use ieee.std_logic_1164.all;
  350.  
  351.  
  352. entity CPU_2214_Test is
  353. end entity CPU_2214_Test;
  354.  
  355.  
  356. architecture mixed of CPU_2214_Test is
  357.     constant tick : time := 100 ns;
  358.     signal reset, clock : std_logic;
  359.      signal mem_dump : std_logic := '0';
  360.     signal instruction : std_logic_vector(0 to 15);
  361. begin
  362.     uut : entity work.CPU_2214
  363.         port map(
  364.             clk     => clock,
  365.             clear   => reset,
  366.             instruction => instruction,
  367.                 mem_dump    => mem_dump
  368.         );
  369.  
  370.     driver : process is
  371.     begin
  372.         -- reset the system
  373.         reset <= '0'; instruction <= x"0000"; wait for 50 ns;
  374.         reset <= '1';
  375.          
  376.           -- ADDI r3, r0, 5   (r3 = 5)
  377.         instruction <= x"4305"; wait for tick;
  378.  
  379.         -- ADDI r4, r0, 2   (r4 = 2)
  380.         instruction <= x"4402"; wait for tick;
  381.            
  382.           -- SLT r11,r3, r4    (r11 = 0)
  383.           instruction <= x"7B34"; wait for tick;
  384.  
  385.         -- SW r3, 0(r0)     (M[0] = 5)
  386.         instruction <= x"C300"; wait for tick;
  387.  
  388.         -- SW r4, 4(r0)     (M[4] = 2)
  389.         instruction <= x"C404"; wait for tick;
  390.  
  391.         -- ADDI r6, r0, 4   (r6 = 4)
  392.         instruction <= x"4604"; wait for tick;
  393.  
  394.         -- LW r7, 0(r6)     (r7 = 2)
  395.         instruction <= x"8760"; wait for tick;
  396.  
  397.         -- LW r8, 0(r0)     (r8 = 5)
  398.         instruction <= x"8800"; wait for tick;
  399.          
  400.           -- ADD r9,r7,r8     (r9 = 7)
  401.         instruction <= x"0978"; wait for tick;
  402.  
  403.           -- SLT r10,r0,r1     (r10 = 1)
  404.         instruction <= x"7A01"; wait for tick;
  405.  
  406.           -- SLT r10,r1,r0     (r10 = 0)
  407.         instruction <= x"7A10"; wait for tick;
  408.  
  409.         wait;
  410.     end process driver;
  411.  
  412.     clock_p : process is
  413.     begin
  414.         for i in 0 to 100 loop
  415.             clock <= '1'; wait for tick/2;
  416.             clock <= '0'; wait for tick/2;
  417.         end loop;
  418.         wait;
  419.     end process clock_p;
  420. end architecture mixed;
  421.  
  422. --- CPU_2214_TB END ---
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement