verilog实现“101”序列检测器

题目:序列检测器

有“101”序列输入时输出为1,其他输入情况下,输出为0。画出状态转移图,并用verilog描述。
画出状态图:
在这里插入图片描述

三段式状态机:

module sequence_detection (
	input clk,
	input rst_n,
	input data_in,
	
	output reg data_out,
	/***/
	output reg [2:0] now_state,
	output reg [2:0] next_state
	
	
);
//参数定义
parameter s0='d0,s1='d1,s2='d2,s3='d3;
/**
reg [2:0] now_state;
reg [2:0] next_state;
*/
//第一段,状态复位,次态赋值给当前状态
always @(posedge clk or negedge rst_n)begin
	if(rst_n==1'b0)
		now_state <= 1'b0;
	else
		now_state <= next_state;
end 

//状态的跳转
always @(posedge clk or negedge rst_n )begin
/**	case(now_state)
		s0:
			if()
	endcase 
	if()
***/
	case(next_state)
		s0:next_state <= data_in?s1:s0;
		s1:next_state <= data_in?s1:s2;
		s2:next_state <= data_in?s3:s0;
		s3:next_state <= data_in?s1:s2;
		default:next_state=s0;
	endcase

end 


//输出

/***********/
always @(posedge clk or negedge rst_n )begin
	if(rst_n == 1'b0)
		data_out <= 1'b0;
	else if(next_state == s3)
		data_out <= 'b1;
	else
		data_out <= 1'b0;
end 



endmodule 
module sequence_detection_tb ();
reg clk;
reg rst_n;
reg data_in;

wire data_out;
/****/
wire [2:0] next_state;
wire [2:0] now_state;

//4字符16位
reg [31:0]              state_name  ;
parameter s0=0,s1=1,s2=2,s3=3;





//变量初始化,赋值
initial begin
	clk = 'b0;
	rst_n ='b0;
	data_in = 'b0;
	
	#10
	clk = 'b1;
	rst_n ='b1;
	#10
	data_in='b1;
	#10
	data_in = 'b0;
	#10
	data_in = 'b1;
	#10
	data_in = 'b0;
	#10
	data_in = 'b1;
	#10
	data_in = 'b0;
	#10
	data_in = 'b0;
	#10
	data_in ='b1;
	#10
	data_in = 'b1;
	#10
	data_in='b1;
	#10
	data_in = 'b0;
	#10
	data_in = 'b1;
	#10
	data_in = 'b0;
	#10
	data_in = 'b1;
	#10
	data_in = 'b0;
	#10
	data_in = 'b0;
	#10
	data_in ='b1;
	#10
	data_in = 'b1;
	
	

end 

//时钟
always #5 clk=~clk;

//例化
sequence_detection u0(
	.clk		(clk		),
	.rst_n		(rst_n		),
	.data_in	(data_in	),
	
	.data_out	(data_out	),
	/*****/
	.now_state	(now_state	),
	.next_state	(next_state	)
	
);
//在波形中显示对应的状态名称
always@(*)begin
    case(u0.now_state)//u0为例化模块的名称,now_state为u0的内部信号。在modelsim中改为ASCII,就可以显示字符串了
        s0:       state_name = "s0";
        s1:       state_name = "s1";
        s2:       state_name = "s2";
        s3:       state_name = "s3";
        default:  state_name = "s0";
    endcase
end

endmodule 

实验结果:
image-20230611195622370

注意:

今天在ModelSim中遇到一个bug:

# No Design Loaded!

之前也遇到过这样的问题,我大概知道原因:

1、仿真文件中的模块例化中端口和模块的端口不对应
2、例化中多一个逗号,或者少一个逗号
3、例化时模块名称后没有给它重新命名

我反复检查代码发现也没有发现错误呀,给我郁闷了好久。后面把ModelSim关闭重启就可以加载了,这个bug就被解决了 ,居然那么简单。

	--晓凡	2023年6月11日于桂林书
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值