Guest User

Untitled

a guest
May 21st, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 11.65 KB | None | 0 0
  1. ----------------------------------------------------------------------------------
  2. -- Company:
  3. -- Engineer:
  4. --
  5. -- Create Date:    11:31:25 12/14/2011
  6. -- Design Name:
  7. -- Module Name:    cpu_top - Behavioral
  8. -- Project Name:
  9. -- Target Devices:
  10. -- Tool versions:
  11. -- Description:
  12. --
  13. -- Dependencies:
  14. --
  15. -- Revision:
  16. -- Revision 0.01 - File Created
  17. -- Additional Comments:
  18. --
  19. ----------------------------------------------------------------------------------
  20. library IEEE;
  21. use IEEE.STD_LOGIC_1164.ALL;
  22.  
  23. -- Uncomment the following library declaration if using
  24. -- arithmetic functions with Signed or Unsigned values
  25. --use IEEE.NUMERIC_STD.ALL;
  26.  
  27. -- Uncomment the following library declaration if instantiating
  28. -- any Xilinx primitives in this code.
  29. --library UNISIM;
  30. --use UNISIM.VComponents.all;
  31.  
  32. entity cpu_top is
  33.     Port ( iCLK : in  STD_LOGIC;
  34.            inRST : in  STD_LOGIC;
  35.            iINSTR : in  STD_LOGIC_VECTOR (14 downto 0);
  36.            iDATA : in  STD_LOGIC_VECTOR (15 downto 0);
  37.            oPC : out  STD_LOGIC_VECTOR (15 downto 0);
  38.            oDATA : out  STD_LOGIC_VECTOR (15 downto 0);
  39.            oADDR : out  STD_LOGIC_VECTOR (15 downto 0);
  40.            oWE : out  STD_LOGIC;
  41.               oR0, oR1, oR2, oR3, oR4, oR5, oR6, oR7 : out  STD_LOGIC_VECTOR (15 downto 0);
  42.               oPHASE : out  STD_LOGIC_VECTOR (1 downto 0)
  43.               );
  44. end cpu_top;
  45.  
  46. architecture Behavioral of cpu_top is
  47. component reg is
  48.    generic (Sirina: integer :=16);
  49.    Port (
  50.            iCLK   : in   STD_LOGIC;
  51.            inRST  : in   STD_LOGIC;
  52.            iD     : in   STD_LOGIC_VECTOR (Sirina-1 downto 0);
  53.            iWE    : in   STD_LOGIC;
  54.            oQ     : out  STD_LOGIC_VECTOR (Sirina-1 downto 0));
  55.     end component;
  56. -----------------------------------------------------------------        
  57.     component mux is
  58.     Port ( iD0 : in  STD_LOGIC_VECTOR (15 downto 0);
  59.            iD1 : in  STD_LOGIC_VECTOR (15 downto 0);
  60.            iD2 : in  STD_LOGIC_VECTOR (15 downto 0);
  61.            iD3 : in  STD_LOGIC_VECTOR (15 downto 0);
  62.            iD4 : in  STD_LOGIC_VECTOR (15 downto 0);
  63.            iD5 : in  STD_LOGIC_VECTOR (15 downto 0);
  64.            iD6 : in  STD_LOGIC_VECTOR (15 downto 0);
  65.            iD7 : in  STD_LOGIC_VECTOR (15 downto 0);
  66.            iD8 : in  STD_LOGIC_VECTOR (15 downto 0);
  67.            iSEL : in  STD_LOGIC_VECTOR (3 downto 0);
  68.            oQ : out  STD_LOGIC_VECTOR (15 downto 0));
  69.     end component;
  70. -----------------------------------------------------------------
  71.     component cnt is
  72.     Port ( iCLK : in  STD_LOGIC;
  73.            inRST : in  STD_LOGIC;
  74.            iD : in  STD_LOGIC_VECTOR (15 downto 0);
  75.            iEN : in  STD_LOGIC;
  76.            iLOAD : in  STD_LOGIC;
  77.            oQ : out  STD_LOGIC_VECTOR (15 downto 0));
  78.     end component;
  79. -----------------------------------------------------------------
  80.     component alu is
  81.     Port ( iA : in  STD_LOGIC_VECTOR (15 downto 0);
  82.            iB : in  STD_LOGIC_VECTOR (15 downto 0);
  83.            iSEL : in  STD_LOGIC_VECTOR (3 downto 0);
  84.            oC : out  STD_LOGIC_VECTOR (15 downto 0);
  85.            oZERO : out  STD_LOGIC;
  86.            oSIGN : out  STD_LOGIC;
  87.            oCARRY : out  STD_LOGIC);
  88.     end component;
  89. -----------------------------------------------------------------
  90.     component control_unit is
  91.     Port ( iCLK : in  STD_LOGIC;
  92.            inRST : in  STD_LOGIC;
  93.            iINSTR : in  STD_LOGIC_VECTOR (14 downto 0);
  94.            oREG_WE : out  STD_LOGIC_VECTOR (7 downto 0);
  95.            oA_WE : out  STD_LOGIC;
  96.            oB_WE : out  STD_LOGIC;
  97.            oC_WE : out  STD_LOGIC;
  98.            oIR_WE : inout  STD_LOGIC;
  99.            oPC_WE : out  STD_LOGIC;
  100.            oPC_LOAD : out  STD_LOGIC;
  101.            oMUXA_SEL : out  STD_LOGIC_VECTOR (3 downto 0);
  102.            oMUXB_SEL : out  STD_LOGIC_VECTOR (3 downto 0);
  103.            oALU_SEL : out  STD_LOGIC_VECTOR (3 downto 0);
  104.            oMEM_WE : out  STD_LOGIC;
  105.            oPC_IN : out  STD_LOGIC_VECTOR (15 downto 0);
  106.            iZERO : in  STD_LOGIC;
  107.            iSIGN : in  STD_LOGIC;
  108.            iCARRY : in  STD_LOGIC;
  109.               oPHASE : out STD_LOGIC_VECTOR(1 downto 0)
  110.               );
  111.     end component;
  112.    
  113.     --INTERNI SIGNALI
  114.         signal sCARRY : STD_LOGIC;
  115.         signal sZERO  : STD_LOGIC;
  116.         signal sSIGN  : STD_LOGIC;
  117.           signal sPHASE : STD_LOGIC_VECTOR(1 downto 0);
  118.        
  119.         signal sIR    : STD_LOGIC_VECTOR(14 downto 0);
  120.        
  121.         signal sREG_WE: STD_LOGIC_VECTOR (7 downto 0);
  122.         signal sPC_IN : STD_LOGIC_VECTOR(15 downto 0);
  123.         signal sA_WE  : STD_LOGIC;
  124.         signal sB_WE  : STD_LOGIC;
  125.         signal sC_WE  : STD_LOGIC;
  126.         signal sIR_WE : STD_LOGIC;
  127.         signal sPC_EN : STD_LOGIC;
  128.         signal sPC_LOAD:STD_LOGIC;
  129.        
  130.         signal sMUXA_SEL : STD_LOGIC_VECTOR (3 downto 0);
  131.         signal sMUXB_SEL : STD_LOGIC_VECTOR (3 downto 0);
  132.         signal sALU_SEL  : STD_LOGIC_VECTOR (3 downto 0);
  133.         signal sWE : STD_LOGIC;
  134.         signal sDATA  : STD_LOGIC_VECTOR (15 downto 0);
  135.        
  136.         -- Interni signali za izlaze iz registara
  137.         signal sR0 : STD_LOGIC_VECTOR(15 downto 0);
  138.         signal sR1 : STD_LOGIC_VECTOR(15 downto 0);
  139.         signal sR2 : STD_LOGIC_VECTOR(15 downto 0);
  140.         signal sR3 : STD_LOGIC_VECTOR(15 downto 0);
  141.         signal sR4 : STD_LOGIC_VECTOR(15 downto 0);
  142.         signal sR5 : STD_LOGIC_VECTOR(15 downto 0);
  143.         signal sR6 : STD_LOGIC_VECTOR(15 downto 0);
  144.         signal sR7 : STD_LOGIC_VECTOR(15 downto 0);
  145.        
  146.         -- Interni signali za izlaze iz multipleksera
  147.         signal sMUXA : STD_LOGIC_VECTOR(15 downto 0);
  148.         signal sMUXB : STD_LOGIC_VECTOR(15 downto 0);
  149.        
  150.         -- Interni signali za izlaze iz registara A i B
  151.         signal sA_OUT : STD_LOGIC_VECTOR(15 downto 0);
  152.         signal sB_OUT : STD_LOGIC_VECTOR(15 downto 0);
  153.        
  154.         -- Interni signali za aritmeticko logicku jedinicu
  155.         signal sRESULT : STD_LOGIC_VECTOR(15 downto 0);
  156.        
  157.         -- Interni signali za realizaciju registra ZSC
  158.         signal sS : STD_LOGIC;
  159.         signal sC : STD_LOGIC;
  160.         signal sZ : STD_LOGIC;
  161.        
  162.         -- Interni signali za programski brojac
  163.         signal sPC : STD_LOGIC_VECTOR(15 downto 0);
  164. begin
  165. --  Izlazi iz top-a
  166.  
  167.         oADDR   <= sMUXB;
  168.         oDATA   <= sDATA;
  169.         oPC     <= sPC;
  170.           oWE    <= sWE;
  171.          
  172.           oR0 <= sR0;
  173.           oR1 <= sR1;
  174.           oR2 <= sR2;
  175.           oR3 <= sR3;
  176.           oR4 <= sR4;
  177.           oR5 <= sR5;
  178.           oR6 <= sR6;
  179.           oR7 <= sR7;
  180.          
  181.           oPHASE <= sPHASE;
  182.          
  183. --  Aritmeticko Logicka Jedinica
  184.  
  185.         iALU:alu port map (
  186.                 iA     => sA_OUT,
  187.                 iB     => sB_OUT,
  188.                 iSEL   => sALU_SEL,
  189.                 oC     => sRESULT,
  190.                 oZERO  => sZ,
  191.                 oSIGN  => sS,
  192.                 oCARRY => sC
  193.         );    
  194.      
  195. -- Registar C
  196.  
  197.             iC:reg port map (
  198.                 iCLK => iCLK,
  199.                 inRST => inRST,
  200.                 iD => sRESULT,
  201.                 iWE => sC_WE,
  202.                 oQ => sDATA
  203.         );    
  204.      
  205. --  Flip-flop ZSC
  206.  
  207.         process (iCLK,inRST) begin
  208.                 if(inRST='0') then
  209.                         sZERO <='0';
  210.                         sSIGN <='0';
  211.                         sCARRY <='0';
  212.                 elsif(iCLK'event and iCLK='1') then
  213.                         if(sC_WE='1') then
  214.                                 sZERO <= sZ;
  215.                                 sSIGN <= sS;
  216.                                 sCARRY <= sC;
  217.                                
  218.                         end if;
  219.                
  220.                 end if;
  221.         end process;
  222.      
  223. -- Control unit
  224.  
  225.         icontrol_unit:control_unit port map (
  226.         iCLK      => iCLK,
  227.         inRST     => inRST,
  228.         iCARRY    => sCARRY,
  229.         iZERO     => sZERO,
  230.         iSIGN     => sSIGN,
  231.         iINSTR    => sIR,     --Iz instrukcijskog registra
  232.         oREG_WE   => sREG_WE,
  233.         oA_WE     => sA_WE,
  234.         oB_WE     => sB_WE,
  235.         oC_WE     => sC_WE,
  236.         oIR_WE    => sIR_WE,
  237.         oPC_IN    => sPC_IN,
  238.         oPC_WE    => sPC_EN,
  239.         oPC_LOAD  => sPC_LOAD,
  240.         oMUXA_SEL => sMUXA_SEL,
  241.         oMUXB_SEL => sMUXB_SEL,
  242.         oALU_SEL  => sALU_SEL,
  243.         oMEM_WE   => sWE,
  244.           oPHASE => sPHASE
  245.        
  246.         );
  247.  
  248. -- Instrukcijski registar
  249.  
  250.         iIR_reg:reg generic map(Sirina => 15)
  251.         port map(
  252.                 iCLK => iCLK,
  253.                 inRST => inRST,
  254.                 iD  =>iINSTR,
  255.                 iWE => sIR_WE,
  256.                 oQ =>sIR
  257.         );
  258.  
  259. -- Registri R0 - R7
  260.  
  261.         iR0_reg:reg port map (
  262.                 iCLK => iCLK,
  263.                 inRST => inRST,
  264.                 iD => sDATA,
  265.                 iWE => sREG_WE(0),
  266.                 oQ => sR0
  267.         );
  268.        
  269.  
  270.         iR1_reg:reg port map (
  271.                 iCLK => iCLK,
  272.                 inRST => inRST,
  273.                 iD => sDATA,
  274.                 iWE => sREG_WE(1),
  275.                 oQ => sR1
  276.         );    
  277.        
  278.        
  279.         iR2_reg:reg port map (
  280.                 iCLK => iCLK,
  281.                 inRST => inRST,
  282.                 iD => sDATA,
  283.                 iWE => sREG_WE(2),
  284.                 oQ => sR2
  285.         );    
  286.        
  287.         iR3_reg:reg port map (
  288.                 iCLK => iCLK,
  289.                 inRST => inRST,
  290.                 iD => sDATA,
  291.                 iWE => sREG_WE(3),
  292.                 oQ => sR3
  293.         );            
  294.  
  295.         iR4_reg:reg port map (
  296.                 iCLK => iCLK,
  297.                 inRST => inRST,
  298.                 iD => sDATA,
  299.                 iWE => sREG_WE(4),
  300.                 oQ => sR4
  301.         );            
  302.        
  303.         iR5_reg:reg port map (
  304.                 iCLK => iCLK,
  305.                 inRST => inRST,
  306.                 iD => sDATA,
  307.                 iWE => sREG_WE(5),
  308.                 oQ => sR5
  309.         );            
  310.        
  311.         iR6_reg:reg port map (
  312.                 iCLK => iCLK,
  313.                 inRST => inRST,
  314.                 iD => sDATA,
  315.                 iWE => sREG_WE(6),
  316.                 oQ => sR6
  317.         );            
  318.        
  319.         iR7_reg:reg port map (
  320.                 iCLK => iCLK,
  321.                 inRST => inRST,
  322.                 iD => sDATA,
  323.                 iWE => sREG_WE(7),
  324.                 oQ => sR7
  325.         );                    
  326.  
  327. --  Multiplekseri A i B
  328.  
  329.         iMUXA:mux port map (
  330.                 iD0 => sR0,
  331.                 iD1 => sR1,
  332.                 iD2 => sR2,
  333.                 iD3 => sR3,
  334.                 iD4 => sR4,
  335.                 iD5 => sR5,
  336.                 iD6 => sR6,
  337.                 iD7 => sR7,
  338.                 iD8 => iDATA,
  339.                 iSEL => sMUXA_SEL,
  340.                 oQ => sMUXA
  341.         );
  342.        
  343.         iMUXB:mux port map (
  344.                 iD0 => sR0,
  345.                 iD1 => sR1,
  346.                 iD2 => sR2,
  347.                 iD3 => sR3,
  348.                 iD4 => sR4,
  349.                 iD5 => sR5,
  350.                 iD6 => sR6,
  351.                 iD7 => sR7,
  352.                 iD8 => iDATA,
  353.                 iSEL => sMUXB_SEL,
  354.                 oQ => sMUXB
  355.         );    
  356.  
  357. --  Registri A i B
  358.  
  359.         iA:reg port map (
  360.                 iCLK => iCLK,
  361.                 inRST => inRST,
  362.                 iD => sMUXA,
  363.                 iWE => sA_WE,
  364.                 oQ => sA_OUT
  365.         );    
  366.        
  367.         iB:reg port map (
  368.                 iCLK => iCLK,
  369.                 inRST => inRST,
  370.                 iD => sMUXB,
  371.                 iWE => sB_WE,
  372.                 oQ => sB_OUT
  373.         );    
  374.  
  375. --  Programski Brojac
  376.        
  377.         iPC:cnt port map (
  378.                 iCLK => iCLK,
  379.                 inRST => inRST,
  380.                 iD => sPC_IN,
  381.                 iEN => sPC_EN,
  382.                 iLOAD => sPC_LOAD,
  383.                 oQ => sPC
  384.         );
  385.  
  386. end Behavioral;
Add Comment
Please, Sign In to add comment