Exams/2013 q2bfsm_HDLbits 不同思路详解

本文探讨了一种用于电机控制的有限状态机(FSM)设计,详细描述了其状态转移逻辑,包括初始状态处理、输入信号x和y的响应,以及g信号的定时逻辑。两种不同的设计思路中,一种涉及复杂状态和延时计数,另一种简化了对y的判断。关键在于实现f输出的延迟和g信号根据输入条件的精确控制。
摘要由CSDN通过智能技术生成

1、考虑用于控制某种类型电机的有限状态机。FSM有来自电机的输入x和y,并产生控制电机的输出f和g。还有一个称为clk的时钟输入和一个称为reset N的复位输入。

FSM必须按如下方式工作。只要复位输入被断言,FSM就保持在一个开始状态,称为状态a。当复位信号被解除断言时,在下一个时钟边缘之后,FSM必须在一个时钟周期内将输出f设置为1。然后,FSM必须监控x输入。当x在三个连续的时钟周期内产生值1、0、1时,则应在下一个时钟周期将g设置为1。在保持g=1的同时,FSM必须监控y输入。如果y的值在最多两个时钟周期内为1,则FSM应永久保持g=1(即,直到复位)。但如果y在两个时钟周期内没有变为1,则FSM应永久设置g=0(直到复位)。

(1)思路一

一开始的思路是:设置A、B、C、D、E、F 共6种状态,初始态为A,当接受到第一个1时变为B;B接收到0则到C;C接收到1则到D(此时需要进行比较复杂的判断);通过y的关系判断E和F。

由于有几个clk的延后,在这里加了几个参数

     module top_module (
    input clk,
    input resetn,    // active-low synchronous reset
    input x,
    input y,
    output f,
    output g
); 
    parameter A=0,B=1,C=2,D=3,E=4,F=5;
    reg [3:0] state,nstate;
    reg [2:0] q;
    integer z;
    reg [2:0] ctr;
    always @(posedge clk)
        begin
            if(!resetn) begin state=A;z=0;end
            else 
                begin 
                    z =z+1; 
//z=0时,不发生状态转变,=1时才发生,从而达到了延迟一个clk的目的,并输出f;
                    state=(z>2)?nstate:A; 
                end
        end
            assign f=(z==1)? 1:0;
    
    always @(posedge clk)
        begin
            if(!resetn) begin ctr <=0;q <=0; end
            else if(state==D) 
                begin  //加入q对clk进行判断。
                    if(q==1|q==2) begin ctr <= ctr+y; end 
                    //q=0时,不计y;q=1,2时,考虑y。
                    else if(q==3) begin ctr<=0;q<=0;end
                   //q==3时归零(只考虑两个clk)
            		q<=q+1;
                end 
        end
    
    always @(*)
        begin
            case(state)
                A:nstate =(x)?B:A;
                B:nstate =(x)?B:C;
                C:nstate =(x)?D:A;
                D:nstate =(q<=1)? D:(ctr>=1)?E:F;
                E:nstate =E;
                F:nstate =F;
                default:nstate =A;
            endcase
        end
    assign g =(state==E|state==D)? 1:0;
endmodule

 一直显示有错误,原因大概是在y的判断那一部分,实在写不出来,换了个思路。

(2)思路2

相比于思路一,增加了一个状态D0;简化对y的判断方法。

    module top_module (
    input clk,
    input resetn,    // active-low synchronous reset
    input x,
    input y,
    output f,
    output g
); 
    parameter A=0,B=1,C=2,D=3,E=4,F=5,D0=6;
    reg [3:0] state,nstate;
    reg [2:0] q;
    integer z;
    reg [2:0] ctr;
    always @(posedge clk)
        begin
            if(!resetn) begin state=A;z=0;end
            else 
                begin 
                    z =z+1; 
                    state=(z>2)?nstate:A; 
                end
        end
            assign f=(z==1)? 1:0;
     
    always @(*)
        begin
            case(state)
                A:nstate =(x)?B:A;
                B:nstate =(x)?B:C;
                C:nstate =(x)?D:A;
                D:nstate =(y)? E:D0;
                D0:nstate =(y)? E:F; 
//加了一个状态明显简单了很多,不需要再对y的判断的同时计数
                E:nstate =E;
                F:nstate =F;
                default:nstate =A;
            endcase
        end
        assign g =(state==E|state==D|state==D0)? 1:0;
endmodule

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值