1、自动售货机设计和实现 大 学 实 验 报 告 课程名称: 数字系统现场集成技术 实验项目名称: 实验四(自动售货机设计和实现) 学院: 专业: 指导教师: 报告人: 学号: 班级: 实验时间: 实验报告提交时间: 教务部制一、实验目的与要求:基本要求:该实验为团队协作,2人一个小组。可以对3种不同种类的货物进行自动售货,价格分别为A=4.00, B=2.50, C=1.00。售货机可以接受10元,5元,1元三种硬币(即有三种输入信号SY,WY,IY),并且在7段数码管(二位代表元,一位代表角)显示已投入的总钱数,选择货物的输入信号Ia,Ib,Ic,输出指示信号为 Sa, Sb ,Sc 分别表示
2、售出相应的货物,同时输出的信号yuan, jiao代表找零,并显示在7段数码管上。高级要求(可选):VGA显示3种货物图片及其价格,鼠标点击购买数量(1-9)后显示总价,安规格说明2中的button2-button4输入硬币,VGA显示已投入的总钱数,鼠标点击购买后,显示找零数目,购买物品闪烁,交易完成。规格说明: 按一下button1按钮,表示购买货物A,第一个LED灯亮;按两下button1按钮,表示购买货物B,第二个LED灯亮;按三下button1按钮,表示购买货物C,第三个LED灯亮,同时7段数码管显示所要购买货物的价格。 LED灯亮后,开始输入硬币。button2按一下,输入10元,
3、按两下,输入二十元,以此类推;Button3按一下输入5元,按两下输入10元,以此类推;button4按一下输入1元,按两下输入2元,以此类推。7段数码管显示已投入的总钱数,再次按下button1键,7段数码管显示找零数目,同时指示货物的LED灯熄灭。 如果投入的钱币不够就按下button1键确认购买,数码管显示“ER”。 本实验使用FPGA板:Sparant6XC6SLX16CSG324C(建project时,需要选择该芯片的型号)。二、实验过程与代码:1、顶层代码:module top( input clk, input rst, input4:0 btn, output3:0 an, o
4、utput7:0 seg, output2:0 led ); wire clk,rst;wire7:0 first_seg,second_seg,third_seg;wire4:0 btn_down; seg_drv v1( .clk(clk), .rst(rst), .first_seg(first_seg), .second_seg(second_seg), .third_seg(third_seg), .an(an), .seg(seg) ); main v2 ( .clk(clk), .rst(rst), .btn_down(btn_down), .first_seg(first_se
5、g), .second_seg(second_seg), .third_seg(third_seg), .led(led) ); btn_scan v3 ( .clk(clk), .rst(rst), .btn(btn), .btn_down(btn_down) );Endmodule2、数码管驱动:module seg_drv( input clk, input rst, input7:0 first_seg, input7:0 second_seg, input7:0 third_seg,/ input7:0 forth_seg, output reg3:0 an, output reg7
6、:0 seg );localparam1:0 s0=2b00, s1=2b01, s2=2b10, s3=2b11;reg1:0 state;always(posedge clk,posedge rst)begin if(rst) begin an=4b1111; seg=8b1111_1111; state=s0; end else begin case(state) s0:begin an=4b1110; seg=first_seg; if(ms_up) state=s1; else state=state; end s1:begin an=4b1101; seg=second_seg;
7、if(ms_up) state=s2; else state=state; end s2:begin an=4b1011; seg=third_seg; if(ms_up) state=s3; else state=state; end s3:begin an=4b0111; seg=8b1111_1111; if(ms_up) state=s0; else state=state; end endcase endendreg17:0 ms_cnt;reg ms_up;always(posedge clk,posedge rst)begin if(rst) begin ms_cnt=0; ms
8、_up=0; end else begin if(ms_cnt=200000) begin ms_cnt=0; ms_up=1; end else begin ms_cnt=ms_cnt+1b1; ms_up=0; end endendendmodule3、按键扫描与消抖:module btn_scan( input clk, input rst, input3:0 btn, output reg3:0 btn_down );localparam1:0 s0=2b00, s1=2b01, s2=2b10; reg1:0 state;reg3:0 btn_reg;always(posedge c
9、lk,posedge rst)begin if(rst) begin btn_down=4b0000; state=s0; end else begin case(state) s0: begin btn_down=4b0000; if(btn) state=s1; else state=s0; end s1: begin if(cnt_done) begin if(btn) begin state=s2; btn_reg=btn; end else state=s0; end else state=s1; end s2:begin if(btn=4b0000) begin btn_down=
10、btn_reg; state=s0; end else begin btn_down=btn_down; state=s2; end end endcase endendreg20:0 cnt;reg cnt_done;always(posedge clk,posedge rst)begin if(rst) begin cnt=21b0; cnt_done=1b0; end else if(state=s1) begin cnt=cnt+1b1; if(cnt=21d2000000) begin cnt=21b0; cnt_done=1b1; end end else begin cnt=21
11、b0; cnt_done=1b0; endendendmodule4、主程序code:module main( input clk, input rst, input3:0 btn_down, output reg7:0 first_seg, output reg7:0 second_seg, output reg7:0 third_seg, output reg2:0 led ); localparam2:0 s0=3b000,s1=3b001,s2=3b010,s3=3b011,s4=3b100,s5=3b101; reg2:0 state;reg3:0 money0,money1;reg
12、3:0 price;reg4:0 change;reg3:0 change1,change0;always(posedge clk,posedge rst)begin if(rst) begin led = 3b000; money0 = 0; money1 = 0; change = 0; price = 0; state = s0; end else begin case(state) s0:begin led = 3b000; if(btn_down0 = 1) state = s1; else state = s0; end s1:begin led = 3b100; price =
13、1; money0 = 0; money1 = 0; change=0; if(btn_down0 = 1) state = s2; else if(btn_down3:1) state = s4; else state = s1; end s2:begin led = 3b010; price=2.5; money0 = 0; money1 = 0; change = 0; if(btn_down0 = 1) state = s3; else if(btn_down3:1) state = s4; else state = s2; end s3:begin led = 3b001; pric
14、e = 4; money0 = 0; money1 = 0; change = 0; if(btn_down0 = 1) state = s1; else if(btn_down3:1) state = s4; else state = s3; end s4:begin case(btn_down3:1) 3b001: money1 = 10) begin money1 = money1 + 1; money0 = money0 - 10; end else money1 = money1; end 3b100: begin money0 = 9) begin money1 = money1
15、+ 1; money0 = 0; end else money1 = money1; end endcase if(btn_down0 = 1) state = s5; else state= price) begin change = 20) begin change1 = 2; change0 = 10) begin change1 = 1; change0 = change - 10; end else begin change1 = 0; change0 = change; end end else change =5b01110; if(btn_down3:0) state = s0
16、; else state=s5; end endcase endend/译码always(posedge clk,posedge rst)begin if(state = s0) begin third_seg=8b0000_0011; second_seg=8b0000_0010; first_seg=8b0000_0011; end else if(state = s1) begin third_seg=8b0000_0011; second_seg=8b1001_1110; first_seg=8b0000_0011; end else if(state =s2) begin third
17、_seg=8b0000_0011; second_seg=8b0010_0100; first_seg=8b0100_1001; end else if(state =s3) begin third_seg=8b0000_0011; second_seg=8b1001_1000; first_seg=8b0000_0011; end else if(state =s4) begin case(money0) 4b0000: second_seg=8b0000_0010; 4b0001: second_seg=8b1001_1110; 4b0010: second_seg=8b0010_0100
18、; 4b0011: second_seg=8b0000_1100; 4b0100: second_seg=8b1001_1000; 4b0101: second_seg=8b0100_1000; 4b0110: second_seg=8b0100_0000; 4b0111: second_seg=8b0001_1110; 4b1000: second_seg=8b0000_0000; 4b1001: second_seg=8b0000_1000; endcase case(money1) 4b0000: third_seg=8b0000_0011; 4b0001: third_seg=8b10
19、01_1111; 4b0010: third_seg=8b0010_0101; 4b0011: third_seg=8b0000_1101; 4b0100: third_seg=8b1001_1001; 4b0101: third_seg=8b0100_1001; 4b0110: third_seg=8b0100_0001; 4b0111: third_seg=8b0001_1111; 4b1000: third_seg=8b0000_0001; 4b1001: third_seg=8b0000_1001; endcase first_seg=8b0000_0011; end else if(
20、state =s5) begin if(change = 5b01110) begin third_seg=8b0000_0011; second_seg=8b0110_0001; first_seg=8b0110_0001; end else begin case(change0) 4b0000: second_seg=8b0000_0010; 4b0001: second_seg=8b1001_1110; 4b0010: second_seg=8b0010_0100; 4b0011: second_seg=8b0000_1100; 4b0100: second_seg=8b1001_100
21、0; 4b0101: second_seg=8b0100_1000; 4b0110: second_seg=8b0100_0000; 4b0111: second_seg=8b0001_1110; 4b1000: second_seg=8b0000_0000; 4b1001: second_seg=8b0000_1000; 4he:second_seg=8b0110_0000; endcase case(change1) 4b0000: third_seg=8b0000_0011; 4b0001: third_seg=8b1001_1111; 4b0010: third_seg=8b0010_
22、0101; 4b0011: third_seg=8b0000_1101; 4b0100: third_seg=8b1001_1001; 4b0101: third_seg=8b0100_1001; 4b0110: third_seg=8b0100_0001; 4b0111: third_seg=8b0001_1111; 4b1000: third_seg=8b0000_0001; 4b1001: third_seg=8b0000_1001; endcase if(led1 = 1) first_seg=8b0100_1001; else first_seg=8b0000_0011; end end endendmodule三、实验结果:买货物2,价格2.5,投币15,找零12.5金币不够显示为错误深圳大学学生实验报告用纸四、实验结论: 通过此次实验加深了对数码管驱动以及按键扫描与消抖工作原理的的运用,对各个模块搭建系统也有了新的认识。指导教师批阅意见:成绩评定: 指导教师签字: 年 月 日备注:注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2