StevanovicMilan

CU_Domaci

May 15th, 2021
459
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. entity CONTROL_UNIT is port (
  5.               iCLK          : in   std_logic;
  6.               iRST          : in   std_logic;
  7.            iZ               : in   std_logic;
  8.            oREGISTERS   : out  std_logic_vector (25 downto 0);
  9.            oALUFN       : out  std_logic_vector (5 downto 0);
  10.            oBSEL            : out  std_logic;
  11.               oMOE          : out  std_logic;
  12.            oMWR             : out  std_logic;
  13.            oWDSEL       : out  std_logic;
  14.            oWERF            : out  std_logic
  15.             );
  16. end entity;
  17.  
  18. architecture Behavioral of CONTROL_UNIT is
  19.    
  20.     type tSTATE is (IDLE,R0,R1,R2,R3,R4,R7,R8,R9,R13,SHL2,ADD,ADDC,NEG0,NEG01,NEG02,NEG03,NEG1,
  21.                     ST_MEM,MUL4,NEG11,NEG12,NEG13,NEG2,NEG21,NEG22,NEG23,NEG3,
  22.                     NEG31,NEG32,NEG33,NEG4,NEG41,NEG42,NEG43,NEG44
  23.     );
  24.     signal sSTATE, sNEXT_STATE : tSTATE;
  25.    
  26. begin
  27.    
  28.     process (iCLK,iRST) begin
  29.         if (iRST='1') then
  30.             sSTATE <= IDLE;
  31.         elsif (rising_edge(iCLK)) then
  32.         sSTATE <= sNEXT_STATE;
  33.         end if;
  34.     end process;
  35.        
  36.         --fja prelaza stanja
  37.         process (sSTATE, iZ) begin
  38.             case (sSTATE) is
  39.                 when IDLE => sNEXT_STATE <= R0;
  40.                 when R0 => sNEXT_STATE <= R1;
  41.                 when R1 => sNEXT_STATE <= R2;
  42.                 when R2 => sNEXT_STATE <= R3;
  43.                 when R3 => sNEXT_STATE <= R4;
  44.                 when R4 => sNEXT_STATE <= R8;
  45.                 when R7 => sNEXT_STATE <= ST_MEM;
  46.                 when R8 => sNEXT_STATE <= R9;
  47.                 when R9 => sNEXT_STATE <= R13;
  48.                 when R13 => sNEXT_STATE <= NEG0;
  49.                 when NEG0 => sNEXT_STATE <=NEG01;
  50.                 when NEG01 => sNEXT_STATE <=NEG02;
  51.                 when NEG02 => if (iZ = '0') then
  52.                                         sNEXT_staTE <= NEG03;
  53.                                  else
  54.                                         sNEXT_STATE <= NEG1;
  55.                                  end if;
  56.                 when NEG03 => sNEXT_STATE <=ST_MEM;
  57.                
  58.                 when NEG1 => sNEXT_STATE <=NEG11;
  59.                 when NEG11 => sNEXT_STATE <=NEG12;
  60.                 when NEG12 => if (iZ = '0') then
  61.                                         sNEXT_staTE <= NEG13;
  62.                                  else
  63.                                         sNEXT_STATE <= NEG2;
  64.                                  end if;
  65.                 when NEG13 => sNEXT_STATE <=ST_MEM;
  66.                
  67.                 when NEG2 => sNEXT_STATE <=NEG21;
  68.                 when NEG21 => sNEXT_STATE <=NEG22;
  69.                 when NEG22 => if (iZ = '0') then
  70.                                         sNEXT_staTE <= NEG23;
  71.                                  else
  72.                                         sNEXT_STATE <= NEG3;
  73.                                  end if;
  74.                 when NEG23 => sNEXT_STATE <=ST_MEM;
  75.                
  76.                
  77.                 when NEG3 => sNEXT_STATE <=NEG31;
  78.                 when NEG31 => sNEXT_STATE <=NEG32;
  79.                 when NEG32 => if (iZ = '0') then
  80.                                         sNEXT_staTE <= NEG33;
  81.                                  else
  82.                                         sNEXT_STATE <= NEG4;
  83.                                  end if;
  84.                 when NEG33 => sNEXT_STATE <=ST_MEM;
  85.                
  86.                
  87.                 when NEG4 => sNEXT_STATE <=NEG41;
  88.                 when NEG41 => sNEXT_STATE <=NEG42;
  89.                 when NEG42 => if (iZ = '0') then
  90.                                         sNEXT_staTE <= NEG43;
  91.                                  else
  92.                                         sNEXT_STATE <= MUL4;
  93.                                  end if;
  94.                 when NEG43 => sNEXT_STATE <=ST_MEM;
  95.                
  96.                 when MUL4 => sNEXT_STATE <= SHL2;
  97.                when SHL2 => sNEXT_STATE <= ADD;
  98.                 when ADD => sNEXT_STATE <= ST_MEM;
  99.                 when ST_MEM => sNEXT_STATE <=ST_MEM;
  100.                 when others => sNEXT_STATE <= IDLE;
  101.             end case;
  102.         end process;
  103.        
  104.         --fja izlaza
  105.                 --              Rc        Ra       Rb/const
  106.         --oREGISTERS = "-----" & "-----" & "-----" & "-----------";
  107.         process (sSTATE) begin
  108.             case (sSTATE) is
  109.              when IDLE =>
  110.               oREGISTERS    <= "-----" & "-----" & "-----" & "-----------";
  111.               oALUFN        <= "------";
  112.               oBSEL             <= '-';--if BSEL=1 => koristimo konstantu
  113.               oMOE          <= '-';--dozvola za citanje iz mem za pod
  114.               oMWR          <= '-';--dozvola za upis u mem za pod
  115.            oWDSEL       <= '-';--citanje iz ALU ili iz mem za pod
  116.            oWERF            <= '-';--dozvola za upis u reg.
  117.            
  118.             when R0   => --upis u reg R0 <- MEM[0x4]
  119.             --                  R0        R31          0x4
  120.              oREGISTERS     <= "00000" & "11111" & "0000000000000100";
  121.               oALUFN        <= "000000"; --ADD (LOAD ima u ALUFN +)
  122.               oBSEL             <= '1'; --treba nam konstanta
  123.               oMOE          <= '1'; --citamo sa 8.mem lokacije
  124.               oMWR          <= '0'; --ne pisemo nista
  125.            oWDSEL       <= '1';
  126.            oWERF            <= '1';
  127.              
  128.             when R1 =>      --upis u reg R1 <- MEM[0x8] LD iz mem
  129.                 --                R1       R31          0x8
  130.               oREGISTERS    <= "00001" & "11111" & "0000000000001000";
  131.               oALUFN        <= "000000"; --ADD
  132.               oBSEL             <= '1';
  133.               oMOE          <= '1';
  134.               oMWR          <= '0';
  135.            oWDSEL       <= '1';
  136.            oWERF            <= '1';
  137.            
  138.             when R2 => --upis u reg R2 <- MEM[0x12] LD iz mem
  139.                 --                R2       R31          0x12
  140.               oREGISTERS    <= "00010" & "11111"&"0000000000001100";
  141.               oALUFN        <= "000000"; --ADD
  142.               oBSEL             <= '1';
  143.               oMOE          <= '1';
  144.               oMWR          <= '0';
  145.            oWDSEL       <= '1';
  146.            oWERF            <= '1';
  147.              
  148.             when R3 => --upis u reg R3 <- MEM[0x16] LD iz mem
  149.                 --                R3       R31          0x16
  150.               oREGISTERS    <= "00011" & "11111"&"0000000000010000";
  151.               oALUFN        <= "000000"; --ADD
  152.               oBSEL             <= '1';
  153.               oMOE          <= '1';
  154.               oMWR          <= '0';
  155.            oWDSEL       <= '1';
  156.            oWERF            <= '1';
  157.              
  158.             when R4 => --upis u reg R4 <- MEM[0x20] LD iz mem
  159.                 --                R4       R31          0x20
  160.               oREGISTERS    <= "00100" & "11111"&"0000000000010100";
  161.               oALUFN        <= "000000"; --ADD
  162.               oBSEL             <= '1';
  163.               oMOE          <= '1';
  164.               oMWR          <= '0';
  165.            oWDSEL       <= '1';
  166.            oWERF            <= '1';
  167.              
  168.           when R7 =>  --svaki put kada je u stanju R7, povecavamo R10 za 1 
  169.                 --                R7       R10         1
  170.               oREGISTERS    <= "00111" & "01010" & "0000000000000001";
  171.               oALUFN        <= "110000"; --ADDC
  172.               oBSEL             <= '1';
  173.               oMOE          <= '1';
  174.               oMWR          <= '0';
  175.            oWDSEL       <= '1';
  176.            oWERF            <= '1';
  177.            
  178.             when R8 => --upis u reg R8
  179.                 --                R8       R0         1
  180.               oREGISTERS    <= "01000" & "00000" & "0000000000000001";
  181.               oALUFN        <= "110000"; --ADDC
  182.               oBSEL             <= '1';
  183.               oMOE          <= '1';
  184.               oMWR          <= '0';
  185.            oWDSEL       <= '1';
  186.            oWERF            <= '1';
  187.              
  188.             when R9 => --upis u reg R9
  189.                 --                R9       R0         31
  190.               oREGISTERS    <= "01001" & "00000" & "0000000000011111";
  191.               oALUFN        <= "110000"; --ADDC
  192.               oBSEL             <= '1';
  193.               oMOE          <= '1';
  194.               oMWR          <= '0';
  195.            oWDSEL       <= '1';
  196.            oWERF            <= '1';
  197.              
  198.              when R13 => --upis u reg R13
  199.                 --                R13       R0         2
  200.               oREGISTERS    <= "01101" & "00000" & "0000000000000010";
  201.               oALUFN        <= "110000"; --ADDC
  202.               oBSEL             <= '1';
  203.               oMOE          <= '1';
  204.               oMWR          <= '0';
  205.            oWDSEL       <= '1';
  206.            oWERF            <= '1';
  207.              
  208.              
  209.              when NEG0 => -- shift u desno za 31 mesto i upis u R5
  210.              --                   R5        R0        R9
  211.               oREGISTERS    <= "00101" & "00000" & "01001" & "-----------";
  212.               oALUFN        <= "100001"; --shift right
  213.               oBSEL             <= '0';
  214.               oMOE          <= '0';
  215.               oMWR          <= '0';
  216.            oWDSEL       <= '0';
  217.            oWERF            <= '1';
  218.                
  219.             when NEG01 => --proveravamo da li je vrednost iz R5 jednaka 1 (r8) i upisujemo u R6
  220.              --                   R6        R5        R8
  221.               oREGISTERS    <= "00110" & "00101" & "01000" & "-----------";
  222.               oALUFN        <= "110011"; --CMPEQ
  223.               oBSEL             <= '0';
  224.               oMOE          <= '0';
  225.               oMWR          <= '0';
  226.            oWDSEL       <= '0';
  227.            oWERF            <= '1';
  228.              
  229.              when NEG02 => --propustamo R6 kroz REG logiku da bismo postavili ZERO flag
  230.              --                   R6        R6      
  231.               oREGISTERS    <= "00110" & "00110" & "-----" & "-----------";
  232.               oALUFN        <= "011010"; --A
  233.               oBSEL             <= '0';
  234.               oMOE          <= '0';
  235.               oMWR          <= '0';
  236.            oWDSEL       <= '0';
  237.            oWERF            <= '1';
  238.              
  239.               when NEG03 => --upisujemo negativan u R7
  240.              --                   R7        R0      
  241.               oREGISTERS    <= "00111" & "00000" & "-----" & "-----------";
  242.               oALUFN        <= "011010"; --A
  243.               oBSEL             <= '0';
  244.               oMOE          <= '0';
  245.               oMWR          <= '0';
  246.            oWDSEL       <= '0';
  247.            oWERF            <= '1';
  248.              
  249.              
  250.               when NEG1 =>
  251.              --                   R14        R1        R9
  252.               oREGISTERS    <= "01110" & "00001" & "01001" & "-----------";
  253.               oALUFN        <= "100001"; --shift right
  254.               oBSEL             <= '0';
  255.               oMOE          <= '0';
  256.               oMWR          <= '0';
  257.            oWDSEL       <= '0';
  258.            oWERF            <= '1';
  259.                
  260.             when NEG11 =>
  261.              --                   R15        R14        R8
  262.               oREGISTERS    <= "01111" & "01110" & "01000" & "-----------";
  263.               oALUFN        <= "110011"; --CMPEQ
  264.               oBSEL             <= '0';
  265.               oMOE          <= '0';
  266.               oMWR          <= '0';
  267.            oWDSEL       <= '0';
  268.            oWERF            <= '1';
  269.              
  270.              when NEG12 =>
  271.              --                   R15        R15      
  272.               oREGISTERS    <= "01111" & "01111" & "-----" & "-----------";
  273.               oALUFN        <= "011010"; --A
  274.               oBSEL             <= '0';
  275.               oMOE          <= '0';
  276.               oMWR          <= '0';
  277.            oWDSEL       <= '0';
  278.            oWERF            <= '1';
  279.              
  280.               when NEG13 =>
  281.              --                   R7        R0      
  282.               oREGISTERS    <= "00111" & "00000" & "-----" & "-----------";
  283.               oALUFN        <= "011010"; --A
  284.               oBSEL             <= '0';
  285.               oMOE          <= '0';
  286.               oMWR          <= '0';
  287.            oWDSEL       <= '0';
  288.            oWERF            <= '1';
  289.              
  290.              
  291.              
  292.              when NEG2 =>
  293.              --                   R16        R2        R9
  294.               oREGISTERS    <= "10000" & "00010" & "01001" & "-----------";
  295.               oALUFN        <= "100001"; --shift right
  296.               oBSEL             <= '0';
  297.               oMOE          <= '0';
  298.               oMWR          <= '0';
  299.            oWDSEL       <= '0';
  300.            oWERF            <= '1';
  301.                
  302.             when NEG21 =>
  303.              --                   R17        R16        R8
  304.               oREGISTERS    <= "10001" & "10000" & "01000" & "-----------";
  305.               oALUFN        <= "110011"; --CMPEQ
  306.               oBSEL             <= '0';
  307.               oMOE          <= '0';
  308.               oMWR          <= '0';
  309.            oWDSEL       <= '0';
  310.            oWERF            <= '1';
  311.              
  312.              when NEG22 =>
  313.              --                   R17        R17      
  314.               oREGISTERS    <= "10001" & "10001" & "-----" & "-----------";
  315.               oALUFN        <= "011010"; --A
  316.               oBSEL             <= '0';
  317.               oMOE          <= '0';
  318.               oMWR          <= '0';
  319.            oWDSEL       <= '0';
  320.            oWERF            <= '1';
  321.              
  322.               when NEG23 =>
  323.              --                   R7        R0      
  324.               oREGISTERS    <= "00111" & "00000" & "-----" & "-----------";
  325.               oALUFN        <= "011010"; --A
  326.               oBSEL             <= '0';
  327.               oMOE          <= '0';
  328.               oMWR          <= '0';
  329.            oWDSEL       <= '0';
  330.            oWERF            <= '1';
  331.              
  332.              
  333.               when NEG3 =>
  334.              --                   R18        R3        R9
  335.               oREGISTERS    <= "10010" & "00011" & "01001" & "-----------";
  336.               oALUFN        <= "100001"; --shift right
  337.               oBSEL             <= '0';
  338.               oMOE          <= '0';
  339.               oMWR          <= '0';
  340.            oWDSEL       <= '0';
  341.            oWERF            <= '1';
  342.                
  343.             when NEG31 =>
  344.              --                   R19        R18        R8
  345.               oREGISTERS    <= "10011" & "10010" & "01000" & "-----------";
  346.               oALUFN        <= "110011"; --CMPEQ
  347.               oBSEL             <= '0';
  348.               oMOE          <= '0';
  349.               oMWR          <= '0';
  350.            oWDSEL       <= '0';
  351.            oWERF            <= '1';
  352.              
  353.              when NEG32 =>
  354.              --                   R19        R19      
  355.               oREGISTERS    <= "10011" & "10011" & "-----" & "-----------";
  356.               oALUFN        <= "011010"; --A
  357.               oBSEL             <= '0';
  358.               oMOE          <= '0';
  359.               oMWR          <= '0';
  360.            oWDSEL       <= '0';
  361.            oWERF            <= '1';
  362.              
  363.               when NEG33 =>
  364.              --                   R7        R0      
  365.               oREGISTERS    <= "00111" & "00000" & "-----" & "-----------";
  366.               oALUFN        <= "011010"; --A
  367.               oBSEL             <= '0';
  368.               oMOE          <= '0';
  369.               oMWR          <= '0';
  370.            oWDSEL       <= '0';
  371.            oWERF            <= '1';
  372.              
  373.              
  374.              when NEG4 =>
  375.              --                   R20        R4        R9
  376.               oREGISTERS    <= "10100" & "00100" & "01001" & "-----------";
  377.               oALUFN        <= "100001"; --shift right
  378.               oBSEL             <= '0';
  379.               oMOE          <= '0';
  380.               oMWR          <= '0';
  381.            oWDSEL       <= '0';
  382.            oWERF            <= '1';
  383.                
  384.             when NEG41 =>
  385.              --                   R21        R20        R8
  386.               oREGISTERS    <= "10101" & "10100" & "01000" & "-----------";
  387.               oALUFN        <= "110011"; --CMPEQ
  388.               oBSEL             <= '0';
  389.               oMOE          <= '0';
  390.               oMWR          <= '0';
  391.            oWDSEL       <= '0';
  392.            oWERF            <= '1';
  393.              
  394.              when NEG42 =>
  395.              --                   R21        R21      
  396.               oREGISTERS    <= "10101" & "10101" & "-----" & "-----------";
  397.               oALUFN        <= "011010"; --A
  398.               oBSEL             <= '0';
  399.               oMOE          <= '0';
  400.               oMWR          <= '0';
  401.            oWDSEL       <= '0';
  402.            oWERF            <= '1';
  403.              
  404.               when NEG43 =>
  405.              --                   R7        R0      
  406.               oREGISTERS    <= "00111" & "00000" & "-----" & "-----------";
  407.               oALUFN        <= "011010"; --A
  408.               oBSEL             <= '0';
  409.               oMOE          <= '0';
  410.               oMWR          <= '0';
  411.            oWDSEL       <= '0';
  412.            oWERF            <= '1';
  413.              
  414.              
  415.              
  416.              when ADD => --sabiramo R10 i R11 i upisujemo u R12
  417.              --                 R12       R10      R11
  418.                 oREGISTERS <= "01100" & "01010" & "01011" & "-----------";
  419.                 oALUFN    <= "000000";  --ADD
  420.                 oBSEL     <= '0';      
  421.                 oMOE      <= '0';          
  422.                 oMWR      <= '0';          
  423.                 oWDSEL    <= '0';          
  424.                 oWERF     <= '1';
  425.              
  426.              
  427.               when SHL2 => --pomeram R10 za dva mesta u levo i upisem u R11
  428.                 --              R11        R10     R13=2
  429.                 oREGISTERS <= "01011" & "01010" & "01101" & "-----------";
  430.                 oALUFN    <= "100000";  --SHL
  431.                 oBSEL     <= '0';      
  432.                 oMOE      <= '0';          
  433.                 oMWR      <= '0';          
  434.                 oWDSEL    <= '0';          
  435.                 oWERF     <= '1';
  436.              
  437.              when ST_MEM => --upisujemo u memoriju na prvu slobodnu lokaciju (40)
  438.                 --              R10        R31       mem 40  
  439.                 oREGISTERS <= "01010" & "11111" & "0000000000101000";
  440.                 oALUFN    <= "000000";  --ADD
  441.                 oBSEL     <= '1';      
  442.                 oMOE      <= '0';          
  443.                 oMWR      <= '1';           --pisemo u memoriju
  444.                 oWDSEL    <= '0';          
  445.                 oWERF     <= '0';
  446.              
  447.             when others =>
  448.               oREGISTERS    <= "-----" & "-----" & "-----" & "-----------";
  449.               oALUFN        <= "------";
  450.               oBSEL             <= '-';
  451.               oMOE          <= '-';
  452.               oMWR          <= '-';
  453.            oWDSEL       <= '-';
  454.            oWERF            <= '-';
  455.                 end case;
  456.         end process;
  457.  
  458. end architecture;
  459.  
  460.  
RAW Paste Data