存在即離譜 2024-03-29 16:18 采纳率: 0%
浏览 10
已结题

fpga自动售货机数码管(相关搜索:数字时钟)

基于FPGA的自动售货机仿真,模拟基于EP4CE6F17C8开发板实现:
1,数码管分为三个部分:最右边两个数码管是显示商品,中间两个显示付款金额,最左边两个显示找零
2,利用三个按键作为选择商品的按钮,每个按键按下多次代表该商品的数量;每次按下一个按键最右边的两个数码管显示目前已选商品总价。再利用第四个按键作为商品选择的结束按钮,最右边两个数码管结算金额保持不变。最后利用第五个按键作为付钱金额的按钮,按多次叠加已付金额(金额最小单位自拟)
3,初始状态(数码管全为0)。例如key0按一次进入商品选择,再按一次key0商品显示5元,按第三次商品10元,按第四次商品15元,再按一次回到初始状态(数码管全为0)
4,在任意商品选择状态下切换付款金额。例如在商品5元时key1按一次付款5元,按第二次付款10元,按第三次付款15元,再按一次付款20元等
5,需要加入按键消抖
6,三组金额分别各自都占用两个数码管,可以模仿数字时钟或者万年历设置三个不同的数值名(goods,pay,charge),然后商品选择和付款金额分别按照按键操作对goods和pay赋值,找零的数码管显示数值charge是通过goods与pay的差值计算得来的
7,另外,当付款金额小于商品价格时,最左边的两个数码管显示的是Er,因为付款金额不够
8,由于按键消抖不一定能够解决按键状态切换的问题,可以使用assign设置一个额外的中间值更新段选信号seg

  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-29 16:18
    关注

    引自免费微信小程序:皆我百晓生

    当然,为了实现您所描述的基于FPGA的自动售货机仿真系统,我们需要考虑以下几个关键部分的设计:

    硬件模块划分

    • 数码管驱动模块:用于控制六个数码管的显示,根据不同的数据输入进行更新。
    • 键盘扫描模块:读取五个按键的状态,并结合消抖机制处理有效按键输入。
    • 商品选择及计价模块:根据按键key0按下次数累加商品价格并显示在最右侧数码管上。
    • 付款金额累加模块:根据按键key1按下次数累加付款金额并显示在中间的数码管上。
    • 找零计算模块:根据商品价格和付款金额计算找零,并显示在最左侧数码管上。

    部分Verilog代码框架

    module vending_machine(
        input wire clk, // System clock
        input wire [4:0] keys, // Five buttons inputs
        output reg [6:0] seg_data[2:0], // Digit segments for each of the three pairs of 7-segment displays
        output reg [1:0] dig_sel[2:0] // Digit select signals for each pair of 7-segment displays
    );
    
    // Internal registers and variables
    reg [7:0] goods_price;
    reg [7:0] pay_amount;
    reg [7:0] change;
    
    always @(posedge clk) begin
        // Key debouncing logic here
        // ...
    
        // Update goods_price based on key0 presses
        case (keys[0])
            1'b1: begin
                // Increment goods_price with proper step and wrap-around
                goods_price <= goods_price + 5'b000_0101; // Assuming price steps are in multiples of 5
            end
        endcase
    
        // Similar update logic for pay_amount using key1
        // ...
    
        // Calculate change
        always_comb begin
            if (pay_amount >= goods_price)
                change = pay_amount - goods_price;
            else
                change = 8'b1111_1101; // "Er" representation
        end
    
        // Drive segment data for each pair of 7-segment displays
        always_comb begin
            seg_data[0] = goods_price_to_seg(goods_price);
            seg_data[1] = pay_amount_to_seg(pay_amount);
            seg_data[2] = change_to_seg(change);
            
            // Assign digit select signals to display the correct values
            // ...
        end
    end
    
    // Conversion functions from numerical value to 7-segment display format
    function [6:0] goods_price_to_seg(input [7:0] price);
        // Convert price to segment data
    endfunction
    
    // Similar conversion functions for pay_amount and change
    // ...
    
    endmodule
    

    注意以上代码仅为示例框架,你需要根据实际项目需求完善按键消抖、数码管显示逻辑以及具体的数值转换函数等内容。同时,还需要在设计中添加必要的状态机以跟踪按键动作以及当前系统状态。对于数码管的段选信号dig_sel,你需要根据数码管的具体连接方式和显示规则来编写相应的逻辑。

    此外,如果你在实际项目中有现成的键盘扫描模块和7-segment译码器模块,可以直接调用这些模块,简化整体设计。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月1日
  • 创建了问题 3月29日

悬赏问题

  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因