Verilog刷题HDLBits——Exams/review2015 fsmshift

该博客介绍了如何使用Verilog设计一个有限状态机(FSM)和计数器来控制shift_register。在FSM中,当检测到特定序列时,shift_register被启用并保持4个时钟周期。提供了三种不同的实现方案,包括直接使用FSM和通过计数器来控制shift_ena信号。在重置状态下,shift_ena会持续4个周期,然后永久为0,除非再次重置。
摘要由CSDN通过智能技术生成

Verilog刷题HDLBits——Exams/review2015 fsmshift

题目描述

This is the third component in a series of five exercises that builds a complex counter out of several smaller circuits. See the final exercise for the overall design.

As part of the FSM for controlling the shift register, we want the ability to enable the shift register for exactly 4 clock cycles whenever the proper bit pattern is detected. We handle sequence detection in Exams/review2015_fsmseq, so this portion of the FSM only handles enabling the shift register for 4 cycles.

Whenever the FSM is reset, assert shift_ena for 4 cycles, then 0 forever (until reset).
在这里插入图片描述

代码

// 解法一 使用有限状态机
module top_module (
    input clk,
    input reset,      // Synchronous reset
    output shift_ena);
    
    parameter A=0,B=1,C=2,D=3,E=4;
    reg[2:0] state,next_state;
    
    always@(*)
        case(state)
            A:next_state=B;
            B:next_state=C;
            C:next_state=D;
            D:next_state=E;
            E:next_state=E;
        endcase
    
    always@(posedge clk)
        if(reset)
            state<=A;
    	else
            state<=next_state;
    
    assign shift_ena = ~(state==E);

endmodule

// 解法二 使用计数器
module top_module (
    input clk,
    input reset,      // Synchronous reset
    output shift_ena);
    
    reg[2:0] count;
    always@(posedge clk)
        if(reset)
            count<=0;
        else if(count>=4)
            count<=4;
        else
            count<=count+1;
    
    assign shift_ena = (count==0|count==1|count==2|count==3);

endmodule

// 解法三 根据计数器什么时候加什么时候不加
module top_module (
    input clk,
    input reset,      // Synchronous reset
    output shift_ena);
    
    reg [2:0] count;
    wire count_end;

    always@(posedge clk)
        if(reset)
            count<=0;
        else if(shift_ena)
            count<=count+1;
        else
            count<=0;

    assign count_end = shift_ena && (count==3);

    always@(posedge clk)
        if(reset)
            shift_ena<=1;
        else if(count_end)
            shift_ena<=0;

endmodule

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值