EDA地铁售票系统长沙理工.docx
《EDA地铁售票系统长沙理工.docx》由会员分享,可在线阅读,更多相关《EDA地铁售票系统长沙理工.docx(19页珍藏版)》请在冰点文库上搜索。
EDA地铁售票系统长沙理工
模拟地铁售票系统实验报告
学院:
计算机与通信工程学院班级:
通信工程
参与人员:
郭xx(组长)2012xxxxx
吴xx2012xxxxx
赵xx2012xxxxxxxx
刘xx2012xxxxxxx
徐x2012xxxxxxx
题目:
模拟地铁售票系统。
主要内容:
利用VHDL语言设计地铁售票系统的核心功能MAXPLUSII软件作为发平台,设计城市地铁售票系统程序并进行仿真。
使其实现选站、选择张数、出票、找零等功能。
设计要求
功能描述:
用于模仿地铁售票的自动售票,完成地铁售票的核心控制功能。
功能要求:
售票机有2个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是1元的硬币,纸币的识别范围是1元、2元,5元,10元。
乘客可以连续多次投入钱币。
乘客可以选择的种类为2——5元,乘客一次只能选择一个出站口。
购买车票时,乘客先选择出站名,然后选择所需的票数,再进行投币,投入的钱币达到所需金额时,售票机自动出票,并找出余额,本次交易结束,等待下一次的交易。
在投币期间,乘客可以按取消键取消本次操作,钱币自动退出。
课题分析
1.买车票时,乘客按“开始选择”按钮,接着选择出站口接着选择购票数量(根据提示,一次购票数限制在6张以内);然后按“开始投币”按钮,投入钱币;当投入的钱币达到所需金额时,售票机自动出票,并找出余额。
考虑到控制整个售票机的物理体积,余额将全部采用1元硬币的形式找出。
2.选择出站口或投币过程中,乘客都可以按“取消”按钮取消该次交易。
选择出站口的过程中,若按“取消”,则售票机直接回到初始状态;投币过程中,若按“取消”,则售票机将乘客已经投入的钱币全部退出,再回到初始状态。
3.客一次只能选择一个出站口,根据乘坐的站数确定票价。
假设乘客购票所在站到终点站共有19站。
若乘坐1--5站,则票价为2元/张;若乘坐6-10站,则票价为3元/张。
19个站用长度位5的二进制向量编码表示,即00001表示乘坐1站,00010表示乘坐2站,依次类推,10011表示乘坐19站(到终点站)。
4.票机有1个进币端口。
硬币口可识别1元硬币,用单独信号的上升沿方式表示,纸币口类似,用长度为4的二进制编码方式表示。
乘客可以连续多次投入钱币,并且可以以任意顺序投入硬币和纸币
系统流程图
1选站状态当“确认”信号为高电平时,输入站点信号(0-19)被读入有效,确认票型,赋给相应暂存变量并进入选票数状态。
当站点为前4站时,票为2元票,后每加5个站加一块钱。
否则当“确认”信号为低电平,所处状态不变,系统没有录入有效信息。
直至用户按下“确认”键前,选择的站点后选的覆盖先选的。
②选票数状态当“确认”信号为高电平时,输入票数(1-6)信号被读入有效,赋给相应暂存变量,计算出应付总金额,并进入付款状态。
这里需参考选站状态时确定的票类型计算总金额。
否则当“确认”信号为低电平,所处状态不变,系统没有录入有效信息。
直至用户按下“确认”键前,选择的票数后选的覆盖先选的。
③付款状态用户每投入钱币,系统更新“已付金额”。
若“已付金额”不小于“应付金额”,系统进入找零及出票状态。
若不足,系统任处于付款准备状态,直至金额足够。
若中途用户按下“取消”键,系统进入退款准备状态。
④退款准备状态系统计算出应退金额,并按钱的面值从大到小的优先级算出每种面值的钞票应该付几张。
系统进入结束状态。
⑤找零及出票准备状态系统计算出应找金额,并按钱的面值从大到小的优先级算出每种面值的钞票应该付几张。
系统计算出出票的种类和票数。
系统进入结束状态。
系统并将所有数据清除,进入下一个购票环节。
程序代码:
modulesubway_tb;
regrst;
regclk;
regget;
regcancel;
reg[4:
0]sel_in;
reg[4:
0]sel_out;
reg[3:
0]count;
regci_1;
regci1;
regci5;
regci10;
wireco1;
wireco2;
wireco3;
wireco4;
wirecak1;
regget_1;
subwaysu(
.rst(rst),
.clk(clk),
.get(get),
.cancel(cancel),
.sel_in(sel_in),
.sel_out(sel_out),
.ci_1(ci_1),
.ci1(ci1),
.ci5(ci5),
.ci10(ci10),
.co1(co1),
.co2(co2),
.co3(co3),
.co4(co4),
.cak1(cak1),
.get_1(get_1),
.count(count)
);
initial
begin
rst=1;
//forever#10clk=!
clk;
cancel=0;
#100;
rst=0;
sel_in=5'b00111;
sel_out=5'b00001;
#100;
count=4'b0011;
#100;
get_1=1'b1;
get=1'b1;
ci_1=1'b1;
ci10=1'b1;
ci5=1'b1;
#150;
count=4'b0000;
ci_1=1'b0;
ci10=1'b0;
ci5=1'b0;
#100;
sel_in=5'b00000;
sel_out=5'b00000;
#3000
get=1'b0;
get_1=1'b0;
//----------------
rst=1;
//forever#10clk=!
clk;
cancel=0;
#100;
rst=0;
sel_in=5'b00111;
sel_out=5'b00001;
#100;
count=4'b0011;
#100;
get_1=1'b1;
get=1'b1;
ci10=1'b1;
#150;
count=4'b0000;
cancel=1'b1;
ci_1=1'b0;
ci10=1'b0;
ci5=1'b0;
end
endmodule
modulesubway(
rst,
clk,
get,
get_1,
cancel,
sel_in,
sel_out,
count,
ci_1,
ci1,
ci5,
ci10,
co1,co2,co3,co4,
cak1,
);
inputrst,clk;
inputget,cancel;
inputci_1,ci1,ci5,ci10;
input[3:
0]count;
input[4:
0]sel_in;
input[4:
0]sel_out;
inputget_1;
outputco1,co2,co3,co4;
outputcak1;
wire[7:
0]cout;
wirefinish;
wirefinishp;
wire[3:
0]sel;
wireen;
wireclr;
wire[7:
0]mount;
modulezhan(
rst,
clk,
clr,
get_1,
sel_in,
sel_out,
sel
);
inputrst;
inputclk;
inputclr;
inputget_1;
input[4:
0]sel_in;
input[4:
0]sel_out;
outputreg[3:
0]sel;
reg[3:
0]a;
always@(posedgeclk&&get_1)
begin
if(!
rst==0)a=4'b0000;
elseif(!
clr==0)a=4'b0000;
elseif(sel_in>=sel_out)
a<=((sel_in-sel_out)/5)+1;
elseif(sel_ina<=~((sel_in-sel_out)/5)+2;
end
always@(posedgeclk)
begin
begin
case(a)
4'b0001:
sel=4'b0010;
4'b0010:
sel=4'b0011;
4'b0011:
sel=4'b0100;
4'b0100:
sel=4'b0101;
default:
sel=4'b0000;
endcase
end
end
endmodule
modulecount(clk,
rst,
clr,
ci_1,
ci1,
ci5,
ci10,
cout
);
inputrst;
inputclk;
inputclr;
inputci_1,ci1,ci5,ci10;
output[7:
0]cout;
reg[2:
0]q1,q5,q10,q_1;
assigncout=q1+5*q5+10*q10+1*q_1;
always@(posedgerstorposedgeclrorposedgeci1)
begin
if(rst==1)q1<=0;
elseif(clr==1)q1<=0;
else
begin
q1=q1+1;
end
end
always@(posedgerstorposedgeclrorposedgeci5)
begin
if(rst==1)q5<=0;
elseif(clr==1)q5<=0;
else
begin
q5=q5+1;
end
end
always@(posedgerstorposedgeclrorposedgeci10)
begin
if(rst==1)q10<=0;
elseif(clr==1)q10<=0;
else
begin
q10=q10+1;
end
end
always@(posedgerstorposedgeclrorposedgeq_1)
begin
if(rst==1)q_1<=0;
elseif(clr==1)q_1<=0;
else
begin
q_1=q_1+1;
end
end
endmodule
modulezhao(rst,
clk,
clr,
finishp,
mount,
cak1
);
inputrst;
inputclk;
inputclr;
inputfinishp;
input[7:
0]mount;
outputcak1;
regregcak1;
reg[7:
0]q;
assigncak1=regcak1;
always@(posedgeclk&&finishp==1)
begin
if(mount!
=0)
q=mount;
if(q)
begin
regcak1=1;q=q-1;
end
if(!
q)
begin
regcak1=0;
end
end
endmodule
modulecontrl(
rst,
clk,
get,
cancel,
sel,//
count,//
cout,//
mount,//
finish,
finish_done,//
finishp,
clr,
en//
);
inputrst;
inputclk;//
inputget,cancel;
input[3:
0]sel;
input[3:
0]count;
outputregfinish_done;
input[7:
0]cout;
inputclr;
outputreg[7:
0]mount;
outputregfinish,finishp;
outputregen;
always@(posedgerstorposedgeclk)
begin
finish_done=0;
if(rst==1)
begin
mount<=0;
finish<=0;
finishp<=0;
en<=0;
end
else
begin
if((get==1)&&(cout>=sel*count))
begin
finish<=1;
finishp<=1;
finish_done<=1;
en<=1;
mount=cout-sel*count;
end
elseif((cancel==1)||((get==1)&&(coutbegin
finishp<=0;
finish<=1;
mount<=cout;
finish_done<=1;
en<=1;
end
else
begin
finishp<=0;
finish<=0;
end
end
end
endmodule
modulechupiao(rst,clk,clr,
en,
sel,
count,
co1,co2,co3,co4);
inputrst,clk,clr;
inputen;
input[3:
0]sel;
input[3:
0]count;
outputco1,co2,co3,co4;
reg[3:
0]q;
//reg[3:
0]qsel;
reg[2:
0]qcount;
assignco1=q[0];
assignco2=q[1];
assignco3=q[2];
assignco4=q[3];
always@(posedgeclk&&en==1)
begin
if(rst==1)qcount<=0;
if(count!
=0)
qcount=count;
if(qcount&&sel==2)
begin
q[0]=1;qcount<=qcount-1;
end
if(!
qcount)
begin
q[0]=0;
end
end
endmodule
结束语
在此次课程设计中,我们收获了许多,不仅在知识学习方面,而且在动手能力方面、团结合作能力等方面都有了一定的成就。
首先,在知识学习方面,虽然我们开始有在计算机组成原理这一门课程中接触过verilogL这一门语言,但是我们都还不是很了解,只知道它由实体、结构体组成,其余的就不是很了解,但是在此次课程设计中,我们有了比较详细的了解,基本能够写出一个比较完整的程序。
这两周的自学中,我们也体会到了自学得快乐。
其次,在动手能力方面,很多时候我们都是知识不能够结合实践,所以很多时候我们都不知道应该怎么样开始,不过此次由于有了老师的详细讲解,所以,我们能够很快知道接下来应该做什么,有什么作用,得出什么结果。
最后,在团结合作能力方面,虽然每个人有每个人的题目板块,但是我们还是充分发挥了我们的团结合作能力,找到程序的同学帮没找到的同学找,有什么错误的大家一起讨论,一起找资料解决,最后,实在不行还有我们坚强的后盾——我们的指导老师,所以我们合作得很快乐。
在这次设计过程中,体现出团队设计的能力以及综合运用知识的能力,体会了学以致用、突出劳动成果的喜悦心情,从中发现平时学习的不足和薄弱环节,从而加以弥补。
同时,也再次体会到了学习合作的快乐。