HDLBits在线编程题之Exams/review2015 fancytimer

Exams/review2015 fancytimer

题目

地址:HDLBits-Exams/review2015 fancytimer
介绍:花了好长时间写的,记录一下。将计数值量化为以1000为单位,开始时则有delay的1000需要计数。在couting过程中统计已经计了1000次的次数num_1k,将delay减去num_1k即count。

代码

module top_module (
    input clk,
    input reset,      // Synchronous reset
    input data,
    output [3:0] count,
    output counting,
    output done,
    input ack );
    
    parameter [2:0] IDLE=3'b000,DEC_1=3'b001,DEC_11=3'b010,DEC_110=3'b011,SHIFT=3'b100,COUNT=3'b101,WAIT=3'b110;
    reg [2:0] current_state,next_state;
    always @(posedge clk) begin
        if (reset) 
            current_state <= IDLE;
        else 
            current_state <= next_state;
    end
    
    always @(*) begin
        case (current_state)
            IDLE: next_state = data?DEC_1:IDLE;
            DEC_1: next_state = data?DEC_11:IDLE;
            DEC_11: next_state = data?DEC_11:DEC_110;
            DEC_110: next_state = data?SHIFT:IDLE;
            SHIFT: next_state = (shift_cnt==2'b11)?COUNT:SHIFT;
            COUNT: next_state = (counter==(delay+1)*1000-1)?WAIT:COUNT;
            WAIT: next_state = (done&&ack)?IDLE:WAIT;
            default: next_state = IDLE;
        endcase
    end
    
    reg [1:0] shift_cnt;
    reg [3:0] delay;
    always @(posedge clk) begin
        if (reset)
            shift_cnt <= 2'b0;
        else if (current_state==SHIFT&&shift_cnt!=2'b11)
            shift_cnt <= shift_cnt+1'b1;
        else 
            shift_cnt <= 2'b0;
    end
    always @(posedge clk) begin
        if (reset)
            delay <= 4'b0;
        else if (current_state==SHIFT)
            delay <= {delay[2:0],data};
        else 
            delay <= delay;
    end
    
    reg [14:0] counter;
    always @(posedge clk) begin
        if (reset)
            counter <= 15'd0;
        else if (current_state==COUNT&&counter!=(delay+1)*1000-1)
            counter <= counter+1'b1;
        else 
            counter <= 15'd0;
    end
    
    reg [10:0] cnt_1k;
    reg [3:0] num_1k;
    always @(posedge clk) begin
        if (reset) 
            cnt_1k <= 11'd0;
        else if (current_state==COUNT&&cnt_1k!=11'd999)
            cnt_1k <= cnt_1k+1'b1;
        else 
            cnt_1k <= 11'd0;
    end
    always @(posedge clk) begin
        if (reset) 
            num_1k <= 4'b0;
        else if (cnt_1k==11'd999)
            num_1k <= num_1k+1'b1;
        else if (current_state==COUNT)
            num_1k <= num_1k;
        else
            num_1k <= 4'b0;
    end
    
    assign counting = (current_state==COUNT)?1'b1:1'b0;
    assign done = (current_state==WAIT)?1'b1:1'b0;
    assign count = (current_state==COUNT)?(delay-num_1k):4'b0;
    
endmodule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值