基于Verilog的双币种售货机设计与实现

博主:neragonerago 2026-09-16 01:38:07 6

随着数字集成电路技术的快速发展,硬件描述语言(HDL)在数字系统设计中的应用日益广泛,Verilog作为一种主流的HDL,凭借其简洁的语法、强大的建模能力,被广泛应用于通信、控制、消费电子等领域,售货机作为日常生活中常见的自动化设备,其核心控制逻辑可通过Verilog进行高效设计与实现,本文以支持两种硬币(如1元和5元)的售货机为例,探讨基于Verilog的模块化设计方法,包括系统需求分析、模块划分、状态机设计及仿真验证,旨在为小型数字控制系统的设计提供参考。

基于Verilog的双币种售货机设计与实现

设计需求分析

本设计的双币种售货机需实现以下核心功能:

  1. 硬币识别:支持两种硬币(假设为1元和5元),通过外部信号输入识别硬币类型,并累加对应金额。
  2. 金额显示:实时显示当前投币总额,便于用户确认。
  3. 商品购买:设定商品固定价格(如3元),当投币金额达到或超过商品价格时,触发出货信号。
  4. 找零控制:若投币金额超过商品价格,计算找零金额(如投5元买3元商品,需找零2元),并通过控制信号输出找零。
  5. 系统复位:支持手动复位,将系统状态初始化为初始状态。

系统模块设计

为实现上述功能,采用模块化设计思想,将系统划分为顶层模块和子模块,子模块包括硬币检测模块、金额计算模块、比较判断模块、控制模块及显示模块,各模块功能明确,接口清晰,便于调试与扩展。

1 顶层模块设计

顶层模块(VendingMachine)是系统的核心,负责连接各子模块,协调数据流与控制信号,其端口定义如下:

  • 输入端口:coin1(1元硬币检测信号,高电平有效)、coin5(5元硬币检测信号,高电平有效)、clk(系统时钟)、rst_n(复位信号,低电平有效)。
  • 输出端口:total_money(当前投币总额,2位二进制,00表示0元,01表示1元,10表示2元,11表示3元及以上)、dispense(商品出货信号,高电平有效)、change(找零信号,高电平有效)、display(金额显示信号,2位二进制,对应00-03元)。

顶层模块通过实例化各子模块,将coin1coin5输入至硬币检测模块,检测结果传递给金额计算模块;金额计算模块的输出total_money同时传递给比较判断模块和显示模块;比较判断模块根据total_money与商品价格(3元,即二进制11)的比较结果,生成dispensechange信号,传递给控制模块。

2 子模块设计

2.1 硬币检测模块(CoinDetector

功能:识别硬币类型,并生成对应的金额增量信号。
设计思路coin1coin5为异步输入信号,需同步化处理(避免亚稳态),采用两级触发器同步后,通过组合逻辑判断当前投入的硬币类型:若coin1_sync为高,则增量1元;若coin5_sync为高,则增量5元(但受限于金额显示位宽,此处简化为增量2元,因2位二进制最大表示3元,实际设计中可扩展位宽)。
Verilog代码片段

module CoinDetector(
    input clk, rst_n,
    input coin1, coin5,
    output reg coin1_valid, coin5_valid
);
reg [1:0] coin1_sync, coin5_sync;
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        coin1_sync <= 2'b00; coin5_sync <= 2'b00;
        coin1_valid <= 1'b0; coin5_valid <= 1'b0;
    end else begin
        coin1_sync <= {coin1_sync[0], coin1}; // 同步化
        coin5_sync <= {coin5_sync[0], coin5};
        coin1_valid <= coin1_sync[1] & ~coin1_sync[0]; // 上升沿检测
        coin5_valid <= coin5_sync[1] & ~coin5_sync[0];
    end
end
endmodule

2.2 金额计算模块(MoneyCalculator

功能:根据硬币检测信号,累加当前投币总额,并限制最大金额(如3元)。
设计思路:采用2位寄存器total_money存储金额,初始值为0,当coin1_validcoin5_valid有效时,根据硬币类型更新total_money:若coin1_valid有效,total_money加1;若coin5_valid有效,total_money加2(模拟5元,实际中需根据位宽调整),当total_money达到3时,不再增加。
Verilog代码片段

module MoneyCalculator(
    input clk, rst_n,
    input coin1_valid, coin5_valid,
    output reg [1:0] total_money
);
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        total_money <= 2'b00;
    end else begin
        if (coin1_valid && total_money < 2'b11) 
            total_money <= total_money + 1;
        else if (coin5_valid && total_money < 2'b10) // 加2后不超过3
            total_money <= total_money + 2;
    end
end
endmodule

2.3 比较判断模块(Comparator

功能:比较当前金额与商品价格(3元),

The End

发布于:2026-09-16,除非注明,否则均为区块链社区- 欧亿APP下载原创文章,转载请注明出处。