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

📄 cola.vhd

📁 VHDL源代码下载
💻 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 + -