目录
二、 课程设计目的……………………………………………………2 二、课程设计题目描述和要求…………………………………………2 三、课程设计报告内容…………………………………………………2
3.1、设计原理、方案论证…………………………………………2 3.2、设计过程……………………………………………………2
3.2.1、系统框图………………………………………………2 3.2.2、设计总程序……………………………………………3 3.2.3、软件仿真………………………………………………4 3.2.4管脚定义………………………………………………5 3.2.5下载程序与仿真结果…………………………………6
四、设计总结和心得体会………………………………………………7 参考文献…………………………………………………………………8 附录……………………………………………………………………8
1
一、 课程设计目的:
1)熟悉学习QuartusII的编程与调试方式,学会在QuartusII中使用波形图进行软件仿真,并使用EDA6000进行硬件仿真与调试。 2)设计一个自动售货机,具有投币和选择商品等功能
二、 课程设计题目描述和要求:
首先应搭建识别模块,将代表每种硬币的拨码开关信号和选择的商品信号转变为数码管显示信号。两者要进行比较,如果钱数大于售出商品则对其进行求差,求差的结果作为找钱信号;如果等于直接售出商品;小于则报警。
程序中会有一个分频模块,对CLK进行分频,并有一个复位键。
三、 课程设计报告内容
3.1、设计原理、方案论证
1)设计一个自动售货机,此机能出售1元、2.5元、3元、3.5元的四种商品。出售哪种商品可有顾客按动相应的按键即可,并同时用数码管显示售出的是第几种商品;
2)顾客可通过选择投入的钱数来购买商品,并且有一个确认键; 3)如果选择投入的钱小于选择的商品价格,则显示出价格和选择的钱数,并且警告灯亮;
4) 如果选择投入的钱大于选择的商品价格,则显示出价格和找回的钱;
5)此售货机有一个整体复位控制。 3.2、设计过程
3.2.1、系统框图:
2
显示找零、输出商品 钱数大于商品价格 选择投入的钱币 显示选择的商品 选择商品 开始 3.2.2、设计总程序: 显示钱数、警告灯亮
3
3.2.3、软件仿真
当选择钱数为100即为2元、选择商品为10即为3元时,led_warn亮,led_price和led_money、led_good分别显示应该显示的数据
4
3.2.4管脚定义:
5
3.2.5下载程序与仿真结果:
商品选择第二个,投入钱币是5,结果显示中25为价格05为投入的钱,
2是选择的商品,led_warn 亮;
6
商品选择第一个,投币35,结果中10为商品价格,25为找零,1为选择的商品
四、设计总结和心得体会
7
通过本次课程设计,我对Verilog HDL语言有了更深刻的了解,能够比较灵活地运用它来实现我们所想要要其实现的功能。在实验中,我也遇到了很多挫折,不过我都和同伴一一克服了,大家齐心协力解决了问题,使我明白了和他人共同合作的重要性。在以后的道路上我们也必须深刻认识到团队合作的精神,投入今后的发展之中。
成功就是在不断摸索着前进中实现的,遇到问题我们不能灰心、烦躁,甚至放弃,而要静下心来仔细思考,分部检查,找出最终的原因进行改正,这样才会有进步,才会一步步向自己的目标靠近,才会取得自己所要追求的成功。
参考文献:
[1] 潘松,《EDA实用教程》,科学出版社,2004年
[2] 夏宇闻 编著 《Verilog数字系统教程》 北京航空航天出版社 [3]梁瑞宇 编写《FPGA设计实验指导书(Verilog HDL)》
附录(程序)
Moduleautoseller(clk,ok,g,rst,m,led_goods,led_money_a,led_money_b,led_price_a,led_price_b,led_warn); input clk,ok,rst;//脉冲,确定键,清零键 input [1:0] g; //货品选择键 input [2:0] m;
output [6:0]led_money_b,led_price_b,led_goods; output [7:0]led_money_a,led_price_a; outputled_warn; reg f_500;//分频时钟 reg [6:0]goods; regled_warn;
integera_tmp,price,money,money_a,money_b,price_a,price_b; reg [6:0] led_money_b,led_price_b,led_goods; reg[7:0]led_money_a,led_price_a; always @ (posedgeclk) begin
8
if(a_tmp==499) begin
f_500=~f_500; a_tmp<=0; end else
a_tmp<=a_tmp+1; end
always@(posedge f_500) begin if(rst==1) begin money=0; price=0; led_warn=0; end else begin case(m)
3'b000:begin money=00;end 3'b001:begin money=05;end 3'b010:begin money=10;end 3'b011:begin money=15;end 3'b100:begin money=20;end 3'b101:begin money=25;end 3'b110:begin money=30;end 3'b111:begin money=35;end endcase case(g)
9
2'b00:begin price=10;end 2'b01:begin price=25;end 2'b10:begin price=30;end 2'b11:begin price=35;end endcase if(ok==1) begin
if(moneyled_warn=led_warn+0; money=money-price; case(price)10:beginled_goods=7'b0000110;end 25:beginled_goods=7'b1011011;end 30:beginled_goods=7'b1001111;end 35:beginled_goods=7'b1100110;end endcase money=money+0; price=price+0; money_a=money/10;
money_b=money-money_a*10; price_a=price/10;
price_b=price-price_a*10; case (money_a)
0:beginled_money_a=8'b10111111;end 1:beginled_money_a=8'b10000110;end 2:beginled_money_a=8'b11011011;end 3:beginled_money_a=8'b11001111;end
10
4:beginled_money_a=8'b11100110;end endcase case(money_b)
0:beginled_money_b=7'b0111111;end 5:beginled_money_b=7'b1101101;end endcase case(price_a)
0:beginled_price_a=8'b10111111;end 1:beginled_price_a=8'b10000110;end 2:beginled_price_a=8'b11011011;end 3:beginled_price_a=8'b11001111;end 4:beginled_price_a=8'b11100110;end endcase case(price_b)
0:beginled_price_b=7'b0111111;end 5:beginled_price_b=7'b1101101;end endcase end end end endmodule
11