(UVM验证学习19)Verilog手撕代码2-nowcode verilog进阶题(序列检测+时序逻辑)

序列检测

需要注意输出是否是需要用D触发器缓存一拍
VL26

module sequence_detect(
	input clk,
	input rst_n,
	input a,
	output reg match
	);

	parameter IDLE=4'd0;
	parameter S0=4'd1;
	parameter S1=4'd2;
	parameter S2=4'd3;
	parameter S3=4'd4;
	parameter S4=4'd5;
	parameter S5=4'd6;
	parameter S6=4'd7;
	parameter S7=4'd8;
	parameter S8=4'd9;


	reg [3:0] state;
	reg [3:0] next_state;
	wire match_w;

	always@(posedge clk, negedge rst_n)begin
		if(!rst_n) state<=IDLE;
		else state<=next_state;
	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=S3;
			S3:next_state=S4;
			S4:next_state=S5;
			S5:next_state=(a)?S6:S0;
			S6:next_state=(a)?S7:S0;
			S7:next_state=(!a)?S8:IDLE;
			S8:next_state=(a)?IDLE:S0;

		endcase

	end
	assign match_w = state==S8;
	always@(posedge clk, negedge rst_n)begin
		if(!rst_n) match<=0;
		else match<=match_w;
	end	

endmodule

不重叠序列的检测

我的思路是状态机,然后分别设置两组状态,M0-5(match),U0-5(unmatch),然后在任何一个Mx状态,下一个输入不对就跳到U状态,U状态不检测输入,直接一路走到U5输出unmatch

module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);

	parameter IDLE=4'd0;
	parameter M0=4'd1;
	parameter M1=4'd2;
	parameter M2=4'd3;
	parameter M3=4'd4;
	parameter M4=4'd5;
	parameter M5=4'd6;
	parameter U0=4'd7;
	parameter U1=4'd8;
	parameter U2=4'd9;
	parameter U3=4'd10;
	parameter U4=4'd11;
	parameter U5=4'd12;	

	reg [3:0] state;
	reg [3:0] next_state;
	wire match_w;
	wire unmatch_w;

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

	always@(posedge clk, negedge rst_n)begin
		if(!rst_n)begin
			match<=0;
			not_match<=0;
		end
		else begin
			match<=(next_state==M5);
			not_match<=(next_state==U5);
		end
	end
	
	always@(*)begin
		case(state)
			IDLE:next_state=(!data)?M0:U0;
			M0:next_state=(data)?M1:U1;
			M1:next_state=(data)?M2:U2;
			M2:next_state=(data)?M3:U3;
			M3:next_state=(!data)?M4:U4;
			M4:next_state=(!data)?M5:U5;
			M5:next_state=(!data)?M0:U0;
			U0:next_state=U1;
			U1:next_state=U2;
			U2:next_state=U3;
			U3:next_state=U4;
			U4:next_state=U5;
			U5:next_state=(!data)?M0:U0;
			default:next_state=IDLE;
		endcase
	end

endmodule

另外一个思路是拿一个计数器计数,每一步把对应的串行输入存到对应位置上,存完6个数直接比较

module sequence_detect(
	input clk,
	input rst_n,
	input data,
	output reg match,
	output reg not_match
	);

	reg [2:0]count;
	reg [5:0]tmp;

	always@(posedge clk, negedge rst_n)begin
		if(!rst_n)begin
			count<=3'b101;
		end
		else begin
			if(count == 3'b0) count<=3'b101;
			else count <= count - 1'b1;
		end
	end

	always@(posedge clk, negedge rst_n)begin
		if(!rst_n) tmp<=0;
		else tmp[count]<=data;
	end

	always@(posedge clk, negedge rst_n)begin
		if(!rst_n)begin
			match<=0;
			not_match<=0;
		end
		else begin
			if(count==0)begin
				if(tmp==6'b011100)begin
					match<=1;
					not_match<=0;					
				end
				else begin
					match<=0;
					not_match<=1;	
				end
			end
			else begin
				match<=0;
				not_match<=0;
			end
		end
	end

endmodule

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

只是多了一个data_va

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值