题解 | #含有无关项的序列检测#

含有无关项的序列检测

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

`timescale 1ns/1ns
module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);
	reg [9:0]cur_state;
	reg [9:0]nex_state;

	parameter IDLE=9'b00_0000_0001;
	parameter s0=9'b00_0000_0010;
	parameter s1=9'b00_0000_0100;
	parameter s2=9'b00_0000_1000;
	parameter s3=9'b00_0001_0000;
	parameter s4=9'b00_0010_0000;
	parameter s5=9'b00_0100_0000;
	parameter s6=9'b00_1000_0000;
	parameter s7=9'b01_0000_0000;
	parameter s8=9'b10_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=s3;
		s3:nex_state=s4;
		s4:nex_state=s5;
		s5:nex_state=(a==1'b1)?s6:s0;
		s6:nex_state=(a==1'b1)?s7:s0;
		s7:nex_state=(a==1'b0)?s8:s0;
		s8: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==s8)?1:0;
  
endmodule

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:52
点赞 评论 收藏
分享
11-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务