IC验证学习笔记(手撕代码)-6饮料机

使用Verilog设计电路,完成以下功能:每瓶饮料1.5元,一次只能投入一个硬币,可投入0.5与1.0两种硬币,具有找零功能。

这个手撕代码应该用状态机来完成

IDLE:复位状态,表示饮料机中的余额为0元
s1:饮料机的余额为0.5元
s2:饮料机中的余额为1元
s3:饮料机中的余额为1.5元(输出饮料,不找零)
s4:饮料集中的余额为2元(输出饮料,找零)

分别设置两个输入(五毛、一块)和两个输出(出饮料、找零)

module ylj(clk,rst,pfive,one,cush,drink);
	input clk,rst,pfive,one;
	output cush,drink;
	
	parameter IDLE=3'd0,S1=3'd1,S2=3'd2,S3=3'd3,S4=3'd4;
	
	reg[2:0]state,nstate;
	always@(posedge clk or negedge rst)begin
		if(!rst)
			state<=IDLE;
		else
			state<=nstate;
	end 
	
	always@(*)begin
		case(state)
			IDLE: nstate=pfive?S1:(one?S2:IDLE);
			S1:nstate=pfive?S2:(one?S3:S1);
			S2:nstate=pfive?S3:(one?S4:S2);
			S3:nstate=pfive?S1:(one?S2:IDLE);
			S4:nstate=pfive?S1:(one?S2:IDLE);
		default:nstate=IDLE;
		endcase
	end
	
	assign cush=(state==S4)?1:0;
	assign drink=(state==S3||state==S4)?1:0;
endmodule

testbench 五毛一块只有一个为1

`timescale 1ns/1ps
module ylj_tb();
	reg clk;
	reg rst;
	reg pfive;
	reg one;
	wire cush;
	wire drink;
	
	ylj u1(.clk(clk),.rst(rst),.pfive(pfive),.one(one),.cush(cush),.drink(drink));
	always
		#5 clk=~clk;
		
	always begin
		#9.999 pfive=$random;
				one=!pfive;
	end
	initial begin
		clk=0;
		rst=1;
	#10  rst=0;
	#20	rst=1;
	#300
	$stop;
		
	end 
endmodule	

波形

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值