赞
踩
pwm音频产生:PWM生成原理与控制输出
模块
按键消抖模块、有限状态机模块、LED模块、数码管模块、蜂鸣器模块
功能实现
闭合或断开会发生机械抖动问题
,可能产生多次按键效果
。投币采用KEY4 KEY3键作为投币输入,先对按键进行消抖后,进入到INSERT_STATE
,对按键操作传递标识值,传递值为1,则按键值+1或0.5,累加记录按键操作次数,从而获得总输入金额
投币金额计算:在进行数据类型存储中,采用简易化方式,通过改变键值传递,金额加减算法,如0.5元在机内运算中通过整数值存储为5,采用十进制数据存储计算,优化运算过程,因数码管位数显示限制,投币操作中金额存在上限,通过对机内计算金额取余取整方式,实现数码管中的金额显示功能
// 中间两位显示投币数
6'b110_111: number = now_coins % 10;
6'b111_011: number = now_coins / 10;
金额小数位显示:调用晶体管过程中,对数码管相应的sel位的seg模块赋予低电平进行点亮操作
if (sel == 6'b111_011 || sel == 6'b101_111)
seg_r[7] <= 0;
总金额计算:通过投币传递值进行机内计算,同时设定存储金额上限为9.9,若发生一处操作,则进行置值操作,或可进入返回清0。同时将total值传递到seg模块,取余取整。
wire [10:0] total_price_ex;
assign total_price_ex = com1_unit_price * com1_count + com2_unit_price * com2_count;
reg [6:0] total_price_temp;
出货及清0动态显示
商品购买状态下,设定额外状态,判断商品购买,通过值传递:商品总价,投币总金额进入状态,并设定状态,successful / fail状态
if (now_state == DEFAULT_STATE && key_now == 3'd1) begin // 在初始状态按下key1,即购买物品
if (now_coins >= total_price && total_price > 0) begin // 购买成功
buy_state_r <= BUY_SUCCESSFUL_STATE;
change_r <= now_coins - total_price;
系统框图
else if (cnt_delay == MAX_NUM)
sel_r <= {sel_r[0],sel_r[5:1]};
else
sel_r <= sel_r;
if (now_state == DEFAULT_STATE)
led_r <= 4'b0001;
else if(now_state == SELECT_STATE) begin
if (cnt_shine < SHINE_T/2)
led_r <= 4'b1100;
问题
蜂鸣器模块调用
蜂鸣器IO口连接在FPGA芯片,PWM输出信号只有高低电平,重复输出周期T,在高电平1时间为t的脉冲中,占空比t/T
定义输出周期,通过调整低电平占空比,如20,30等通过按键作为控制和触发条件, 持续周期内发出一种声音,切换后发出另一种声音。
乐谱模块
音频:音频(Audio),指人耳可以听到的声音频率在20HZ~20kHz之间的声波。乐普是由音符组成的,不同的音符拥有不同的频率。
计算出音符振动的周期,单位微秒。Cyclone IV开发板的晶振是50MHz,振动一次是20纳秒,使用周期时间除以20纳秒得出音符振动的次数。
D
O
(
高
)
=
955
×
1
0
3
20
=
47750
DO(高)= \frac{955×10^3}{20}=47750
DO(高)=20955×103=47750
不足
实现效果
按键消抖+点亮led灯
按键消抖+蜂鸣器
基于FPGA状态机的自动售货机功能实现
FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。