经典三段式状态机写法

用可综合的verilog模块设计复杂的多输出状态机时常用的方法

module fsm(Clock, Reset ,A, K2, K1);
	input Clock, Reset, A;
	output K2, K1;
	reg	K2, K1;
	reg[1:0] state, nextstate;

parameter
	Idle = 2'b00,
	Start = 2'b01;
	Stop = 2'b10;
	Clear = 2'b11;

//每一个时钟沿可产生一次可能的状态变化
always@(posedge Clock)
	if(!Reset)
		state <= Idle;
	else
		state <= nextstate;

//描述下一状态的组合逻辑
always@(state or A)
	case (state)
		Idle : if(A)	
				nextstate = Start;
				else
				nextstate = Idle;
		Start : if(!A)
				nextstate = Stop;
				else
				nextstate = Start;
		Stop : if(A)
				nextstate = Clear;
				else
				nextstate = Stop;
		Clear : if(!A)	
				nextstate = Idle;
				else
				nextstate = Clear;
		default : nextstate  = 2'bxx;
	endcase

//产生输出K1的组合逻辑
always@(state or Reset or A)
	if(!Reset)
		K1 = 0;
	else
		if(state == Clear && !A)
			K1 = 1;
		else 
			K1 = 0;
	
//产生输出K2的组合逻辑
always@(state or Reset or A)
	if(!Reset)
		K1 = 0;
	else
		if(state == Stop && A)
			K2 = 1;
		else 
			K2 = 0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值