石家庄经济华信学院
数字逻辑课程设计报告
题 目 简易售货机的设计与实现B 姓 名 学 号 班 号 指导老师 成 绩
2015年6月
1. 设计内容
(1)自动售货机可销售橡皮(0.5元)、铅笔(1元)、直尺(1.5元)、笔记本(2元)4
种商品,数量无限。
(2)只能投入1元或5角硬币,当投入的币值等于或大于商品的价钱且确认购买时,两个输出口分别输出购买的商品和找零;若取消购买,退回投入的硬币,零币无限;顾客一次只能购买一种商品的一个,若需要更多商品,需要重复操作。 1) 基本功能:商品选择、投币购买、出货及找零或退钱。
2) 显示功能:三个LED数码管显示商品的价格,投入的钱数,找零。
2. 系统总体设计
选择 商品 投币 退钱 enc 出货 找零 ens clr 显示 选择器 reset clk
3. 商品选择模块的设计
(1) 商品选择模块元件图及输入输出描述(包括每个信号名字)
商品选择的元件图符
输入端:reset是复位信号。en是使能端。eraser,pencil,ruler,notebook是商品的种类。
输出端:price为中间变量,是商品的价格。shiwei输出的是价格的十位。gewei输出的是价格的各位。
(2) 商品选择模块功能描述
商品选择模块是对商品进行选择。当reset =0,en=1时,系统正常工作。选择哪种商品,
哪种商品为1,输出的是商品的价格。shiwei输出的是价格的十位。gewei输出的是价格的各位。 (3) 源代码
LIBRARY ieee;
USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL;
ENTITY select_goods IS PORT (
reset,en,eraser,pencil,ruler,notebook : IN STD_LOGIC;
shiwei: OUT integer range 0 to 9; gewei:OUT integer range 0 to 9 );
END select_goods;
ARCHITECTURE arc1 OF select_goods IS
signal goods:std_logic_vector(3 downto 0); BEGIN
goods<=eraser&pencil&ruler¬ebook; process(reset,en)
VARIABLE prices:integer range 0 to 20; begin
IF reset='0'and en='1' THEN IF goods=\ prices:=5;
ELSIF goods=\ prices:=10;
ELSIF goods=\ prices:=15;
ELSIF goods=\ prices:=20; ELSE
prices:=0; END IF; END IF;
shiwei<=prices/10; gewei<=prices rem 10; end process;
END arc1;
(4) 测试及分析( 如图一)
图一
当en=0,reset=1时,模块正常工作。当eraser=1时,shiwei=0,gewei=5,价钱正好是5角;当notebook=1时,shiwei=2,gewei=0,价钱正好是2元。
4. 投币模块
(1) 投币模块元件图及输入输出描述(包括每个信号名字)
投币模块原件图符
输入端;reset是复位信号,clk是时钟脉冲,en是使能端,coin5表示投进5毛,coin10表示投进1块,
输出端:total是中间变量,表示投进总的钱数。Shiwei1表示总钱数的十位,gewei表示总钱数的各位。
(2) 子模块功能描述
投币模块记录的是投入的总钱数,reset=0,en=1,clk为上升沿是正常工作。投进一个5
毛,总的钱数加5,投进一个1块,总的钱数加10.shiwei1表示总钱数的十位,gewei1表示的是总钱数的各位。
(3) 源代码(若使用系统提供的器件可省略) LIBRARY ieee;
USE ieee.std_logic_1164.ALL; USE ieee.std_logic_arith.ALL; USE ieee.std_logic_unsigned.ALL;
ENTITY coin IS PORT (
reset,clk,en,coin5,coin10 : IN STD_LOGIC;
shiwei1: out integer range 0 to 9; gewei1: out integer range 0 to 9 ); END coin;
ARCHITECTURE arc1 OF coin IS
signal coin15:std_logic_vector(1 downto 0); begin
coin15<=coin5&coin10; process(clk,reset)
VARIABLE total:integer range 0 to 20; begin
if (reset='0' and en='1') then if clk' event and clk='1' then if coin15=10 then total:=total+5; elsif coin15=01 then total:=total+10; else total:=total; end if; end if; end if;
shiwei1<=total/10; gewei1<=total rem 10; end process; END arc1;
(4) 测试及分析(如图2)
图2
当clk为上升沿,en=1,reset=0时,模块正常工作。当coin5=1时,shiwei=0,gewei=1,total=5毛。又投进一个一块,shiwei=1,gewei=5,total=15.
5. 数据选择器模块设计
(1) 数据选择模块元件图及输入输出描述(包括每个信号名字)
数据选择模块元件图符
输入端:a为控制端,d0[3..0], d1[3..0], d2[3..0], d3[3..0]为输入端,f1[3..0],f2[3..0]为输出端。当a=1,f1=d0,f2=d1.当a=0,f1=d2,f2=d3
(2) 子模块功能描述
这是一个4选2的数据选择模块,当a=1,f1=d0,f2=d1.当a=0,f1=d2,f2=d3。
(3) 源代码
LIBRARY ieee;
USE ieee.std_logic_1164.all; ENTITY max42 IS PORT(a:IN BIT;
d0,d1,d2,d3: in integer range 0 to 9; f1,f2:OUT integer range 0 to 9 ); END max42;
ARCHITECTURE arcl OF max42 IS BEGIN
process(a) begin
if a='1' then f1<=d0;
f2<=d1; else
f1<=d2; f2<=d3; end if;
end process; end arcl;
(4)测试及分析(如图3)
图3
当a=1,f1=d0=5,f2=d1=2; 当a=0,f1=d2=1,f2=d3=4.
6. 显示模块分析设计
(1)显示模块元件图及输入输出描述(包括每个信号名字)
bcd[3..0]是输入端,dout[6..0]是输出端。
(2)子模块功能描述
这是一个七段显示模块, 当bcd=0000时,dout[6..0]=1111110,显示的是字符0,当bcd= 0001时,dout[6..0]=1111110 ,显示的是字符1.
(3)源代码
LIBRARY ieee;
USE ieee.std_logic_1164.ALL; ENTITY xianshi IS PORT ( bcd : IN STD_LOGIC_VECTOR(3 DOWNTO 0); dout : OUT STD_LOGIC_VECTOR(6 DOWNTO 0)
);
end xianshi;
ARCHITECTURE a OF xianshi IS BEGIN WITH bcd SELECT dout<=\ \ \ \ \WHEN others; END a;
(4)测试及分析(如图4)
图4
当bcd=5时,dout=1101101,表示的字符是5;当bcd=1时,dout=0110000,表示的字符是1.
7. 控制模块设计
(1)控制模块元件图及输入输出描述(包括每个信号名字)
输入端:start=0,clk为上升沿时正常工作。Ok_buy表示确认购买,cancel_buy表示取消购买,geiwei,shiwei表示的是价格的个位和十位。Gewei和shiwei表示的是投入钱数的个位和十位。 输出端:engoods表示的是允许选商品,encoin表示允许投币,clrcoin表示清零钱数,outgood是出货,backcoins表示的是找零。
(2)子模块功能描述
如图(5)
y 选择品 Selectgoods N Incoins N N 确认购买 取消购买 y y Outgoods_coin backcoin 图5简易售货机的ASM图
(4) 源代码
LIBRARY ieee;
USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all;
ENTITY control is PORT (
start,clk,ok_buy,cancel_buy : IN STD_LOGIC;
gewei,shiwei,gewei1,shiwei1 : IN integer range 0 to 9; engoods,encoin,clrcoin,outgoods: OUT STD_LOGIC; backcoins : OUT integer range 0 to 9 );
END control;
ARCHITECTURE one OF control IS
Type state_type is (selegoods, incoins, outgoods_coin,back_coin); signal state: state_type; BEGIN
PROCESS (start,clk) begin
IF start = '1' THEN state <= selegoods;
ELSIF clk'event AND clk = '1' THEN case state is when selegoods =>
IF (shiwei*10+gewei)=0 THEN state<=selegoods; else
state<= incoins; end if;
when incoins =>
IF ok_buy='1' THEN
state<= outgoods_coin; end if;
IF cancel_buy='1' THEN
state<= back_coin; END IF;
when others => state<=selegoods; end case; end if;
end process;
process(start,shiwei,gewei,shiwei1,gewei1) BEGIN
case state is
when selegoods =>engoods<='1';encoin<='0';clrcoin<='1';outgoods<='0';backcoins<=0; when incoins => engoods<='0';encoin<='1';clrcoin<='0';outgoods<='0';backcoins<=0;
when outgoods_coin =>
IF (shiwei1*10+gewei1)>= (shiwei*10+gewei)THEN
engoods<='0';encoin<='0';clrcoin<='0';outgoods<='1';backcoins<=((shiwei1*10+gewei1)-(shiwei*10+gewei));
else
engoods<='0';encoin<='0';clrcoin<='0';outgoods<='0';backcoins<=(shiwei1*10+gewei1);
END IF;
when back_coin =>
engoods<='0';encoin<='0';clrcoin<='0';outgoods<='0';backcoins<=(shiwei1*10+gewei1);
end case ; END PROCESS; END one;
8. 顶层模块连线设计
(1) 顶层连线图
(2) 测试及分析(如图6)
图6
当reset=0,clk为上升沿时,系统正常工作。买了一个铅笔,投进了一块钱,找了5毛,在eraser=1,coun10=1,dout0=1111110,dout1=0110000,表示的投进的钱数,outgoods=1.
9. 总结
(1)在写select_goods模块时,保存时没有以实体的名字保存,导致编译失败。改正后,在波形
仿真时,没有把它设置成顶层实体,导致仿真时找不到这个文件,改正后,才仿真成功。
(2)在写coin模块时,用了顺序语句里的if语句,编译失败。通过翻阅了书本之后,发现了错误,知道了else if连用之后,就变成了elsif,用了几个if,就要用几个end if.
(3) 在写control模块时,编译成功,但仿真的结果总是跟我预想的结果不一样。我以为是VHDL语言编写错误,又把我的思路整理了一遍,VHDL稍微做了一些改动,结果还是错,这时我觉得是我的波形图画错了,又重新画了一下波形图之后,终于仿真成功。
通过本次课程设计,我对Verilog HDL语言有了更深刻的了解,能够比较灵活地运用它来实现我们所想要其实现的功能。在实验中,我也遇到了很多困难,不过我通过翻阅资料,请教他人都一一解决了,也对Quartus51软件操作更加熟练。
在设计过程中,自己总是粗心,不注重细节。编写部件的VHDL语言时,太注重形式。 设计成功时很开心,也知道了遇到问题我们不能灰心、烦躁,甚至放弃,而要静下心来仔细思考,分部检查,找出最终的原因进行改正,这样才会有进步,才会一步步向自己的目标靠近,才会取得自己所要追求的成功。