2021-10-05

@HDLBITS刷题答案

Circuits

3.2.5 Finite State Machines

3.2.5.20 Sequence recognition(Fsm hdlc)

1.问题:
创建一个有限状态机来识别这三个序列:
输入in为0111110:其中’1‘的个数为5的时候,disc=1;
输入in为’01111110’:其中’1‘的个数为6的时候,flag=1;
输入in为’01111111……‘;其中’1‘的个数多余6的时候,err=1;
在这里插入图片描述2.答案如下

module top_module(
    input clk,
    input reset,    // Synchronous reset
    input in,
    output disc,
    output flag,
    output err);
    
    /*******1.输入、输出、状态量、中间变量定义***********/
    parameter BEGIN=3'D0, DATA=3'D1, DISC=3'D2, FLAG=3'D3, ERR=3'D4;
    reg[2:0] state,next_state;
    integer i;
    
   /*******2.时序逻辑,根据下一逻辑或者复位信号来得到当前逻辑***********/
    always@(posedge clk)begin
        if(reset)
            state<=BEGIN;
        else 
            state<=next_state;
    end

   
    /*******3.执行状态DATA计数,根据时序图中’1‘的数量不超过6***********/
    always@(posedge clk)begin
        if(reset)
            i<=0;
        else if(next_state==DATA)
                i++;
        else 
           i<=0;
    end
    
     /*******4.组合逻辑,根据当前状态和输入in情况判断下一状态***********/       
    always@(state,in)begin
        case(state)
            BEGIN: 
                next_state= in ? DATA:BEGIN;
            DATA : 
                if(in && i<6)  //in=011111
                    next_state=DATA;
            	else if(in) //i=0111111...
                    next_state=ERR;
           		else if(i==6)//in=01111110
                	next_state=FLAG;
          	    else if(i==5)    //in=0111110
                	next_state=DISC;
                else  //in=其他,比如010...
                    next_state=BEGIN;
                   
            DISC:      //代表in=0111110
                next_state= in ? DATA:BEGIN;
            FLAG:     //代表in=01111110
                next_state= in ? DATA:BEGIN;
            ERR:      //代表in=01111111
                next_state= in ? ERR:BEGIN;
            default:next_state=BEGIN;
        endcase
    end
    
    /*******5.根据状态得出输出***********/
     /* assign disc = (state == DISC);
    assign err = (state == ERR);
    assign flag = (state == FLAG);*/
    always@(*)begin
        case(state)
            DISC:
                begin disc=1;end
            FLAG:
                begin flag=1; end
            ERR:
                begin  err=1;end
            default: 
                begin disc=0;flag=0; err=0;end
        endcase
    end
endmodule

3 .后语
注释都在代码中,希望和大家共同进步,来日方长,后会有期,觉得有用的朋友们点个赞支持一下,欢迎补充!!!

3.2.5.21 Q8.Design a mealy FSM(Exams/ece241 2013 q8)

1.问题:
仅用三个状态,实现系列’101‘重叠检测
2.答案

module top_module (
    input clk,
    input aresetn,    // Asynchronous active-low reset
    input x,
    output z ); 
   
    //题目要求用三个状态
    /*******1.输入、输出、状态量、中间变量定义***********/
    parameter BEGIN=2'D0,A_STA=2'D1,B_STA=2'd2;
    reg[1:0] state,next_state;
    
     /*******2.时序逻辑,根据下一逻辑或者复位信号来得到当前逻辑***********/
    always@(posedge clk ,negedge aresetn)begin
        if(!aresetn)
           state<=BEGIN;
        else 
             state<=next_state;
    end
    
    /*******3.组合逻辑,根据当前状态和输入x情况判断下一状态***********/
    always@(*)begin
        case(state)
            BEGIN: //状态x0
                next_state= (x)? A_STA:BEGIN;
            A_STA: //状态x1
                next_state= (x)? A_STA:B_STA;
            B_STA: //状态x10
                next_state= (x)? A_STA:BEGIN;
            default: next_state=BEGIN;
        endcase
    end
    
    /*******4.根据状态得出输出***********/
    //assign z=(state==B_STA) && (x==1);
   	always@(posedge clk ,negedge aresetn)begin 
        case(state) 
            B_STA :  z=x;    
            default: z=0;
        endcase
    end
    
endmodule

3 .后语
注释都在代码中,希望和大家共同进步,来日方长,后会有期,觉得有用的朋友们点个赞支持一下,欢迎补充!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值