EDA课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA课程设计
·设计目标:
本设计完成基于Verilog HDL的自动售票系统,综合软件用Quartus II8.1。
本自动售票系统可以完成1元、2元、3元、4元四种票的自动售出,货币种类可以是1元、5元、10元、50元、100元,能自动找零和显示
·总体设计:
共有四个主要模块和一个顶层模块:四个模块分别是主控模块、统计模块、出票模块和找零模块;顶层模块负责各模块间的连接,组成一个可用的自动售票系统。
总体结构如下:
·各模块设计:
统计模块:
根据各种货币输入,统计出总钱数提供给主控模块。每次售票完成后总钱数自动归零(主控模块提供售票完成信号,计数清零)
代码如下:
1: //统?计?钱?数?模?块?
2: module count ( rst, //复?位?高?有??
3: clr,
4: ci1,ci5,ci10,ci50,ci100, //1元?、?元?、?元?、?元?、?元?输?入?
5: cout //统?计?出?的?总?钱?数?
6: );
7:
8: input rst;
9: input clr; //清?零?信?号?
10: input ci1,ci5,ci10,ci50,ci100; //高?脉?冲?有??
11: output [7:0] cout;
12:
13: reg [2:0] q1,q5,q10,q50,q100;
14:
15: assign cout = q1 + 5*q5 + 10*q10 + 50*q50 + 100*q100; 16:
17: //一?元?计?数?
18: always @ (posedge rst or posedge clr or posedge ci1) 19: begin
20: if(rst==1) q1 <= 0;
21: else if(clr==1) q1 <= 0;
22: else
23: begin
24: q1 = q1 + 1;
25: end
26: end
27:
28: //5元?计?数?
29: always @ (posedge rst or posedge clr or posedge ci5) 30: begin
31: if(rst==1) q5 <= 0;
32: else if(clr==1) q5 <= 0;
33: else
34: begin
35: q5 = q5 + 1;
36: end
37: end
38:
39: //10元?计?数?
40: always @ (posedge rst or posedge clr or posedge ci10) 41: begin
42: if(rst==1) q10 <= 0;
43: else if(clr==1) q10 <= 0;
44: else
45: begin
46: q10 = q10 + 1;
47: end
48: end
49:
50: //50元?计?数?
51: always @ (posedge rst or posedge clr or posedge ci50)
52: begin
53: if(rst==1) q50 <= 0;
54: else if(clr==1) q50 <= 0;
55: else
56: begin
57: q50 = q50 + 1;
58: end
59: end
60:
61: //100元?计?数?
62: always @ (posedge rst or posedge clr or posedge ci100)
63: begin
64: if(rst==1) q100 <= 0;
65: else if(clr==1) q100 <= 0;
66: else
67: begin
68: q100 = q100 + 1;
69: end
70: end
71:
72: endmodule
模块先统计各种金额的货币数,然后用并行赋值(assign赋值语句)统计出总钱数输出。
仿真波形如下:
由仿真波形:
初始时,cout为0,即总钱数为0,经过货币输入脉冲后能准确记录输出钱的总数。清零脉冲后,cout可归零,只需把主控模块的完成脉冲加到此,则完成一次售票后,本模块可以自动归零,准备接受下一次投币。
主控模块:
完成总体控制和各种控制信号。
程序代码如下:
1: // 主?控?模?块?,?完?成?自?动?售?票?逻?辑?计?算?及?产?生?各?种?控?制?信?号?
2: module contrl ( rst,clk, //复?位?高?有?? 时?钟?
3: get,cancel,
4: sel, //票?类?别?,?
5: count, //票?数?
6: money, //总?钱?数?
7: mout, //找?零?钱?数?
8: finish, //出?钱?信?号?
9: finishp //出?票?信?号?
10: );
11:
12: input rst;
13: input clk; //时?钟?,?
14: input get,cancel;
15: input [1:0] sel,count;
16: input [7:0] money;
17: output reg [7:0] mout;
18: output reg finish,finishp; //完?成?脉?冲?
19:
20:
21: always @ (posedge rst or posedge clk)
22: begin
23: if(rst==1)
24: begin
25: mout <= 0;
26: finish <= 0;
27: finishp <= 0;
28: end
29: else
30: begin
31: if((get == 1)&&(money >= sel*count + count))
32: begin
33: finish <= 1;
34: finishp <= 1;
35: mout = money - sel*count - count;
36: end
37: else if((cancel == 1)||((get == 1)&&(money < sel*count + count)))