Verilog四段式状态机的书写规范

声明:内容来自明德扬FPGA培训视频部分内容,本文为部分讲师讲解内容和作者的理解摘记。

state_c 是当前状态(现态);state_n是下一个状态(次态);IDLE表示初始状态(当然,不需要专门为复位信号设计idle作为初始状态,初始化就是s1,然后几个状态之间转换);s1、s2、s3表示第一、二、三种状态;s12s2中第一个2是“to”的音译化用,短句表示从第一个状态to(到)第二个状态;

一、状态机第一段

同步时序的always模块,格式化描述次态迁移到现态寄存器

//状态机第一段verilog代码:

always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        state_c <= IDLE;
    end
    else begin
        state_c <= state_n;
    end
end

二、状态机第二段

组合逻辑的always模块,描述状态转移条件判断,但是!具体判断条件不在第二段描述。重要一点,组合逻辑一定要写补全条件,else begin。

always@(*)begin
    case(state_c)
        IDLE:begin
//现在的状态是IDLE
            if(idle2s1_start)begin
//状态转移条件满足,idle状态转到s1状态
                state_n = S1;
//次态为s1
            end
            else begin
                state_n = state_c;
//条件不满足时,次态为现态
            end
        end
        S1:begin
            if(s12s2_start)begin
                state_n = S2;
            end
            else begin
                state_n = state_c;
            end
        end
        S2:begin
            if(s22s3_start)begin
                state_n = S3;
            end
            else begin
                state_n = state_c;
            end
        end
        default:begin
            state_n = IDLE;
        end
    endcase
end

三、状态机第三段

定义具体状态转移条件。

//示例:
assign idl2s1_start  = state_c==IDLE && cnt==7-1;
//idle状态到s1状态触发条件(idl2s1_start)连接现态且满足cnt==7-1时,触发状态转移(idle到s1)。
assign s12s2_start = state_c==S1     && ;
assign s22s3_start  = state_c==S2    && ;

四、状态机第四段

同步时序always模块,一个always一个输出信号,描述寄存器输出。

always  @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        out1 <=1'b0      //初始化
    end
    else if(state_c==S1)begin
        out1 <= 1'b1;
    end
    else begin
        out1 <= 1'b0;
    end
end

四段式状态机设计完成。另外,在gvim明德扬版本中输入Ztj  弹出模板。

状态机划分的依据,是为了最终方便的产生输出信号(或其他信号)!

——————————————————————————————————————————

问:在波形设计中,状态机对齐的对象,状态机的状态(state_c)是对齐din  还是 dout?

答:din是输入信号,状态机状态根据din来变换状态,最终输出dout,所以状态是对齐din信号

PS:FPGA没有过程的概念,只有分情况的概念。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值