状态机架构 例1例2

例1. 周期跳转状态机
状态机有三个状态,IDLE,S1和S2。在IDLE状态,如果en=1,则跳到S1状态,否则保持不变;在S1状态时,保持5个时钟周期后,跳到S2状态; 在S2状态,保持7个时钟周期后,跳回到IDLE状态。

  1. 状态转移图
    在这里插入图片描述

  2. 状态转移代码

always@(*) begin
	case(state_c)
	IDLE: begin
		if(idle2s1) state_n = S1;
		else state_n = state_c;
	end
	S1: begin
		if(s12s2) state_n = S2;
		else state_n = state_c;
	end
	S2: begin
		if(s22idle) state_n = IDLE;
		else state_n = state_c;
	default: state_n = state_c;
	endcase
end
assign idle2s1 = state_c==IDLE && en==1;
assign s12s2 = state_c==S1 && end_cnt1;
//assign s12s2 = state_c==S1 && cnt==4;因为add_cnt1=1,所以这两种写法都行
assign s22idle = state_c==S2 && cnt==6;
  1. 其他信号
    条件不够时,要构造信号,即cnt。
    用一个计数器即可;初值:0;加1条件:S1或S2状态;结束
    条件:S1时为4,S2时为6
always @(posedge clk or negedge rst_n)begin
	if(!rst_n)
	cnt <= 0;
	else if(state_c==S1)begin
		if(add_cnt1) begin
			if(end_cnt1)
			cnt<=0;
			else 
			cnt <= cnt + 1;
		end
	end
	else if(state_c==S2)begin
		if(add_cnt2) begin
			if(end_cnt2)
			cnt<=0;
			else 
			cnt <= cnt + 1;
		end
	end
end

assign add_cnt1 = 1;       
assign end_cnt1 = add_cnt && cnt== 4;   
assign add_cnt2 = 1;       
assign end_cnt2 = add_cnt && cnt== 6;  
//因为add_cnt=1,所以计数模块可以简化为:
always @(posedge clk or negedge rst_n)begin
	if(!rst_n)
	cnt <= 0;
	else if(state_c==S1)begin
		if(cnt== 4)
		cnt<=0;
		else 
		cnt <= cnt + 1;
	end
	else if(state_c==S2)begin
		if(cnt== 6)
		cnt<=0;
		else 
		cnt <= cnt + 1;
	end
end

例2. 信号计数跳转状态机
状态机有三个状态,IDLE,S1和S2。在IDLE状态,如果en=1,则跳
到S1状态,否则保持不变;在S1状态时,统计en=1的次数,如果达到5次,
则跳到S2状态,否则保持不变;在S2状态,统计en=1的次数,如果达到7次
,则跳回到IDLE状态,否则保持不变。(注:全部信号都是同步信号,即与
时钟同步)
和例1的区别在于,要对en=1出现的次数进行计数。

  1. 状态转移图
    在这里插入图片描述

  2. 状态转移代码

assign s12s2 = state_c==S1 && end_cnt1;
assign s22idle = state_c==S2 && end_cnt2;
  1. 其他信号cnt
    初值:0;加1条件:在S1或S2状态,
    en=1;结束条件:S1时为4,S2时为6
assign add_cnt1 = en==1;       
assign end_cnt1 = add_cnt && cnt== 4;   
assign add_cnt2 = en==1;       
assign end_cnt2 = add_cnt && cnt== 6;  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值