实验项目:自动售货机
一、 实验题目
设计模拟自动售票机的电路,其功能如下:
1、通过选择开关选择购买6角或8角的邮票
2、按下购买键,开始购买
3、按相应的按键,输入1角、5角或者1元硬币
4、当输入硬币总面值大于等于欲买邮票价值时,相应邮票输出并找零,交易结束
5、若想终止交易,按退钱按键,退出已输入硬币,交易结束
将设计下载到开发板进行验证,用一个拨码开关K1选择要购买的邮票,K2做购买键,用按键SW1作为1角的输入,SW2作为5角的输入,SW3作为1元的输入,用LED0~3显示售货机状态、邮票输出、找零、选择的邮票等信息。
二、 方案分析
主要用case形式控制输入的钱币情况与找零情况,用多个中间变量记录当前投入的钱币状态,用四个LED灯的亮灭表示当前状态。
三、实验代码(摘抄)
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 09:06:07 07/24/2015
// Design Name:
// Module Name: sell
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module sell(one_dollar,half_dollar,tenth_dollar,stamp,buy,choose_stamp, collect,half_out,dispense,reset,clk,out_seg,out_dig);
parameter idle=0,tenth=1,two=2,three=3,four=4,five=5,six=6,seven=7,eight=8;
//two,three,four为中间状态变量,代表投入币值的几种情况
input stamp,buy,tenth_dollar,one_dollar,half_dollar,reset,clk;
output collect,half_out,dispense,choose_stamp;
output[7:0] out_seg;
output[7:0] out_dig;
reg collect,half_out,dispense,choose_stamp;
reg[2:0] D;
reg flag;
reg[7:0] out_seg;
reg [7:0] out_dig;
//设置输出变量,位选与片选控制7段数码管亮灭
always @(posedge clk or posedge reset)
begin
if(reset==1'b1)
begin
dispense=1; collect=1;
half_out=1; D=idle;
choose_stamp=1'b1;
flag=0;
out_dig=8'b11111110;
out_seg=8'b11000000;//0
end
else
begin
if(buy==1'b1)
begin
if(stamp==1'b1)
begin
choose_stamp=1'b0;//贩卖8角的邮票
case(D)
idle:
begin
if(flag==0)
begin
if(tenth_dollar==1'b0)
begin
D=tenth; flag=1;
out_dig=8'b11111110;
out_seg=8'b11111001;//1
end
else if(half_dollar==1'b0)
……
三、 实验仿真
四、 实际效果
售货机可以正常显示投入钱币以及模拟找钱,基本实现了要求的功能。