HDLbits:Exams/review2015 fancytimer

该模块是一个基于Verilog的状态机设计,用于在接收到输入数据后延迟特定数量的时钟周期。它包含两个计数器,counter1用于计数4个时钟周期,counter2用于计数到1000,当计数完成时,输出done信号。在等待和执行延迟期间,状态机在不同的状态间切换。
摘要由CSDN通过智能技术生成

 思路:前面状态照旧,s5用来计时clk,存储delay时间,然后counter2递减,注意这里什么时候到999,什么时候到1000就可以了!

自己做出来显示success的成就感!

module top_module (
    input clk,
    input reset,      // Synchronous reset
    input data,
    output [3:0] count,
    output counting,
    output done,
    input ack );
    parameter idle=0,s1=1,s2=2,s3=3,s4=4;
    parameter s5=5,waiting=6,doing=7;
    reg  [3:0] state,next_state;
    reg [1:0] counter1;  //计时四个CLK
    reg [11:0] counter2;//计时1000

    always @(posedge clk ) begin
        if(reset) state<=idle;
        else state<=next_state;
    end

    always @(*) begin
        case (state)
            idle:next_state=data?s1:idle;
            s1:next_state=data?s2:idle;
            s2:next_state=data?s2:s3;
            s3:next_state=data?s4:idle;
            s4:next_state=s5;
            s5:next_state= (counter1==2'b11)?waiting:s5;
            waiting:next_state=(count==4'b0&&counter2==12'b0)?doing:waiting;
            doing:next_state= ack?idle:doing;
        endcase
    end
    //counter1
    always @(posedge clk ) begin
        if(reset) counter1<=0;
        else counter1<= (next_state==s5)?counter1+1:0;
    end
    //counter2
    always @(posedge clk ) begin
        if(reset) counter2<=12'd1000;
        else if(counter2==12'b0) counter2<=999;
        else counter2<= (next_state==waiting)?counter2-1:12'd1000;
    end

    //输出
    always @(posedge clk ) begin
        if(reset) begin
            counting<=0;done<=0;count<=0;
        end
        else begin
            count[3:0]<=(next_state==s5||state==s5)?{count[2:0],data}:(counter2==0)?count-1:count;
            counting<=next_state==waiting;
            done<= next_state==doing;
        end
    end

endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值