Advertisement
Mihailo21

Printer

Feb 11th, 2024
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 3.72 KB | None | 0 0
  1. ---------------------------------------------
  2. -- Ime i prezime:
  3. -- Broj indeksa:
  4. ---------------------------------------------
  5. library ieee;
  6. use ieee.std_logic_1164.all;
  7. use ieee.std_logic_unsigned.ALL;
  8.  
  9. entity Printer is port (
  10.     iCLK        : in  std_logic;
  11.     iRST        : in  std_logic;
  12.     iPRINT      : in  std_logic;
  13.     iADD_PAPER  : in  std_logic;
  14.     iAMOUNT     : in  std_logic_vector(7 downto 0);
  15.     oPRINT      : out std_logic;
  16.     oERROR      : out std_logic
  17.     );
  18. end entity;
  19.  
  20. architecture Behavioral of Printer is
  21.   signal sEMPTY : std_logic;
  22.   signal sPAPER_EN : std_logic;
  23.   signal sSLEEP_EN: std_logic;
  24.   signal sSLEEP_TC: std_logic;
  25.   signal sPRINT_EN: std_logic;
  26.   signal sPRINT_TC: std_logic;
  27.   signal sSLEEP_CNT : std_logic_vector(5 downto 0); -- modul 60
  28.   signal sPRINT_CNT : std_logic_vector(3 downto 0); --modul 15
  29.   signal sPAPER_CNT : std_logic_vector(7 downto 0);
  30.  
  31.   type state_type is (IDLE, SLEEP, CHECK_PAPER, PRINT, ERROR);
  32.   signal state, state_next : state_type;
  33.   ---
  34.    
  35. begin
  36.     --registar stanja (asinhroni reset)
  37.     process(iCLK,iRST) begin
  38.    
  39.         if(iRST ='1') then
  40.             state <= IDLE;
  41.         elsif(rising_edge(iCLK)) then
  42.             state <= state_next;
  43.         end if;
  44.     end process;
  45.  
  46.     --automat
  47.     process(state,state_next,iPRINT,sSLEEP_TC,sEMPTY,sPRINT_TC) begin
  48.    
  49.     case (state) is
  50.    
  51.     when IDLE =>
  52.         if (iPRINT = '1') then
  53.             state_next <= CHECK_PAPER;
  54.         elsif(sSLEEP_TC = '1') then
  55.             state_next <= SLEEP;
  56.         else
  57.             state_next <= IDLE;
  58.         end if;
  59.        
  60.     when SLEEP =>
  61.         if(iPRINT = '1') then
  62.             state_next <= IDLE;
  63.         else
  64.             state_next <= SLEEP;
  65.         end if;
  66.        
  67.     when CHECK_PAPER =>
  68.         if(sEMPTY = '0') then
  69.             state_next <= PRINT;
  70.         elsif(sEMPTY = '1') then
  71.             state_next <= ERROR;
  72.         else
  73.             state_next <= CHECK_PAPER;
  74.         end if;
  75.        
  76.     when ERROR =>
  77.         state_next <= IDLE;
  78.        
  79.     when PRINT =>
  80.         if(sPRINT_TC = '1') then
  81.             state_next <= IDLE;
  82.         else
  83.             state_next <= PRINT;
  84.         end if;
  85.        
  86.     when others =>
  87.         state_next <= IDLE;
  88.    
  89.     end case;
  90.    
  91.     end process;
  92.    
  93.     --funkcija izlaza automata
  94.    
  95.     oPRINT <= '1' when state = PRINT else '0';
  96.     oERROR <= '1' when state = ERROR else '0';
  97.     sSLEEP_EN <= '1' when state = IDLE else '0';
  98.     sPRINT_EN <= '1' when state = PRINT else '0';
  99.     sPAPER_EN <= '1' when state = CHECK_PAPER else '0';
  100.    
  101.     --brojac 1 (brojac za neaktivno stanje)
  102.     process(iCLK,iRST) begin
  103.    
  104.         if(iRST = '1') then
  105.             sSLEEP_CNT <= (others=>('0'));
  106.             sSLEEP_TC <= '0';
  107.         elsif(rising_edge(iCLK)) then
  108.             if(sSLEEP_EN = '1') then
  109.                 if(sSLEEP_CNT = "111011") then -- 59 binarno
  110.                     sSLEEP_CNT <= (others=>('0'));
  111.                     sSLEEP_TC <= '1';
  112.                 else
  113.                     sSLEEP_CNT <= sSLEEP_CNT +1;
  114.                     sSLEEP_TC <= '0';
  115.                 end if;
  116.             else
  117.                 sSLEEP_CNT <= (others=>('0'));
  118.                 sSLEEP_TC <= '0';
  119.             end if;
  120.         end if;
  121.     end process;
  122.    
  123.     --brojac 2 (brojac za stampanje)
  124.     process(iCLK,iRST) begin
  125.        
  126.         if(iRST = '1') then
  127.             sPRINT_CNT <= (others=>('0'));
  128.             sPRINT_TC <= '0';
  129.         elsif(rising_edge(iCLK)) then
  130.             if(sPRINT_EN = '1') then
  131.                 if(sPRINT_CNT = "1110") then -- 14 binarno
  132.                     sPRINT_CNT <= "0000";
  133.                     sPRINT_TC <= '1';
  134.                 else
  135.                     sPRINT_CNT <= sPRINT_CNT +1;
  136.                     sPRINT_TC <= '0';
  137.                 end if;
  138.             else
  139.                 sPRINT_CNT <= "0000";
  140.                 sPRINT_TC <= '0';
  141.             end if;
  142.         end if;
  143.     end process;
  144.    
  145.    
  146.     --brojac 3(brojac za papir)
  147.     process(iCLK,iRST) begin
  148.    
  149.         if(iRST = '1') then
  150.             sPAPER_CNT <= (others=>('0')); --nisam siguran za ovo
  151.             sEMPTY <= '1';
  152.         elsif(rising_edge(iCLK)) then
  153.             if(sPAPER_EN = '1') then
  154.                 if(iADD_PAPER = '1') then
  155.                     sPAPER_CNT <= sPAPER_CNT + iAMOUNT;
  156.                 end if;
  157.                
  158.                 if(sPAPER_CNT = "00000000") then
  159.                     sEMPTY <= '1';
  160.                 else
  161.                     sEMPTY <= '0';
  162.                     sPAPER_CNT <= sPAPER_CNT - 1;
  163.                 end if;
  164.             end if;
  165.         end if;
  166.     end process;
  167.    
  168. end Behavioral;
  169.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement