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

输入序列不连续的序列检测

https://www.nowcoder.com/practice/f96d0e94ec604592b502b0f1800ed8aa

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input data,
	input data_valid,
	output reg match
	);
//根据时序图可以看出,match 是在检测到0110的下一个周期拉高,所以采用moore型状态机(只与当前状态有关)
//思路:用一个寄存器,寄存在data_valid有效时的Data信号
//三段式状态机
reg [2:0] crt_state,nxt_state;
//第一段:同步时序逻辑描述状态转移
always@(posedge clk or negedge rst_n)
  if(!rst_n)
     crt_state <= 3'd0;
   else
     crt_state <= nxt_state;
//第二段:组合逻辑描述状态转移规律
//这里没有说重叠还是不重叠检测
//重叠检测
always@(*)
    if(data_valid)begin
		case(crt_state)
		  3'd0: nxt_state = (data_valid && ~data) ? 3'd1 : 3'd0;
          3'd1: nxt_state = (data_valid && data) ? 3'd2 : 3'd1;
          3'd2: begin
			    if(data_valid && data)
				     nxt_state = 3'd3;
				else if(data_valid && ~data)
				     nxt_state = 3'd1;
				else
				     nxt_state = 3'd2;
		  end
          3'd3: begin
			    if(data_valid && ~data)
				     nxt_state = 3'd4;
				else if(data_valid && data)
				     nxt_state = 3'd0;
				else
				     nxt_state = 3'd3;
		  end
          3'd4: begin
			    if(data_valid && data)
				     nxt_state = 3'd0;//不重叠检测
				    //  nxt_state = 3'd2;//重叠检测
				else 
				     nxt_state = 3'd1;
		  end
          default:nxt_state = 3'd0;
		endcase
	end
	else
	  nxt_state <=3'd0;
  
//第三段:时序逻辑描述状态输出
always@(posedge clk or negedge rst_n)
   if(!rst_n)
    match <= 0;
   else if(nxt_state == 3'd4)
     match <= 1;
   else
     match <= 0;
endmodule

//第二段:组合逻辑描述状态转移规律
// always@(*)
//     if(data_valid)begin//这个不对,因为他只是抛弃data_valid无效那一个时刻的输入,其他时刻的输入还要
// 		case(crt_state)
// 		  3'd0: nxt_state = (data == 0) ? 3'd1 : 3'd0;
//           3'd1: nxt_state = (data == 1) ? 3'd2 : 3'd0;
//           3'd2: nxt_state = (data == 1) ? 3'd3 : 3'd0;
//           3'd3: nxt_state = (data == 0) ? 3'd1 : 3'd0;
//           3'd4: nxt_state = (data == 0) ? 3'd1 : 3'd0;//这里没有说重叠还是不重叠检测,就先按不重叠吧
//           //3'd4: nxt_state = (data == 0) ? 3'd1 : 3'd2;//重叠检测
//           default:nxt_state = 3'd0;
// 		endcase
// 	end
// 	else
// 	  nxt_state <=3'd0;

看到评论区有个人这样写,感觉很不错,记一下
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
   curr_state <= S_IDLE;
else if(data_valid)
   curr_state <= next_state;
else
   curr_state <= curr_state;
end

全部评论

相关推荐

07-18 18:44
已编辑
中山职业技术学院 Java
投递文远知行等公司7个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-15 17:32
点赞 评论 收藏
分享
来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
06-26 17:24
已编辑
宁波大学 golang
迷失西雅图:别给,纯kpi,别问我为什么知道
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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