📄 vending.txt
字号:
entity DRINK_COUNT_VHDL is
port(NICKEL_IN, DIME_IN, QUARTER_IN, RESET: BOOLEAN;
CLK: BIT;
NICKEL_OUT, DIME_OUT, DISPENSE: out BOOLEAN);
end DRINK_COUNT_VHDL;
architecture BEHAVIOR of DRINK_COUNT_VHDL is
signal CURRENT_NICKEL_COUNT,
NEXT_NICKEL_COUNT: INTEGER range 0 to 7;
signal CURRENT_RETURN_CHANGE, NEXT_RETURN_CHANGE : BOOLEAN;
begin
process(NICKEL_IN, DIME_IN, QUARTER_IN, RESET, CLK,
CURRENT_NICKEL_COUNT, CURRENT_RETURN_CHANGE)
variable TEMP_NICKEL_COUNT: INTEGER range 0 to 12;
begin
-- Default assignments
NICKEL_OUT <= FALSE;
DIME_OUT <= FALSE;
DISPENSE <= FALSE;
NEXT_NICKEL_COUNT <= 0;
NEXT_RETURN_CHANGE <= FALSE;
-- Synchronous reset
if (not RESET) then
TEMP_NICKEL_COUNT <= CURRENT_NICKEL_COUNT;
-- Check whether money has come in
if (NICKEL_IN) then
-- NOTE: This design will be flattened, so
-- these multiple adders will be optimized
TEMP_NICKEL_COUNT <= TEMP_NICKEL_COUNT + 1;
elsif(DIME_IN) then
TEMP_NICKEL_COUNT <= TEMP_NICKEL_COUNT + 2;
elsif(QUARTER_IN) then
TEMP_NICKEL_COUNT <= TEMP_NICKEL_COUNT + 5;
end if;
-- Enough deposited so far?
if(TEMP_NICKEL_COUNT >= 7) then
TEMP_NICKEL_COUNT <= TEMP_NICKEL_COUNT - 7;
DISPENSE <= TRUE;
end if;
-- Return change
if(TEMP_NICKEL_COUNT >= 1 or
CURRENT_RETURN_CHANGE) then
if(TEMP_NICKEL_COUNT >= 2) then
DIME_OUT <= TRUE;
TEMP_NICKEL_COUNT <= TEMP_NICKEL_COUNT - 2;
NEXT_RETURN_CHANGE <= TRUE;
end if;
if(TEMP_NICKEL_COUNT = 1) then
NICKEL_OUT <= TRUE;
TEMP_NICKEL_COUNT <= TEMP_NICKEL_COUNT - 1;
end if;
end if;
NEXT_NICKEL_COUNT <= TEMP_NICKEL_COUNT;
end if;
end process;
-- Remember the return-change flag and
-- the nickel count for the next cycle
process
begin
wait until CLK’event and CLK = ’1’;
CURRENT_RETURN_CHANGE <= NEXT_RETURN_CHANGE;
CURRENT_NICKEL_COUNT <= NEXT_NICKEL_COUNT;
end process;
end BEHAVIOR;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -