数字设计实验:自动售货机

自动售货机设计

1.实验目的

本实验旨在设计一个可以出售6种商品的自动售货机,能够实现通过投放不同面值的货币判断是否达到商品价格从而完成出售的功能.

2.实验内容

设计一个自动售货机控制器,可以售出6种货物。货物价格定义如下:

商品编号 商品价格
1 0.5元
2 1元
3 1.5元
4 2元
5 6.5元
6 13元

注意: 有的价格需要按两次货币输入按钮开关表示支付两次。例如:按两次2元按钮表示支付4元。

操作流程:

首先通过货物种类开关(选用3个switch开关)选择所需要的商品编号,同时将商品编号显示到7段数码管上。然后用四个按钮输入相应的货币, 当输入货币总和正确以后,点亮购买成功标志的led。此处假定输入的货币总和都是正好的,只要等于所选商品价格即可, 不必找零。

输入:

货物种类: switch开关3个,代表6种货物;

货币输入: 4个按钮, 分别代表5块, 2块, 1块, 5角;

时钟输入: 采用板子上的CLOCK_100,频率为100MHz。

输出:

商品编号:7段数码管,显示商品编号;

输入金额:7段数码管,显示已付金额

交易成功: LED指示灯1个, 表示购买成功。

3.实验设计思路

3.1 自动售货机内在计算逻辑设计

1.选择商品:

always语句中使用一个 case 语句,根据 sw(商品选择开关,值为001~110,即对应1至6商品编号)来选择商品的价格。商品价格用 8'd5(表示 0.5元)到 8'd130(表示 13元)表示。

// 根据开关定义商品价格
always @(*) begin
    case (sw)
        3'b001: product_price = 8'd5;   // 商品1  0.5元
        3'b010: product_price = 8'd10;  // 商品2  1元
        3'b011: product_price = 8'd15;  // 商品3  1.5元
        3'b100: product_price = 8'd20;  // 商品4  2元
        3'b101: product_price = 8'd65;  // 商品5  6.5元
        3'b110: product_price = 8'd130; // 商品6  13元
        default: product_price = 8'd0;  // 默认无商品
    endcase
end

2.输入金额:

四个按钮(5元、2元、1元、5角)用来增加已付金额,输入的金额通过 btn5btn2btn1btn05 信号进行累计,在always语句中,累加赋值使用非阻塞运算符"<="。

always @(*) begin
    if (reset) begin
        paid_amount <= 8'd0;  // 重置已付金额
    end else begin
        if (btn5) paid_amount <= paid_amount + 8'd50;  // 5元按钮
        if (btn2) paid_amount <= paid_amount + 8'd20;  // 2元按钮
        if (btn1) paid_amount <= paid_amount + 8'd10;  // 1元按钮
        if (btn05) paid_amount <= paid_amount + 8'd5;   // 5角按钮
    end
end

3.等值判断:

如果某时刻已输入金额等于当前选择的商品价格,则LED灯亮起表示支付成功,使用连续赋值语句即可:

// 判断是否支付成功
assign led_success = (paid_amount >= product_price);  // 支付金额与商品价格相等时,点亮LED

3.2 结合按钮输入和数码管显示的用户交互设计

实现了自动售货机的基本计算逻辑,接下来应该考虑如何与硬件对接以及直观显示.

首先是按钮,将表示输入金额的四种输入变量与板子中的四个按钮对接即可,按下一次按钮表示对应的输入变量经历过一次高电平;

其次是数码管,本实验的实验过程中需要显示8位数码管中的4位,其中1位需要显示商品编号,另外3位需要显示已付金额(小数位和个位的数码之间要带小数点,此处的DP为低电平).其设计可仿照先前实验的思路,用一个2位中间变量(有4种值)与时钟绑定,作为选择变量,会在00~11之间迅速地做周期性变化,当频率大于人眼分辨频率时,人眼中就会产生四位数码管同时点亮的视觉效果.

实现代码段如下:

// 根据 clkdiv[19:18] 来选择数码管显示
always @(*) begin
    // 先默认所有数码管都不亮
    AN = 8'b11111111;
    DP = 1;
    // 根据 clkdiv[19:18] 切换数码管
    case (clkdiv[19:18])
        2'b00: begin
            AN[4] = 0; // 点亮商品编号数码管
            DP = 1;
            case (product_number)
                4'd1: seg = 7'b1111001; // 显示商品1
                4'd2: seg = 7'b0100100; // 显示商品2
                4'd3: seg = 7'b0110000; // 显示商品3
                4'd4: seg = 7'b0011001; // 显示商品4
                4'd5: seg = 7'b0010010; // 显示商品5
                4'd6: seg = 7'b0000010; // 显示商品6
                default: seg = 7'b1111111; // 无商品时不显示
            endcase
        end
        2'b01: begin
            AN[0] = 0; // 点亮个位数数码管
            DP = 1;
            case (paid_amount % 10)
                0: seg = 7'b1000000;
                1: seg = 7'b1111001;
                2: seg = 7'b0100100;
                3: seg = 7'b0110000;
                4: seg = 7'b0011001;
                5: seg = 7'b0010010;
                6: seg = 7'b0000010;
                7: seg = 7'b1111000;
                8: seg = 7'b0000000;
                9: seg = 7'b0010000;
                default: seg = 7'b1111111;
            endcase
        end
        2'b10: begin
            AN[1] = 0; /
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值