📄 cola.vhd
字号:
----libray and package declaraction
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
use work.my_pkg.all;--package including 'debounce' component
----input and output pins declaraction
Entity Vendor is
Port( reset:in std_logic;--power reset to another buying
clk:in std_logic;--system clock 1KHz
ok_buy:in std_logic;--push button to confirm buying
coin_5:in std_logic;--push button to throw coin 5 dollar
coin_10:in std_logic;--push button to throw coin 10 dollar
select_cola:in std_logic;--push button to choose drink cola
select_diet:in std_logic;--push button to choose drink diet
cancel_buy:in std_logic;--push button to cancel buying
led_cola_ok:out std_logic;--led to show cola available
led_diet_ok:out std_logic;--led to show diet available
led_cola_sel:out std_logic;--led to show cola choosen
led_diet_sel:out std_logic;--led to show diet choosen
led_buy:out std_logic;--led to show buying confirmed
led_cancel:out std_logic;--led to show buying canceled
led_five:out std_logic_vector(2 downto 0);--leds to show coin_five numbers
led_ten:out std_logic_vector(1 downto 0);--leds to show coin_ten numbers
led_five_return:out std_logic_vector(2 downto 0);--leds to show coin_five returned
led_ten_return:out std_logic_vector(1 downto 0);--leds to show coin_ten returned
led_cola_out:out std_logic;--led to show cola been delivered
led_diet_out:out std_logic);--led to show diet been delivered
end;
----define the signal_structure and _flow of the device
Architecture vendor_arch of vendor is
--global signals flowing among different circuit blocks
signal ok:std_logic;--edged ok_buy
signal cancel:std_logic;--edged cancel_buy
signal money_ok:std_logic;--signal for sufficient money
signal return_clk:std_logic;--twinkling signal for coin returned
signal cola_choice:std_logic;--to maintain the cola_selection status
signal diet_choice:std_logic;--to maintain the diet_selection status
signal total_amount_five:integer range 0 to 15;--total amount of coin five(maxi.=15)
signal total_amount_ten:integer range 0 to 20;--total amount of coin ten(maxi.=20)
signal cola_out:std_logic;--signal shown cola have been delivered
signal diet_out:std_logic;--signal shown diet have been delivered
begin
----to generate 4Hz return_clk via dividing 1024Hz clock by 256
return_clock:Block
Signal count:std_logic_vector(7 downto 0);--free count from 0 to 256
Begin
Process(reset,clk)
Begin
if reset = '1' then count<="00000000";
return_clk<='0';
elsif rising_edge(clk) then
count <= count + "00000001" ;
if count(7)='1' then return_clk<='1';
else return_clk<='0';
end if;
end if;
end process;
end block;
----to count the number and amount of coin 10 and light the leds
coin_10_counting:Block
signal coin10:std_logic;--cleared coin_10 signal to count push-button frequency
signal no_coin_ten:integer range 0 to 2;--no. of thrown coin ten(maxi.=2)
begin
u1:debounce port map(clk=>clk,ext=>coin_10,push_out => coin10);
Process(reset,coin10)
begin
if reset = '1' then total_amount_ten<=0;
no_coin_ten<= 0;
led_ten<= "00";
elsif rising_edge(coin10) then--triggered by edged coin10 signal
total_amount_ten<=total_amount_ten+10;
if no_coin_ten<2 then led_ten(no_coin_ten) <= '1';
no_coin_ten <= no_coin_ten + 1;
else no_coin_ten<=2;--(maxi. no of coin 10=2)
end if;
end if;
end process;
end block;
----to count the number and amount of coin 5 and light the leds
coin_5_counting:Block
signal coin5:std_logic;--cleared coin_5 signal to count push-button frequency
signal no_coin_five:integer range 0 to 3;--no. of thrown coin five(maxi.=3)
begin
u2:debounce port map(clk=>clk,ext=>coin_5,push_out => coin5);
Process(reset,coin5)
begin
if reset = '1' then total_amount_five<=0;
no_coin_five<= 0;
led_five<= "000";
elsif rising_edge(coin5) then--triggered by edged coin10 signal
total_amount_five<=total_amount_five+5;
if no_coin_five<3 then led_five(no_coin_five) <= '1';
no_coin_five <= no_coin_five + 1;
else no_coin_five<=3;--(maxi. no of coin 5=3)
end if;
end if;
end process;
end block;
----to select cola or diet
select_drink:block
begin
Process(reset,clk)
begin
if reset = '1' then led_cola_sel<='0';
led_diet_sel<='0';
elsif rising_edge(clk) then
if select_cola='1' then led_cola_sel<='1';
led_diet_sel<='0';--exclusive double choices
cola_choice<='1';--to maintain the cola_selection status
diet_choice<='0';--exclusive double choices
end if;
if select_diet='1' then led_cola_sel<='0';--exclusive double choices
led_diet_sel<='1';
diet_choice<='1';--to maintain the diet_selection status
cola_choice<='0';--exclusive double choices
end if;
end if;
end process;
end block;
----to check total amount and decide returned coins and twinkle the leds
coin_returned:Block
signal total_amount:integer range 0 to 35;--(maxi. total amount=35)
begin
Process(reset,clk)
begin
if reset = '1' then total_amount<=0;
money_ok<='0';
led_five_return<= (others =>'0');
led_ten_return<= (others =>'0');
elsif rising_edge(clk) then
total_amount<=total_amount_ten + total_amount_five;
if total_amount >=15 then money_ok<='1';
else money_ok<='0';
end if;
if (cancel='1') then--if cancelled, return all coins
for i in 0 to 2 loop
led_five_return(i)<=return_clk;
end loop;
for i in 0 to 1 loop
led_ten_return(i)<=return_clk;
end loop;
elsif (diet_out='1' or cola_out='1') then--return coins after drink delivered
case total_amount is
When 0 to 14 => for i in 0 to 2 loop
led_five_return(i)<=return_clk;
end loop;
for i in 0 to 1 loop
led_ten_return(i)<=return_clk;
end loop;
when 15 => null;
when 20 => led_five_return(0)<=return_clk;
when 25 => led_ten_return(0)<=return_clk;
when 30 => led_ten_return(1)<=return_clk;
led_five_return(1)<=return_clk;
when others=> led_ten_return(0)<=return_clk;
led_ten_return(1)<=return_clk;
end case;
end if;
end if;
end process;
end block;
----to check confirming or canceling buying
ok_or_cancel: block
begin
p1:process(reset,ok_buy)--to maintain the confirming status
begin
if reset = '1' then ok<='0';
led_buy<='0';
elsif rising_edge(ok_buy) then
ok<='1';
led_buy<='1';
end if;
end process;
p2:process(reset,cancel_buy)--to maintain the canceling status
begin
if reset = '1' then cancel<='0';
led_cancel<='0';
elsif rising_edge(cancel_buy) then
cancel<='1';
led_cancel<='1';
end if;
end process;
end block;
----to deliver the selected drink and book the remaining number
give_check: block
signal no_cola:integer range 0 to 20;--bottle no. of remaining cola
signal no_diet:integer range 0 to 20;--bottle no. of remaining diet
begin
cola_out<='1' when (money_ok='1' and ok='1' and cola_choice='1')
else '0';--to deliver cola if necessary
led_cola_out<=cola_out;
diet_out<='1' when (money_ok='1' and ok='1' and diet_choice='1')
else '0';--to deliver diet if necessary
led_diet_out<=diet_out;
cola:Process(reset,cola_out)--to book the bottle no. of remaining cola
begin
if reset = '1' then no_cola<=20;
led_cola_ok<='1';
elsif rising_edge(cola_out) then
no_cola<=no_cola-1;
if no_cola=0 then led_cola_ok<='0';--to show cola empty status
else led_cola_ok<='1';
end if;
end if;
end process;
diet:Process(reset,diet_out)--to book the bottle no. of remaining diet
begin
if reset = '1' then no_diet<=20;
led_diet_ok<='1';
elsif rising_edge(diet_out) then
no_diet<=no_diet-1;
if no_diet=0 then led_diet_ok<='0';--to show diet empty status
else led_diet_ok<='1';
end if;
end if;
end process;
end block;
-----------------------------------------------------
end vendor_arch;
------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -