欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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表示为出货!

项目构建:

FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合

FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合

 

项目结果展示:

FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合

 

        初始状态图,LED为双向流水灯

 FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合

        投币到1.5元时

 

FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合

       可乐出货时,LED为呼吸灯状态

 

FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合

找零时状态图,LED为流水呼吸灯

FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合

FPGA verilog HDL 基于有限状态机设计自动贩卖机及综合

附录(部分程序)

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