⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 自动售货机源程序.txt

📁 自动售货机 l 设计要求: 1.机器有一个投币孔
💻 TXT
字号:
自动售货机源程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity autoseller is
    port( clk,reset    :in std_logic;
          ci1,ci2,ci3  :in std_logic;
          choice1,choice2,choice3 :in std_logic;
          OK,cancel,chanton   :in std_logic;
          Digitube1,Digitube2  :out std_logic_vector(3 downto 0);
          LED1,LED2,LED3,LED4,LED5,LED6  :out std_logic
          );
    end autoseller;
architecture behave of autoseller is
    type state_type is(wait_state,input_state,drink_state,charge_state);
    signal  state       :state_type;
    
    begin
      process(clk,reset)
        variable addset                :std_logic;        
        variable sum1,sum2,price1,price2  :std_logic_vector(3 downto 0);
      begin
          if(reset='0')then
            sum1:="0000";sum2:="0000";
            price1:="0000";price2:="0000";
            addset:='1';
            state<=wait_state;
            LED1<='0';LED2<='0';LED3<='0';LED4<='0';LED5<='0';LED6<='0';
            digitube1<=sum1;digitube2<=sum2;
          elsif(clk'EVENT and clk='1')then
            case state is
              when  wait_state =>
                price1:="0000";price2:="0000";
                digitube1<=sum1;digitube2<=sum2;
                LED3<='0';LED4<='0';LED5<='0';LED6<='0';              
                if(choice3='1')then
                    LED1<='1';  LED2<='1';
                    state<=input_state; addset:='1';
                    price1:="0010";price2:="0000";             
                    end if;
                if(choice2='1')then
                    LED1<='1';LED2<='0';
                    state<=input_state;addset:='1';
                    price1:="0001";price2:="0101";
                       end if;
                if(choice1='1')then
                    LED1<='0';LED2<='1';
                    state<=input_state;addset:='1';
                    price1:="0001";price2:="0000"; 
                       end if;                                         
           when input_state =>
                if(addset='1')then
                  if(ci1='1')then 
                     sum2:=sum2+1;LED6<='0';
                     end if;
                  if(ci2='1')then  
                     sum2:=sum2+5;LED6<='0';
                     end if;
                  if(ci3='1')then  
                     sum1:=sum1+1;LED6<='0';
                     end if;
                  if(sum2>9)then
                     sum1:=sum1+1;sum2:=sum2+6;
                     end if;
                  end if;
                if(sum1>price1 or ((sum1=price1)and(sum2>=price2)))then
                   addset:='0'; 
                   LED3<='1';
                   end if;
                if(OK='1') then
                   LED3<='0';
                   if(sum1>=price1 and sum2>=price2)then 
                        state<=drink_state;LED4<='1';addset:='1';
                   else LED6<='1';
                   end if;
                 end if;
                 if(cancel='1') then
                   state<=charge_state;addset:='1';
                   LED1<='0';LED2<='0';LED3<='0';LED6<='0';
                   end if;
                 digitube1<=sum1;digitube2<=sum2;
               when drink_state =>
                   LED1<='0';LED2<='0';LED3<='0';LED5<='0';LED6<='0';
                     if(sum1>price1 and sum2<price2)then
                        sum1:=sum1-1;sum2:=sum2+10;
                        end if;
                     if(state=drink_state)then
                        sum1:=sum1-price1;sum2:=sum2-price2;
                        end if;
                     state<=charge_state;
                     LED4<='0';
                     digitube1<=sum1;digitube2<=sum2;
               when charge_state=>
                    LED1<='0';LED2<='0';LED3<='0';
                    LED4<='0';LED6<='0';
                    if(sum1=0 and sum2=0 )then                   
                        state<=wait_state;LED5<='0'; 
                        else  state<=charge_state;
                        end if;
                   if(chanton='1')then
                      LED5<='1';
                      if(sum1>0 or sum2>0)then
                          if(sum1>0 )then 
                                  sum1:=sum1-1;                             
                             elsif(  sum2>4  )then
                                  sum2:=sum2-5;
                             elsif( sum2>0 )then
                                  sum2:=sum2-1;
                             end if;
                             digitube1<=sum1;digitube2<=sum2;
                       else LED5<='0';state<=wait_state;
                       end if;
                    else LED5<='0';
                    end if;
                end case;
             end if;
         end process;
   end behave;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -