HDLBits Exams/2013 q2bfsm

本文详细阐述了一个基于考试计数器的电路设计,通过状态机模型解决了f信号的脉冲控制和输入X、Y的序列检测问题。作者将状态分为A、B1-B2、C1-C3、D1-D4,确保了正确计数和输出g的触发条件。代码展示了如何使用Verilog描述这一过程。
摘要由CSDN通过智能技术生成
1.原题复现

Exams/2013 q2bfsm
在这里插入图片描述

2.思路以及代码

给出自己画的状态图:
把复位后的状态设为状态A,经过一个时钟后,将会拉高f置位1,但是f只能保持一个时钟周期内为1,之后又被拉低,因此把状态B分解为B1和B2,避免计数。在f为0之后,便开始对输入X开始计数,计数的规律就相当于序列检测一样,把整个序列检测过程设定为状态C,又细分为C1,C2,C3。在检测到连续的101之后,将输出g在下一个时钟设为高电平。当g置为高电平之后,便开始对接下来的两个周期开始进行计数,但是我将计数转换成了状态D。分为D1,D2,D3,D4。
D1的作用为,第一个时钟周期到来时候,输入y已经置位1,因此,可以一直保持输出g为1
D2表示,第一个时钟周期到来时候,输入y为0,开始对第二个时钟周期开始计数,第二个时钟周期又分为两种状态,一个是y仍然为低电平,另一个是y变为高电平,也就形成了相应的状态D3,和D4。
在这里插入图片描述

代码:
module top_module (
    input clk,
    input resetn,    // active-low synchronous reset
    input x,
    input y,
    output f,
    output g
); 
    parameter A=0,B1=1,C1=2,C2=3,C3=4,D1=5,D2=6,D3=7,D4=8,B2=9;
    reg[3:0]state,next_state;
    reg cout;
    always@(*)begin
        case (state)
             	 A:next_state = B1;
                 B1:next_state = B2;
            	 B2:next_state = x?C1:B2;
                 C1:next_state = x?C1:C2;
                 C2:next_state = x?C3:B2;
                 C3:next_state =y?D1:D2;
            	D1:next_state =D1;
                D2:next_state =y?D4:D3;
                D3:next_state =D3;
                D4:next_state =D4;
        endcase
    end
    always@(posedge clk)begin
        if(~resetn)begin
           state<=A; 
        end
        else begin
           state<=next_state; 
        end
    end

    assign f = (state==B1);
    assign g = (state==C3)||(state==D1)||(state==D2)||(state==D4);
endmodule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值