1. 项目背景与核心思路
去年夏天在电子市场闲逛时,看到一台老式自动售货机卡币的尴尬场景,突然萌生用FPGA重新定义售货机控制逻辑的想法。传统售货机的机械式控制存在反应延迟、故障率高、扩展性差等问题,而FPGA的并行处理特性和硬件可编程优势,正好能解决这些痛点。
这个项目的本质是通过硬件描述语言(Verilog/VHDL)在FPGA芯片上实现售货机的全数字化控制。相比单片机方案,FPGA能实现真正的并行处理——硬币识别、货道选择、库存统计等任务可以同步执行,响应速度可达纳秒级。我在Xilinx Artix-7开发板上实现了原型系统,实测交易处理速度比传统PLC方案快20倍以上。
2. 硬件架构设计要点
2.1 核心模块划分
整个系统采用模块化设计,主要包含:
- 支付处理模块:负责硬币/纸币识别(通过光电传感器脉冲计数)
- 货道控制模块:驱动28BYJ-48步进电机带动螺旋货道
- 库存管理模块:红外对射传感器实时监测存货状态
- 显示交互模块:OLED屏幕+机械按键组成人机界面
- 主控模块:协调各子系统工作,处理异常情况
2.2 关键器件选型
- FPGA芯片:Xilinx XC7A35T(Artix-7系列,33800个逻辑单元)
- 硬币识别:TLP920光耦+定制投币轨道(可识别1/5/10元硬币)
- 电机驱动:ULN2003达林顿阵列驱动板
- 通信接口:CH340G实现USB转UART调试
特别提醒:硬币识别模块需要根据当地货币规格定制传感器间距,我通过3D打印制作了可调节的轨道支架,实测识别准确率达到99.7%
3. Verilog核心逻辑实现
3.1 状态机设计
采用三段式状态机控制交易流程:
verilog复制parameter IDLE = 3'b000;
parameter PAYMENT = 3'b001;
parameter DELIVERY = 3'b010;
parameter CONFIRM = 3'b011;
always @(posedge clk) begin
case(current_state)
IDLE: if(coin_in) next_state <= PAYMENT;
PAYMENT: if(amount_ok) next_state <= DELIVERY;
DELIVERY: if(motor_done) next_state <= CONFIRM;
CONFIRM: next_state <= IDLE;
endcase
end
3.2 并行处理实现
利用FPGA的并行特性,三个关键流程独立运行:
- 支付检测:持续监控硬币传感器信号
- 库存校验:实时比对选择货道与库存数据
- 异常监测:独立看门狗计时器防止死锁
4. 机械结构改造要点
4.1 货道传动优化
原售货机的弹簧货道改为步进电机驱动螺旋货道:
- 步距角5.625°(64步/圈)
- 每转出货1件商品
- 加减速曲线优化避免商品卡滞
4.2 传感器布局
- 投币口:2组红外对管检测硬币直径
- 出货口:反射式光电开关确认商品掉落
- 货道内:每5cm布置一组对射式传感器
5. 实测问题与解决方案
5.1 典型故障排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 误识别硬币 | 传感器间距偏差 | 重新校准轨道间距 |
| 货道卡死 | 电机失步 | 增加堵转检测电路 |
| 显示乱码 | 时钟不同步 | 添加全局缓冲器 |
5.2 电源处理经验
- 电机启动瞬间电流可达1.2A,需单独供电
- 数字部分与电机驱动之间用光耦隔离
- 每个电源入口放置100μF+0.1μF去耦电容
6. 性能优化技巧
- 时序约束:设置6ns的时钟周期约束确保稳定性
- 流水线设计:将硬币识别分为直径检测→材质检测→计数三个流水段
- 资源复用:在不同时段重复利用部分DSP单元
这个项目最让我惊喜的是FPGA在实时控制方面的潜力——当传统方案还在顺序执行检测逻辑时,我们的并行架构已经完成了整个交易验证。现在这台改造后的售货机放在工作室,成了最受欢迎的"硬件面试官",每个来参观的工程师都要被考问其中至少三个模块的实现原理。