课程设计题目:自动售货机控制系统的设计目的与任务:(1)进一步掌握MAX+PLUSⅡ软件的使用方法;(2)会使用VHDL语言设计小型数字电路系统;(3)掌握应用MAX+PLUSⅡ软件设计电路的流程;(4)掌握自动售货机的设计方法;(5)会使用GW48实验系统。
内容和要求:设计一个简易的自动售货机,它能够完成钱数处理、找零、显示、退币等功能。
(1)用3个键表示3种钱,再用3个键表示3种物品。
(2)用2个数码管显示输入的钱数,再用2个数码管显示所找的钱数,以元为单位。
(3)买东西时,先输入钱,用数码管显示钱数,再按物品键,若输入的钱数大于物品的价格,用数码管显示所找的钱数,并用发光二极管表示购买成功。
(4)若输入的钱数少于物品的价格,用数码管显示退出的钱数,并用发光二极管表示购买失败。
设计内容(原理图以及相关说明、调试过程、结果)一、系统设计方案根据系统要求,系统的组成框图如图1所示。
图1 系统组成框图系统按功能可分为分频模块、控制模块和译码输出模块。
(1)分频模块的作用是获得周期较长的时钟信号,便于操作,且不会产生按键抖动的现象。
其原理是定义两个中间信号Q、DIV_CLK,Q在外部时钟CLK的控制下循环计数,每当计数到一个设定的值时DIV_CLK的值翻转,最后将DIV_CLK赋给NEW_CLK即可,改变设定值可改变分频的大小。
(a2)控制模块是这个系统的核心模块,它具有判断按键、计算输入钱数总和、计算找零、控制显示四个作用。
它的工作原理是每当时钟上升沿到来时,判断哪个按键按下,若按下的是钱数键,则将钱数保存于中间信号COIN,若下次按下的仍是钱数键,COIN 的值则加上相应的值并显示于数码管;当物品键按下时,则将COIN的值与物品价格进行比较,然后控制找零。
(3)由于钱数可能大于9,所以译码显示模块的作用就是将钱数译码后用两个数码管显示,这样方便观察。
根据各个功能模块的功能并进行整合,可得到一个完整的自动售货机系统的整体组装设计原理图,如图2所示。
图2 设计原理图二、系统主要VHDL源程序(1)分频器的源程序(外部时钟选用3MHz,实现3万分频)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY CLKGEN ISPORT(CLK:IN STD_LOGIC;NEWCLK:OUT STD_LOGIC);END CLKGEN;ARCHITECTURE BEHA VE OF CLKGEN ISSIGNAL Q:INTEGER RANGE 0 TO 14999;SIGNAL DIVCLK: STD_LOGIC;BEGINPROCESS(CLK)BEGINIF CLK'EVENT AND CLK='1' THENIF Q < 14999 THEN Q <=Q+1;ELSE DIVCLK <= NOT DIVCLK;Q <=0;END IF;END IF;END PROCESS;NEWCLK <= DIVCLK;END BEHA VE;(2)自动售货机控制器源程序(3种钱数为1元、2元、5元;3种物品的价格为2元、5元、10元)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SHOUHUOJI ISP ORT ( CLK: IN STD_LOGIC;COIN1: IN STD_LOGIC; --1元信号COIN2: IN STD_LOGIC; --2元信号COIN3: IN STD_LOGIC; --5元信号PRICE1: IN STD_LOGIC; --2元商品PRICE2: IN STD_LOGIC; --5元商品PRICE2: IN STD_LOGIC; --5元商品PRICE3: IN STD_LOGIC; --10元商品Y0: OUT STD_LOGIC; --购买成功信号Y1: OUT STD_LOGIC; --退币信号MONEY: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);PAYBACK: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END SHOUHUOJI;ARCHITECTURE BEHA V OF SHOUHUOJI ISSIGNAL COIN: STD_LOGIC_VECTOR(3 DOWNTO 0); --保存钱数SIGNAL COUT: STD_LOGIC_VECTOR(3 DOWNTO 0); --保存找零BEGINPROCESS(CLK)BEGINIF CLK'EVENT AND CLK='1' THENIF COIN1='1' THEN COIN <= COIN+1; Y0<='0';Y1<='0';ELSIF COIN2='1' THEN COIN <= COIN+2; Y0<='0';Y1<='0';ELSIF COIN3='1' THEN COIN <= COIN+5; Y0<='0';Y1<='0';ELSIF PRICE1='1' THENIF COIN >= "0010" THEN Y0<='1';Y1<='0';COUT<=COIN-2;ELSE Y0<='0';Y1<='1';COUT<=COIN;END IF;ELSIF PRICE2='1' THENIF COIN >= "0101" THEN Y0<='1';Y1<='0';COUT<=COIN-5;ELSE Y0<='0';Y1<='1';COUT<= COIN;END IF;ELSIF PRICE3='1' THENIF COIN >= "1010" THEN Y0<='1';Y1<='0';COUT<=COIN-10;ELSE Y0<='0';Y1<='1';COUT<=COIN;END IF;END IF;END IF;END PROCESS;MONEY<=COIN; -- 输入的钱数PAYBACK<=COUT; -- 找零END BEHA V;(3)译码显示源程序(总钱数应小于16元)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY XIANSHI ISPORT ( DIN: IN STD_LOGIC_VECTOR(3 DOWNTO 0);DOUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END XIANSHI;ARCHITECTURE BEHA V OF XIANSHI ISBEGINPROCESS(DIN)BEGINCASE DIN ISWHEN "0000"=> DOUT<="00000000";WHEN "0001"=> DOUT<="00000001";WHEN "0010"=> DOUT<="00000010";WHEN "0011"=> DOUT<="00000011";WHEN "0100"=> DOUT<="00000100";WHEN "0101"=> DOUT<="00000101";WHEN "0110"=> DOUT<="00000110";WHEN "0111"=> DOUT<="00000111";WHEN "1000"=> DOUT<="00001000";WHEN "1001"=> DOUT<="00001001";WHEN "1010"=> DOUT<="00010000";WHEN "1011"=> DOUT<="00010001";WHEN "1100"=> DOUT<="00010010";WHEN "1101"=> DOUT<="00010011";WHEN "1110"=> DOUT<="00010100";WHEN "1111"=> DOUT<="00010101";WHEN OTHERS=> DOUT<="00000000";END CASE;END PROCESS;END BEHA V;三、系统仿真与硬件验证(1)系统的有关仿真1)分频电路的仿真如图3所示,为了便于仿真,在仿真时采用20分频,由图可看出每经过10个外部时钟,新时钟翻转一次,实现了分频。
图3 分频器仿真结果图2)控制电路的仿真如图4、图5、图6所示。
图4 输入7元,购买5元商品,找零2元,Y0显示购买成功图5 输入13元,购买10元商品,找零3元,Y0显示购买成功图6 输入7元,购买10元商品, Y1显示购买失败,退币7元3)显示电路的仿真如图7所示,当大于9时分开显示。
图7 显示电路仿真结果系统的硬件验证应用GW48实验系统,选择实验电路结构图NO.5,管脚定义如下:CLK接CLOCK1 、COIN1 接PIO0、COIN2接PIO1、COIN3接PIO2、PRICE1接PIO3、PRICE2接PIO4、PRICE3接PIO5;MONEY[7..0] 接PIO16~PIO23(数码管1、数码管2)、PAYBACK[7...0] 接PIO24~PIO31(数码管3、数码管4)、Y0接PIO8(二极管D1)、Y1接PIO9(二极管D2)。