【附源码】基于fpga的自动售货机(三段式状态机)

这篇具有很好参考价值的文章主要介绍了【附源码】基于fpga的自动售货机(三段式状态机)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、VL38 自动贩售机1

题目介绍

思路分析

代码实现

仿真文件

2、VL39 自动贩售机2

题目介绍:

题目分析

代码实现

仿真文件

3、状态机基本知识


1、VL38 自动贩售机1

题目介绍

        设计一个自动贩售机,输入货币有三种,为0.5/1/2元,饮料价格是1.5元,要求进行找零,找零只会支付0.5元。

ps:

        1、投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1,在下降沿到0的脉冲信号

        2、注意rst为低电平复位

信号示意图:

【附源码】基于fpga的自动售货机(三段式状态机)

波形示意图:

【附源码】基于fpga的自动售货机(三段式状态机)

思路分析

【附源码】基于fpga的自动售货机(三段式状态机)

代码实现

module seller1(
	input wire clk  ,
	input wire rst  ,
	input wire d1 ,			//0.5元
	input wire d2 ,			//1.0元
	input wire d3 ,			//2.0元
	
	output reg 		out1,	//饮料
	output reg [1:0]out2	//零钱
);
//*************code***********//


parameter [2:0]	s0 = 3'b000,
				s1 = 3'b001,		
				s2 = 3'b010,
				s3 = 3'b011,
				s4 = 3'b100,	
				s5 = 3'b101,
				s6 = 3'b110;
						
reg [2:0] curr_state;
reg [2:0] next_state;

//第一段 状态转移
always @(posedge clk or negedge rst)begin
	if(!rst)
		curr_state <= s0;
	else
		curr_state <= next_state;
	end

//第二段 转移状况
always @(*)begin
	case(curr_state)
		s0:begin	
			if(d1) 		next_state = s1;
			else if(d2) next_state = s2;
			else if(d3) next_state = s3;
			else 		next_state = next_state;	//为什么保持原值next_state,而不是s0?
		   end
		s1:begin	
			if(d1) 		next_state = s2;
			else if(d2) next_state = s4;
			else if(d3) next_state = s5;
			else 		next_state = next_state;
		   end
		s2:begin	
			if(d1) 		next_state = s4;
			else if(d2) next_state = s3;
			else if(d3) next_state = s6;
			else 		next_state = next_state;
		   end
		s3,s4,s5,s6:begin next_state = s0;end	
		default: begin next_state = s0;end
	endcase	   
end
	
//第三段 状态输出 moore FSM

always @(posedge clk or negedge rst)begin	//为什么用时序电路,而不是组合电路?
	if(!rst)
		out1 <= 0;
	else if(	
		next_state == s3 || 
		next_state == s4 || 
		next_state == s5 || 
		next_state == s6
	)
		out1 <= 1;	//出货标志
	else
		out1 <= 0;	
	end

always @(posedge clk or negedge rst)begin  //为什么用时序电路,而不是组合电路?
	if(!rst)
		out2 <= 0;
	else if(next_state == s3)
		out2 <= 2'd1;	//找零5毛的数量	
	else if(next_state == s5)
		out2 <= 2'd2;	
	else if(next_state == s6)
		out2 <= 2'd3;				
	else
		out2 <= 2'b0;	
	end

//*************code***********//
endmodule

针对代码中的问题“为什么保持原值next_state,而不是s0?”

答:如下图所示,如果保持s0,因为是组合逻辑,且输入信号d1为半个时钟周期,那么就会导致next_state在s1和s0之间翻转,而不是保持正确的状态s1。

【附源码】基于fpga的自动售货机(三段式状态机)

 参考这个回答:【附源码】基于fpga的自动售货机(三段式状态机)

仿真文件

仿真图:

【附源码】基于fpga的自动售货机(三段式状态机)

仿真代码:

module tb_seller1;
	
	reg clk;
	reg rst;
	reg d1,d2,d3;	
	
	wire 		out1;
	wire [1:0] 	out2; 
	
//1、初始化
initial begin
	clk = 0;
	rst = 0;
	d1 = 0;
	d2 = 0;
	d3 = 0;
end	
		
//2、产生激励
always #5 clk = ~clk;
	
initial begin
	#10;
	rst = 1'b1;
	
	#20;
	@(posedge clk); {d1,d2,d3}=3'b100;	//0.5
	@(posedge clk); {d1,d2,d3}=3'b000;	
	#50;                    
	@(posedge clk); {d1,d2,d3}=3'b010;	//1.5
	@(posedge clk); {d1,d2,d3}=3'b000;		
	#30;                    
	@(posedge clk); {d1,d2,d3}=3'b100;	//0.5
	@(posedge clk); {d1,d2,d3}=3'b000;		
	#60;                    
	@(posedge clk); {d1,d2,d3}=3'b100;	//1
	@(posedge clk); {d1,d2,d3}=3'b000;		
	#50;                    
	@(posedge clk); {d1,d2,d3}=3'b001;	//3
	@(posedge clk); {d1,d2,d3}=3'b000;		
	#50;                    
	@(posedge clk); {d1,d2,d3}=3'b001;	//2
	@(posedge clk); {d1,d2,d3}=3'b000;		
	#30;                    
	@(posedge clk); {d1,d2,d3}=3'b100;	//0.5
	@(posedge clk); {d1,d2,d3}=3'b000;		
	#60;                    
	@(posedge clk); {d1,d2,d3}=3'b001;	//2.5
	@(posedge clk); {d1,d2,d3}=3'b000;		
	#50;                    
	@(posedge clk); {d1,d2,d3}=3'b010;	//1
	@(posedge clk); {d1,d2,d3}=3'b000;		
	#60;                    
	@(posedge clk); {d1,d2,d3}=3'b010;	//2
	@(posedge clk); {d1,d2,d3}=3'b000;		
end	
	
//3、仿真暂停
initial begin
	#1000 
	$finish();
end		
	
//4、实例化
seller1 u1_seller1(
	.clk(clk),
	.rst(rst),
	.d1 (d1),		//0.5元
	.d2 (d2),		//1.0元
	.d3 (d3),		//2.0元
	.out1(out1),	//饮料
	.out2(out2)		//零钱
);
	
endmodule

2、VL39 自动贩售机2

题目介绍:

        设计一个自动贩售机,输入货币有两种,为0.5/1元,饮料价格是1.5/2.5元,要求进行找零,找零只会支付0.5元。

ps:

        1、投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1,在下降沿到0的脉冲信号

        2、此题忽略出饮料后才能切换饮料的问题

        注意rst为低电平复位

波形示意图:

【附源码】基于fpga的自动售货机(三段式状态机)

题目分析

【附源码】基于fpga的自动售货机(三段式状态机)

代码实现

module seller2(
	input wire clk  ,
	input wire rst  ,
	input wire d1 ,			//0.5元
	input wire d2 ,			//1.0元
	input wire sel ,		//0选择1.5元、1选择2.5元
		
	
	output reg 		out1,	//饮料1(1.5元)
	output reg 		out2,	//饮料2(2.5元)
	output reg [1:0]out3	//零钱
	
);
//*************code***********//


parameter [2:0]	s0 = 3'b000,
				s1 = 3'b001,		
				s2 = 3'b010,
				s3 = 3'b011,
				s4 = 3'b100,	
				s5 = 3'b101,
				s6 = 3'b110;
						
reg [2:0] curr_state;
reg [2:0] next_state;

//第一段 状态转移
always @(posedge clk or negedge rst)begin
	if(!rst)
		curr_state <= s0;
	else
		curr_state <= next_state;
	end

//第二段 转移状况
always @(*)begin
	case(curr_state)
		s0:	begin
				if(d1) 		next_state = s1;
				else if(d2) next_state = s2;
				else 		next_state = next_state;	
			end
		s1:	begin	
				if(d1) 		next_state = s2;
				else if(d2) next_state = s3;
				else 		next_state = next_state;	
			end
		s2:	begin
				if(d1) 		next_state = s3;
				else if(d2) next_state = s4;
				else 		next_state = next_state;	
			end
		s3:	begin	
			if(!sel)  	//选择饮料是1.5元还是2元
				begin next_state = s0; end		
			else begin 
				if(d1) 		next_state = s4;
				else if(d2) next_state = s5;
				else 		next_state = next_state;
			end
			end
		s4:	begin	
			if(!sel) 
				begin next_state = s0; end		
			else begin 
				if(d1) 		next_state = s5;
				else if(d2) next_state = s6;
				else 		next_state = next_state;
			end
			end		   
		s5:	begin next_state = s0; end
		s6:	begin next_state = s0; end	
		default: begin next_state = s0;end
	endcase	   
end
	
/********* 第三段 状态输出 moore FSM ************/

//出货标志
always @(posedge clk or negedge rst)begin	
	if(!rst)begin
		out1 <= 0;
		out2 <= 0;
	end	
	else if(sel==0 && (next_state == s3 || next_state == s4) )
		out1 <= 1;	//饮料1 
	else if(sel==1 && (next_state == s5 || next_state == s6) )
		out2 <= 1;	//饮料2 	
	else begin
		out1 <= 0;
		out2 <= 0;
	end		
end

//找零数量
always @(posedge clk or negedge rst)begin 
	if(!rst)
		out3 <= 0;	
	else if(sel==0 && (next_state == s4) )
		out3 <= 2'd1;	//饮料1 
	else if(sel==1 && (next_state == s6) )
		out3 <= 2'd1;	//饮料2 					
	else
		out3 <= 2'b0;	
end

//*************code***********//
endmodule

仿真文件

仿真图如下:

【附源码】基于fpga的自动售货机(三段式状态机)

3、状态机基本知识

【附源码】基于fpga的自动售货机(三段式状态机)

【附源码】基于fpga的自动售货机(三段式状态机)

 【附源码】基于fpga的自动售货机(三段式状态机)

【附源码】基于fpga的自动售货机(三段式状态机)

【附源码】基于fpga的自动售货机(三段式状态机)

【附源码】基于fpga的自动售货机(三段式状态机)

【附源码】基于fpga的自动售货机(三段式状态机)


以上是mealy和moore型状态机的实现区别,注意在代码里理解!文章来源地址https://www.toymoban.com/news/detail-427365.html

到了这里,关于【附源码】基于fpga的自动售货机(三段式状态机)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自动售货机控制系统的FPGA设计与实现

            采用VHDL语言设计一个自动售货机控制系统,要求能在MaxPlus Ⅱ软件平台进行仿真模拟,技术指标如下: 1)有2元、3元、8元商品;有1元、5元、10元钱币; 2)当投入的总币值大于顾客购买的商品单价时,机器提供商品并将余币退出,回到初始状态;若投入的总币值小

    2024年02月06日
    浏览(33)
  • stm32毕设 自动售货机设计与实现(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月08日
    浏览(30)
  • 基于单片机的自动售货机系统设计

    欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式   本文设计基于单片机的自动售货机系统,分为硬件电路设计与软件设计。硬件电路设计,本系统由ST(意法半导体)公司设计和生产的STM32F103C8T6单片

    2024年02月03日
    浏览(32)
  • 售货机基于ego1开发板的自动饮料机verilog代码vivado软件

    名称:售货机基于ego1开发板的自动饮料机verilog代码vivado软件 软件:VIVADO 语言:Verilog 代码功能: 设计一个自动饮料机逻辑电路, 它的投币口只能投入一枚五角或一元硬币; 投入一元五角硬币后机器自动给出一杯饮料,投入两元硬币后再给出饮料的同时找回一枚五角硬币;

    2024年01月18日
    浏览(39)
  • FPGA开发基础之三段式状态机

    状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,程序的运行其本质也是状态机,根据输入完成输出,得到新的状态。 在平时硬件电路的设计中经常需要用到状态机,例如CPU的取指、译码、执行,这个流程可以使用状态机来控制

    2024年02月04日
    浏览(33)
  • 三段式电流保护与自动重合闸MATLAB仿真模型

    微 ❤ 关注“电气仔推送”获得资料(专享优惠) 前加速、后加速的区别: 前加速是保护装置不判别是永久性故障还是瞬时故障,直接跳闸,然后经重合闸装置来纠正;后加速是保护装置是先判别故障类型有选择性跳闸 以下只叙述后加速的相关内容,前加速不在赘述!!!

    2024年02月02日
    浏览(26)
  • python自动售货机

    分享python实现自动售货一个小作业 输入2进行购买商品,输入商品id和数量,可以选择不同商品,最后进行结账操作。 可以有两种查询方式,全部查询和按时间条件查询 具体操作如下: 全部查询: 时间条件查询: 就按4直接退出23333 其实就是参考路边的自动售货机贩卖饮料啥的,

    2024年02月11日
    浏览(22)
  • 【Python实训】饮品自动售货机

    这段代码定义了三个函数:show_goods()、total()和main()。show_goods()函数用于展示饮品信息,total()函数用于计算总额,main()函数用于控制整个饮品自动售货机的操作流程。 运行程序后,会首先调用show_goods()函数展示饮品信息,然后用户可以根据展示的信息选择饮品和数量,输入

    2024年02月05日
    浏览(32)
  • 如何用Java设计自动售货机?

    如何用Java设计自动售货机?是大多在高级Java开发人员面试中经常被问到的好问题之一。在典型的编码面试中,你会得到一个问题描述来开发一个售货机,在有限的时间内,通常2到3小时内,你需要在Java中编写设计文档、工作代码和单元测试。这种Java面试的一个关键优势是可以一次

    2024年02月05日
    浏览(86)
  • 自动售货机销售数据分析与应用

    本书不仅适用于零基础的读者自学,还适用于教师教学,为了帮助读者更加高效地掌握本书的内容,本书提供了以下10项附加价值: (1)建模平台:提供一站式大数据挖掘建模平台,免配置,包含大量案例工程,边练边学,告别纸上谈兵 (2)视频讲解:提供不少于600分钟

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包