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

📄 vending_machine.vhd

📁 自动售货机模型
💻 VHD
字号:
library ieee;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity vending_machine is
       port(
       price,quantity:in std_logic_vector(3 downto 0);
       clk,set_init,choose,purchase,operate_finish:in std_logic;
       insert_dollar05,insert_dollar10:in std_logic;
       show_price_data,show_quantity_data:out std_logic_vector(6 downto 0);
       show_price_cs,show_quantity_cs:out std_logic:='1';
       merchandise_indication_a:out std_logic;
       merchandise_indication_b:out std_logic;       merchandise_indication_c:out std_logic;       merchandise_indication_d:out std_logic;
       merchandise_out:out std_logic;
       money_return_05:out std_logic;
       money_return_10:out std_logic;
       thank_return:out std_logic                 );
end  vending_machine;   

architecture rtl of  vending_machine is
 type ram_type is array(0 to 3)of std_logic_vector(7 downto 0); 
 signal ram_store:ram_type;
 signal item:std_logic_vector(1 downto 0);
 signal insert_dollar:std_logic;
  signal purchase_status:std_logic_vector(1 downto 0);
 signal buyer_money:std_logic_vector(3 downto 0);
 signal buyer_number:std_logic_vector(3 downto 0);
 signal merchandise_money:std_logic_vector(3 downto 0); signal merchandise_number:std_logic_vector(3 downto 0);
 signal number:std_logic_vector(3 downto 0);
 signal money:std_logic_vector(3 downto 0);
 signal back_money:std_logic_vector(3 downto 0); 

  begin


  
  process(clk,set_init,choose,price,quantity,item)
  begin
  if(clk'event and clk='1') then
  if(set_init='1') then
  ram_store(conv_integer(item))<=price&quantity;
  end if;
  end if;
  end process;
  
  process(choose)
  begin
  if(choose'event and choose='1') then
  
  item<=item+'1';

  end if;
  end process;
  
   process(purchase)
  begin
  if(purchase'event and purchase='1') then
  
purchase_status<=purchase_status+1;

  end if;
  end process;
  
  process(clk,insert_dollar05,insert_dollar10)
  begin
if(clk'event and clk='1') then
  insert_dollar<=insert_dollar05 or insert_dollar10;
end if;
  end process;
  
  process(insert_dollar)
  begin
   if(insert_dollar'event and insert_dollar='1') then
     if(set_init='0' and (purchase_status="01" or purchase_status="11")) then 
       if(insert_dollar05='1' and buyer_money<="1001")  then buyer_money<=buyer_money+1;
       elsif(insert_dollar10='1' and buyer_money<="1001") then buyer_money<=buyer_money+2;
       end if;
  end if;
  end if;
  end process;
  
 process(clk)
  begin
  if(clk'event and clk='1')then
   if(set_init='0')then 
merchandise_money<=ram_store(conv_integer(item))(7 downto 4); 
merchandise_number<=ram_store(conv_integer(item))(3 downto 0);  
end if;  
end if;                   
end process;


  
  process(set_init,purchase_status,buyer_money,merchandise_money,price)
  begin
 if(set_init='0')then 
  if(purchase_status="01" or purchase_status="11")then money<=buyer_money;number<=buyer_number;
  else money<=merchandise_money;number<=merchandise_number;
  end if;
  else money<=price;number<=quantity;
  end if;
  end process;
  
 process(clk)
  begin
  if(clk'event and clk='1' and operate_finish='1') then
   if(set_init='0' and (purchase_status="01" or purchase_status="11"))then 
      if(buyer_money>=merchandise_money) then 
       merchandise_out<='1';
       back_money<=buyer_money-merchandise_money;
       else  merchandise_out<='0';back_money<="0000";
      end if;
      else merchandise_out<='0';back_money<="0000";
   end if;   
 end if;
  end process;
  
 process(back_money)

  begin
  case back_money is
  when"0000"=>money_return_05<='0';money_return_10<='0';thank_return<='0';
  when"0001"=>money_return_05<='1';money_return_10<='0';thank_return<='0';
  when"0010"=>money_return_05<='0';money_return_10<='1';thank_return<='0';
  when"0011"=>money_return_05<='1';money_return_10<='1';thank_return<='0';
  when others=>money_return_05<='1';money_return_10<='1';thank_return<='1';
  end case;
  end process;
  
  process(item)
  begin
case item is
when"00"=>merchandise_indication_a<='1';
          merchandise_indication_b<='0';
          merchandise_indication_c<='0';          merchandise_indication_d<='0';
          
when"01"=>merchandise_indication_a<='0';
          merchandise_indication_b<='1';
          merchandise_indication_c<='0';
          merchandise_indication_d<='0';
          
when"10"=>merchandise_indication_a<='0';
          merchandise_indication_b<='0';
          merchandise_indication_c<='1';
          merchandise_indication_d<='0';
          
when"11"=>merchandise_indication_a<='0';
          merchandise_indication_b<='0';
          merchandise_indication_c<='0';
          merchandise_indication_d<='1';  
           
end case;                           
          
end process;

  process(money)
  begin
case money is
when"0000"=>show_price_data<="0000001";
when"0001"=>show_price_data<="1001111";
when"0010"=>show_price_data<="0010010";
when"0011"=>show_price_data<="0000110";when"0100"=>show_price_data<="1001100";
when"0101"=>show_price_data<="0100100";when"0110"=>show_price_data<="0100000";
when"0111"=>show_price_data<="0001111";
when"1000"=>show_price_data<="0000000";
when"1001"=>show_price_data<="0000100";
when others=>show_price_data<="1111111";
end case;                           
end process;

  process(number)
  begin
case number is
when"0000"=>show_quantity_data<="0000001";
when"0001"=>show_quantity_data<="1001111";
when"0010"=>show_quantity_data<="0010010";
when"0011"=>show_quantity_data<="0000110";
when"0100"=>show_quantity_data<="1001100";
when"0101"=>show_quantity_data<="0100100";
when"0110"=>show_quantity_data<="0100000";
when"0111"=>show_quantity_data<="0001111";
when"1000"=>show_quantity_data<="0000000";
when"1001"=>show_quantity_data<="0000100";
when others=>show_quantity_data<="1111111";
end case;                           
end process; 

end rtl;

⌨️ 快捷键说明

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