FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合
程序员文章站
2024-03-19 18:05:22
...
项目:FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合
运用模块:按键消抖模块、有限状态机模块、LED模块(呼吸灯、双向流水灯、流水呼吸灯)、数码管模块。
项目内容:1、设置三个按键:常用的复位键、按键1(0.5元)、按键2(1元)。按键1、按键2要按键消抖。
2、运用有限状态机:初始状态(未投币)、每投0.5元便会亮一盏led灯,若直接投1元便会亮二盏led灯,当金额累 计到 2元时,亮四盏灯,若再投0.5元,led灯为呼吸灯(可乐出!),若在2元的基础上投1元,找零0.5元,找零期间为流水呼吸灯,找零后可乐出,led灯为呼吸灯。最后4S后还原初始状态,led灯为双向流水灯!
3、数码管要实时与投币结果相同,投0.5元显示投0.5,累计金额为2元时也显示2元,当遇见找零的情况下显示-0.5 元,当可乐出货时,数码管显示888888表示为出货!
项目构建:
项目结果展示:
初始状态图,LED为双向流水灯
投币到1.5元时
可乐出货时,LED为呼吸灯状态
找零时状态图,LED为流水呼吸灯
附录(部分程序)
module fsm (
input wire sclk ,
input wire rst_n ,
input wire one_yuan ,
input wire half_yuan ,
output reg[6:0]state
);
parameter IDLE = 7'b0000001 ; //初始状态
parameter HALF_ZERO = 7'b0000010 ; //0.5元
parameter ONE = 7'b0000100 ; //1元
parameter HALF_ONE = 7'b0001000 ; //1.5元
parameter TWO = 7'b0010000 ; //2元
parameter COKE = 7'b0100000 ; //可乐出货
parameter CHANGE = 7'b1000000 ; //找零
reg [27:0] cnt_4s ;
//state
aaa@qq.com(posedge sclk or negedge rst_n)
if(rst_n == 1'b0)
state <= IDLE ;
else case(state)
IDLE :
if(one_yuan == 1'b0 && half_yuan == 1'b1)
state <= HALF_ZERO ;
else if(one_yuan == 1'b1 && half_yuan == 1'b0)
state <= ONE ;
else
state <= IDLE ;
HALF_ZERO :
if(one_yuan == 1'b0 && half_yuan == 1'b1)
state <= ONE ;
else if(one_yuan == 1'b1 && half_yuan == 1'b0)
state <= HALF_ONE ;
else
state <= HALF_ZERO ;
ONE :
if(one_yuan == 1'b0 && half_yuan == 1'b1)
state <= HALF_ONE ;
else if(one_yuan == 1'b1 && half_yuan == 1'b0)
state <= TWO ;
else
state <= ONE ;
HALF_ONE :
if(one_yuan == 1'b0 && half_yuan == 1'b1)
state <= TWO ;
else if(one_yuan == 1'b1 && half_yuan == 1'b0)
state <= IDLE ;
else
state <= HALF_ONE ;
TWO :
if(one_yuan == 1'b0 && half_yuan == 1'b1)
state <= COKE ;
else if(one_yuan == 1'b1 && half_yuan == 1'b0)
state <= CHANGE ;
else
state <= TWO ;
COKE :
if(cnt_4s==28'd199_999999)
state <= IDLE ;
else
state <= COKE ;
CHANGE :
if(cnt_4s==28'd199_999999)
state <= COKE ;
else
state <= CHANGE ;
default: state <= IDLE ;
endcase
//cnt_4s
aaa@qq.com(posedge sclk or negedge rst_n)
if(rst_n == 1'b0)
cnt_4s <= 28'b0 ;
else if(cnt_4s == 28'd199_999999 && state == COKE||cnt_4s == 28'd199_999999 && state == CHANGE)
cnt_4s <= 28'd0 ;
else if (state == COKE||state == CHANGE)
cnt_4s <= cnt_4s + 1'b1 ;
endmodule
本文为原创博客,请勿用于商用,转载请说明转载处:https://blog.csdn.net/qq_40261818/article/details/81487593
上一篇: 怎么快速的掌握一门语言