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

输入序列连续的序列检测

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

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);

	reg [8:0]cur_state;
	reg [8:0]nex_state;

	parameter IDLE=9'b0_0000_0001;
	parameter s0=9'b0_0000_0010;
	parameter s1=9'b0_0000_0100;
	parameter s2=9'b0_0000_1000;
	parameter s3=9'b0_0001_0000;
	parameter s4=9'b0_0010_0000;
	parameter s5=9'b0_0100_0000;
	parameter s6=9'b0_1000_0000;
	parameter s7=9'b1_0000_0000;

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

	always@(*)begin
		case(cur_state)
		IDLE:nex_state=(a==1'b0)?s0:IDLE;
		s0:nex_state=(a==1'b1)?s1:s0;
		s1:nex_state=(a==1'b1)?s2:s0;
		s2:nex_state=(a==1'b1)?s3:s0;
		s3:nex_state=(a==1'b0)?s4:s0;
		s4:nex_state=(a==1'b0)?s5:s0;
		s5:nex_state=(a==1'b0)?s6:s0;
		s6:nex_state=(a==1'b1)?s7:s0;
		s7:nex_state=(a==1'b1)?IDLE:s0;
		endcase
	end

	//由图可见,match的输出比a要慢一拍,所以应该使用时序逻辑电路判断
	//因为在always块中要使用reg类型,且题目已经给出的定义output match是reg类型
	//所以在不改动原先代码的前提下,应在always中使用match,然后用assign在always块外对另一个match_wire进行工作
	//等于always单纯是用来打一拍的延后赋值
	wire match_wire;
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			match<=0;
		end
		else begin
			match<=match_wire;
		end
	end

	assign match_wire=(cur_state==s7)?1:0;
  
endmodule

要点在代码注释中

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
点赞 评论 收藏
分享
06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
流浪的神仙:无恶意,算法一般好像都得9硕才能干算法太卷啦
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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