HDLBits-【FSM-序列生成及负数补码】

1.Exams/ece241 2013 q8

  实现一个Mealy类型的有限状态机,该状态机识别名为x的输入信号上的序列“101”。您的FSM应具有一个输出信号z,当检测到“101”序列时,该信号被断言为逻辑-1。您的FSM还应具有活动低异步重置。状态机中只能有3个状态。FSM应该识别重叠序列。
  根据要求可画得时序图如下所示:
在这里插入图片描述

module top_module (
    input clk,
    input aresetn,    // Asynchronous active-low reset
    input x,
    output z ); 
	parameter A=2'd0,B=2'd1,C=2'd2;
    reg [1:0]cs,ns;
    
    always@(posedge clk,negedge aresetn)begin
        if(aresetn==1'b0)
            cs<=A;
        else
            cs<=ns;
    end
    
    always@(*)begin
        case(cs)
            A:ns=x?B:A;
            B:ns=x?B:C;
            C:ns=x?B:A;
            default:ns=A;
        endcase
    end
    assign z=(cs==C)&&(x==1);
endmodule

2.Exams/ece241 2014 q5a

【先参照第3题再回来写本题】
  您将设计一个单输入单输出串行2的补码器摩尔状态机。输入(x)是从数字的最低有效位开始的一系列位(每个时钟周期一个),输出(Z)是输入的2的补码。机器将接受任意长度的输入数字。该电路需要异步复位。当复位被释放时转换开始,当复位被断言时转换停止。
在这里插入图片描述
  根据要求可画得时序图如下所示:
在这里插入图片描述

module top_module (
    input clk,
    input areset,
    input x,
    output z
); 
    parameter A=3'd0,B=3'd1,C=3'd2,D=3'd3;
    reg [2:0]state,next_state;
    always@(posedge clk,posedge areset)begin
        if(areset)begin
           state<=A; 
        end
        else begin
           state<=next_state; 
        end
    end
    
    always@(*)begin
        case(state)
            A:next_state=x?B:A;
            B:next_state=x?D:C;
            C:next_state=x?D:C;
            D:next_state=x?D:C;
            default:next_state=A;
        endcase
    end
    
    assign z=(state==B)||(state==C);
endmodule

3.Exams/ece241 2014 q5b

解题关键:【补码定义】负数的补码等于他的原码自低位向高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。
  比如10010100,从右往左(低到高位)找到第一个1,此刻保持这第一个1与右边的0不变,1左边的数进行取反。变成[01101 100]
本题中A代表对[从右往左对1]的寻找,找到了输入1则进入B状态。B状态为对那个1左边的数取反。
在这里插入图片描述

module top_module (
    input clk,
    input areset,
    input x,
    output z
); 
	parameter A=1'b0,B=1'b1;
    reg state,next_state;
    always@(posedge clk,posedge areset)begin
        if(areset)
            state<=A;
        else 
            state<=next_state;
    end
    
    always@(*)begin
        case(state)
            A:next_state=x?B:A;
            B:next_state=B;
            default:next_state=A;
        endcase
    end
    
    assign z=(state==A&&x==1'b1)||(state==B&&x==1'b0);
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值