📄 vending_machine.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 + -