题解 | #输入序列连续的序列检测#

输入序列连续的序列检测

http://www.nowcoder.com/practice/d65c2204fae944d2a6d9a3b32aa37b39

`timescale 1ns/1ns
module sequence_detect(
    input clk,
    input rst_n,
    input a,
    output reg match
    );
//0111_0001
//------Solution 1 finite state machine
    parameter   IDLE = 3'd0 ;  //
    parameter   S0   = 3'd1 ;  //0
    parameter   S1   = 3'd2 ;  //01
    parameter   S2   = 3'd3 ;  //011
    parameter   S3   = 3'd4 ;  //0111
    parameter   S4   = 3'd5 ;  //0111_0
    parameter   S5   = 3'd6 ;  //0111_00
    parameter   S6   = 3'd7 ;  //0111_000

    reg [2:0]   state , next_state ;
    reg         match_pre ;

    always @( posedge clk or negedge rst_n) begin
      if( !rst_n ) begin
          state <= IDLE ;
      end
      else begin
          state <= next_state ;
      end
    end      

    always @(*) begin
        case (state)
            IDLE : next_state = ~a ? S0 : IDLE ; 
            S0   : next_state =  a ? S1 : S0   ;     
            S1   : next_state =  a ? S2 : S0   ;
            S2   : next_state =  a ? S3 : S0   ;
            S3   : next_state = ~a ? S4 : IDLE ;
            S4   : next_state = ~a ? S5 : S1   ;
            S5   : next_state = ~a ? S6 : S1   ;
            S6   : next_state =  a ? IDLE : S0 ;
           
        default : next_state = IDLE ;
        endcase
    end

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            match_pre <= 1'b0 ;
        else if (state == S6 && a)  //0111_0001
            match_pre <= 1'b1 ;
        else 
            match_pre <= 1'b0 ;
    end
// 本来意图是使用3个触发器完成序列检测,所以就没有用S7=0111_0001这个状态,但好像从时序来看这么做会让match提前一拍拉起来,所以再打一拍就好了
//一直有疑惑像序列检测能不能不要用IDLE这个状态,这样就可以节省一个触发器,希望能有大佬看到后解惑
    
    always @( posedge clk or negedge rst_n) begin
      if( !rst_n ) begin
          match <= 1'b0 ;
      end
      else begin
          match <= match_pre ;
      end
    end      
//------Solution 2 shift resister-----------------
//    reg [7:0] shift;
//
//    always @(posedge clk or negedge rst_n) begin
//        if (!rst_n)
//            shift <= 8'd0;
//        else 
//            shift <= {shift , a};
//    end
//    
//    
//  always @( posedge clk or negedge rst_n) begin
//    if( !rst_n ) begin
//       match <= 1'b0 ;
//    end
//    else  if (shift == 8'b0111_0001)begin
//       match <= 1'b1 ;
//    end
//    else
//    match <= 1'b0 ;
//  end      

endmodule
全部评论

相关推荐

1、自我介绍2、Agent项目是实习项目还是个人项目?有没有上线?3、拷打实习(10min)4、大模型微调,你的训练数据集是如何构建的?数据量有多大?5、在构建数据集的过程中,遇到了哪些挑战?花了多长时间?6、你之前的实习经历偏后端工程,你未来的职业规划更倾向于纯后端开发,还是希望从事与AI/大模型结合的工作?7、详细讲一下Golang中Channel的概念和作用,它是否是并发安全的?8、Channel和传统的锁(Mutex)在实现并发控制时有什么区别?各自的适用场景是什么?9、讲一下GMP模型10、当P的本地队列为空或者不为空时,它会怎么去调度G(协程)?11、Redis支持哪些数据结构12、为什么Redis的速度这么快13、如何实现一个类似淘宝搜索框的实时商品名称模糊搜索功能?14、实时输入联想与输入完成后点击搜索在技术实现上有什么本质区别?15、实时搜索通常使用什么网络协议(如WebSocket)?你了解或有使用过吗?讲一下16、请详细说明微信扫码登录的完整流程和背后发生的原理17、在微服务架构中,服务发现和负载均衡是如何实现的?18、服务注册中心(如Nacos,&nbsp;Consul)是如何工作的?服务实例如何注册和保活(如通过心跳机制)?19、讲一下Agent中的“长短期记忆”20、什么样的信息应该放在长期记忆,什么样的信息放在短期记忆?21、当对话轮数很多,上下文窗口不足时,有哪些处理策略?(如截断、压缩)22、如果要进行记忆压缩,通常有哪些方法?23、了解过Agent的设计范式吗?有哪些?24、你设计的Agent是怎么实现ReAct模式的?详细讲讲25、手撕:实现一个并发任务处理器:给定一个包含100个任务ID的列表,要求控制最大并发数为3,模拟并发调用某个外部接口(如打印ID)26、反问
三本咋了:很好的面筋
查看24道真题和解析
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务