StevanovicMilan

CU_Vezbe

May 15th, 2021
474
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. library ieee;
  2. use ieee.std_logic_1164.all; --realizuje se kao automat
  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, MIN1, MIN2, MIN2A, MIN2B, MIN3, MIN4, MIN4A, MIN4B, MUL4, SHL2, ADD2, ST_MEM);
  21.     signal sSTATE : tSTATE;
  22.     signal sNEXT_STATE : tSTATE;
  23.    
  24.  
  25. begin
  26.     process(iCLK, iRST) begin
  27.         if(iRST = '1') then
  28.             sSTATE <= IDLE;
  29.         elsif(rising_edge(iCLK)) then
  30.             sSTATE <= sNEXT_STATE;
  31.         end if;
  32.     end process;
  33.    
  34.     --fja prelaza
  35.     process(sSTATE, iZ ) begin
  36.         case (sSTATE) is
  37.             when IDLE   => sNEXT_STATE <= R0;
  38.             when R0     => sNEXT_STATE <= R1;
  39.             when R1     => sNEXT_STATE <= R2;
  40.             when R2     => sNEXT_STATE <= MIN1;
  41.             when MIN1   => sNEXT_STATE <=MIN2;
  42.             when MIN2   =>
  43.                     if(iZ='0') then
  44.                         sNEXT_STATE <= MIN2A; --R0
  45.                     else
  46.                         sNEXT_STATE <= MIN2B; --R1
  47.                     end if;
  48.             when MIN2A => sNEXT_STATE <= MIN3;
  49.             when MIN2B => sNEXT_STATE <= MIN3;
  50.             when MIN3 => sNEXT_STATE <= MIN4;
  51.             when MIN4   =>
  52.                     if(iZ='0') then
  53.                         sNEXT_STATE <= MIN4A; --R3
  54.                     else
  55.                         sNEXT_STATE <= MIN4B; --R2
  56.                     end if;
  57.             when MIN4A => sNEXT_STATE <= MUL4 ;
  58.             when MIN4B => sNEXT_STATE <= MUL4;
  59.             when MUL4 => sNEXT_STATE <= SHL2;
  60.             when SHL2 => sNEXT_STATE <= ADD2;
  61.             when ADD2 => sNEXT_STATE <= ST_MEM;
  62.             when ST_MEM => sNEXT_STATE <= ST_MEM;
  63.             when others => sNEXT_STATE <= IDLE;
  64.         end case;
  65.     end process;
  66.    
  67.     --fja izlaza
  68.     --                      Rc          Ra              Rb/const
  69.     --oREGISTERS = "-----" & "-----" & "-----" & "-----------" format 5 5 5 11
  70.     process(sSTATE) begin
  71.         case(sSTATE) is
  72.             when IDLE =>
  73.                 oREGISTERS <= "-----" & "-----" & "-----" & "-----------";
  74.                 oALUFN    <= "------";  --operacija u ALU jedinici
  75.                 oBSEL     <= '-';      --iF BSEL = 1 => koristimo konstnatu
  76.                 oMOE      <= '-';          --dozvola za citanje iz memorije za podatke
  77.                 oMWR      <= '-';           --dozvola za pisanje u memoriju za podatke
  78.                 oWDSEL    <= '-';           --da li koristimo rez iz memo ili alu, na 1 je kad je iz memorije
  79.                 oWERF     <= '-';           --dozvola za upis u registre
  80.             when R0 => --upis u R0 sa memo lokacije MEM[0x8]
  81.                 oREGISTERS <= "00000" & "11111" & "0000000000001000"; --konstanta
  82.                 oALUFN    <= "000000"; --treba da sabira ovde R31=0 i kontantu 8 jer ta j elokacija sa koje se cita  
  83.                 oBSEL     <= '1'; --jer treba konstnata        
  84.                 oMOE      <= '1';          
  85.                 oMWR      <= '0';          
  86.                 oWDSEL    <= '1';          
  87.                 oWERF     <= '1';      
  88.             when R1 => --upis u R1 sa memo lokacije MEM[0x8]
  89.                 oREGISTERS <= "00001" & "11111" & "0000000000001100"; --konstanta 0xC sto je 12
  90.                 oALUFN    <= "000000"; --treba da sabira ovde R31=0 (njega uvek kod citanja) i kontantu 8 jer ta j elokacija sa koje se cita  
  91.                 oBSEL     <= '1'; --jer treba konstnata        
  92.                 oMOE      <= '1';          
  93.                 oMWR      <= '0';          
  94.                 oWDSEL    <= '1';          
  95.                 oWERF     <= '1';  
  96.             when R2 => --
  97.                 oREGISTERS <= "00010" & "11111" & "0000000000010000"; --konstanta
  98.                 oALUFN    <= "000000"; --treba da sabira ovde R31=0 i kontantu 8 jer ta j elokacija sa koje se cita  
  99.                 oBSEL     <= '1'; --jer treba konstnata        
  100.                 oMOE      <= '1';          
  101.                 oMWR      <= '0';          
  102.                 oWDSEL    <= '1';          
  103.                 oWERF     <= '1';  
  104.             when MIN1 => --poredimo da li R0 manje od R1, rez u R7
  105.                 oREGISTERS <= "00111" & "00000" & "00001" & "00000000000"; --PRVO SE NAVODI REG GDE SE UPISUJE REZULTAT!!
  106.                 oALUFN    <= "110101";  --CMPLT
  107.                 oBSEL     <= '0';      
  108.                 oMOE      <= '0';          
  109.                 oMWR      <= '0';          
  110.                 oWDSEL    <= '0';          
  111.                 oWERF     <= '1';  
  112.                 --treba da proverimo koji je manji, R7 propustiti opet kroy ovo na RD1 da bi imali vrednost za Z da bismo znali koji je
  113.             when MIN2 => --propustiti R7 kroz REG logiku da biso postavili ZERO flag
  114.                 oREGISTERS <= "00111" & "00111" & "00001" & "00000000000"; --PRVO SE NAVODI REG GDE SE UPISUJE REZULTAT!!
  115.                 oALUFN    <= "011010";  --samo propustanje signala
  116.                 oBSEL     <= '0';      
  117.                 oMOE      <= '0';          
  118.                 oMWR      <= '0';          
  119.                 oWDSEL    <= '0';          
  120.                 oWERF     <= '1';
  121.             when MIN2A => --upisujemo min u R3, a to je u ovom slucaju R0
  122.                 oREGISTERS <= "00011" & "00000" & "-----" & "-----------";
  123.                 oALUFN    <= "011010";  --samo propustanje signala
  124.                 oBSEL     <= '0';      
  125.                 oMOE      <= '0';          
  126.                 oMWR      <= '0';          
  127.                 oWDSEL    <= '0';          
  128.                 oWERF     <= '1';
  129.             when MIN2B => --upisujemo min u R3, a to je u ovom slucaju R1
  130.                 oREGISTERS <= "00011" & "00001" & "-----" & "-----------";
  131.                 oALUFN    <= "011010";  --samo propustanje signala
  132.                 oBSEL     <= '0';      
  133.                 oMOE      <= '0';          
  134.                 oMWR      <= '0';          
  135.                 oWDSEL    <= '0';          
  136.                 oWERF     <= '1';
  137.                
  138.             when MIN3 => --poredimo trenutkni koji je u R3 sa onim iz R2 sto je ostao, a upis ide u R7
  139.                 oREGISTERS <= "00111" & "00011" & "00010" & "00000000000";
  140.                 oALUFN    <= "110101";  
  141.                 oBSEL     <= '0';      
  142.                 oMOE      <= '0';          
  143.                 oMWR      <= '0';          
  144.                 oWDSEL    <= '0';          
  145.                 oWERF     <= '1';
  146.                
  147.             when MIN4 => --propustiti R7 kroz REG logiku da biso postavili ZERO flag
  148.                 oREGISTERS <= "00111" & "00111" & "00001" & "00000000000"; --PRVO SE NAVODI REG GDE SE UPISUJE REZULTAT!!
  149.                 oALUFN    <= "011010";  --samo propustanje signala
  150.                 oBSEL     <= '0';      
  151.                 oMOE      <= '0';          
  152.                 oMWR      <= '0';          
  153.                 oWDSEL    <= '0';          
  154.                 oWERF     <= '1';
  155.             when MIN4A => --upisujemo min u R3, a to je u ovom slucaju R3
  156.                 oREGISTERS <= "00011" & "00011" & "-----" & "-----------"; --nije neophodan jer R3 u R3 pisemo, svakako je tamo
  157.                 oALUFN    <= "011010";  --samo propustanje signala
  158.                 oBSEL     <= '0';      
  159.                 oMOE      <= '0';          
  160.                 oMWR      <= '0';          
  161.                 oWDSEL    <= '0';          
  162.                 oWERF     <= '1';
  163.             when MIN4B => --upisujemo min u R3, a to je u ovom slucaju R2
  164.                 oREGISTERS <= "00011" & "00010" & "-----" & "-----------";
  165.                 oALUFN    <= "011010";  --samo propustanje signala
  166.                 oBSEL     <= '0';      
  167.                 oMOE      <= '0';          
  168.                 oMWR      <= '0';          
  169.                 oWDSEL    <= '0';          
  170.                 oWERF     <= '1';
  171.             when MUL4 => --mnozimo minimum sa 4, to pomocu shift left za 2, ovu const prvo moramo upisati u neki reg R8
  172.                 oREGISTERS <= "01000" & "00010" & "0000000000000010"; --preko sabiranja upisujemo 2
  173.                 oALUFN    <= "000000";  --ADD
  174.                 oBSEL     <= '1';      
  175.                 oMOE      <= '0';          
  176.                 oMWR      <= '0';          
  177.                 oWDSEL    <= '0';          
  178.                 oWERF     <= '1';
  179.             when SHL2 => --pomeramo R3 za dva mesta u levo i upismeo u R4
  180.                 oREGISTERS <= "00100" & "00011" & "01000" & "-----------";
  181.                 oALUFN    <= "100000";  --SHL
  182.                 oBSEL     <= '0';      
  183.                 oMOE      <= '0';          
  184.                 oMWR      <= '0';          
  185.                 oWDSEL    <= '0';          
  186.                 oWERF     <= '1';
  187.             when ADD2 => --sabiramo R3 i R4 i upisujemo u R5
  188.                 oREGISTERS <= "00101" & "00011" & "00100" & "-----------";
  189.                 oALUFN    <= "000000";  --ADD
  190.                 oBSEL     <= '0';      
  191.                 oMOE      <= '0';          
  192.                 oMWR      <= '0';          
  193.                 oWDSEL    <= '0';          
  194.                 oWERF     <= '1';
  195.             when ST_MEM => --upisujemo u memoriju na prvu slobodnu lokaciju (8 12 16 tkd 20)
  196.                 oREGISTERS <= "00101" & "11111" & "0000000000010100"; --prvi ni nije bitan jer imamo upis u memoriju
  197.                 oALUFN    <= "000000";  --ADD
  198.                 oBSEL     <= '1';      
  199.                 oMOE      <= '0';          
  200.                 oMWR      <= '1';           --pisemo u memoriju
  201.                 oWDSEL    <= '0';          
  202.                 oWERF     <= '0';
  203.             when others =>
  204.                 oREGISTERS <= "-----" & "-----" & "-----" & "-----------";
  205.                 oALUFN    <= "------";  --operacija u ALU jedinici
  206.                 oBSEL     <= '-';      --iF BSEL = 1 => koristimo konstnatu
  207.                 oMOE      <= '-';          --dozvola za citanje iz memorije za podatke
  208.                 oMWR      <= '-';           --dozvola za pisanje u memoriju za podatke
  209.                 oWDSEL    <= '-';           --da li koristimo rez iz memo ili alu, na 1 je kad je iz memorije
  210.                 oWERF     <= '-';           --dozvola za upis u registre
  211.         end case;
  212.     end process;
  213.  
  214. end architecture;
  215.  
  216.  
RAW Paste Data