状态机学习

状态机学习

`timescale 1ns / 1ps

//本代码是状态机 在三个状态来回切换
//三个状态:IDLE 0 1,  S 1 0, S2 0 0;
module state_1(
input key1,
input key2,
input clk,
input rst,
output reg cnt_en,
output reg load
//output reg [1:0]cstate,
//output reg [1:0]nstate
    );
    //状态编码
parameter
	[1:0]s1=2'b00;
parameter
	[1:0]s2=2'b10;
parameter
	[1:0]IDLE=2'b01;
reg [1:0]cstate;
reg [1:0]nstate;
/*
reg [26:0]counter;
wire clk2Hz;
//counter 分频计数器
parameter CNT=50000000;
initial counter=0;
always @(posedge clk or posedge rst)

    if(rst)
        counter<=0;
    else if (counter==CNT-1)
        counter<=0;
    else counter<=counter+1;
    assign clk2Hz=(counter==CNT-1)?1:0;
   */
    
    
//状态转移
always @(posedge clk or posedge rst)
	if(rst)
		cstate<=IDLE;
	else
		cstate<=nstate;
	
//次态判断
always @*
    //if(clk2Hz)
        case(cstate)
            IDLE:
            begin
            if(key1==1)
            nstate=s1;
            else
            nstate=IDLE;
            end
            //nstate<=key1&s1|(~key1)&IDLE;
            s1://nstate<=key1&s2|(~key1)&s1;
            begin
            if(key1==1)nstate=s2;
            else nstate=s1;
            end
            s2://nstate<=key1&s1|key2&IDLE;
            begin
            if(key2==1)
            nstate=IDLE;
       
            else if(key1==1)
            nstate=s1;
            else
            nstate=s2;
           end
            default: nstate=IDLE;
        endcase
   // else
     //   nstate=cstate;

     
     
//次态输出
always @(posedge clk )//or posedge rst)
begin
    //else
        case(cstate)
            IDLE:begin cnt_en<=0;load<=1;end
            s1:begin cnt_en<=1;load<=0;end
            s2:begin cnt_en<=0;load<=0;end
            default:begin cnt_en<=0;load<=1;end
        endcase
 end
endmodule


module edgecheck(
input key1,key2,
input clk,rst,
output Yup1,Yup2
);
reg a1,b1;
always @(posedge clk,posedge rst)
if(rst)begin
	a1<=0;
	b1<=0;
end
else begin
	a1<=key1;
	b1<=a1;
end
assign Yup1=a1&(~b1);
reg a2,b2;
always @(posedge clk,posedge rst)
if(rst)begin
	a2<=0;
	b2<=0;
end
else begin
	a2<=key2;
	b2<=a2;
end
assign Yup2=a2&(~b2);
//assign Ydown=(~a)&b;
//assign Yan=~a;
//assign Ybn=~b;

endmodule



module  main(
input clk,
input rst,
input key1,
input key2,
output wire cnt_en,
output wire load
//output wire [1:0]nstate,
//output wire [1:0]cstate
);
wire Yup1,Yup2;
state_1 zhuo1(
.key1(Yup1),
.key2(Yup2),
.clk(clk),
.rst(rst),
.cnt_en(cnt_en),
.load(load)
//.nstate(nstate),
//.cstate(cstate)
);
edgecheck zhuo2(
.key1(key1),
.key2(key2),
.clk(clk),
.rst(rst),
.Yup1(Yup1),
.Yup2(Yup2)
);
endmodule

此处代码我编的感觉不是很顺畅,用标准模板反而达不到效果,我把一些多余的删除后反而成功了。
三个状态的相互转换。

备注:本代码由西安交通大学电气工程及其自动化专业教学使用,如有侵权,联系作者删除。 本代码为西安交通大学学生备忘而用。
如果有共同爱好者,可以一起学习
qq:2685783428

如果代码有用,请尽情的点赞和打赏即可
白嫖虽然爽,但是违背公序良俗,不可取哦,亲(づ ̄3 ̄)づ╭❤~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值