admin管理员组

文章数量:1530518

这是夏宇闻老师第十五章的实践。具体内容参看书本。下面是我的实践内容。

//源代码:
module seqdet(clk,x,z,rst);
input clk,x,rst;
output z;
reg z;
reg [7:0] state;
parameter 
		IDLE=8'b0000_0001,
		A=8'b0000_0010,
		B=8'b0000_0100,
		C=8'b0000_1000,
		D=8'b0001_0000,
		E=8'b0010_0000,
		F=8'b0100_0000,
		G=8'b1000_0000;
always@(posedge clk or negedge rst)
begin
if(!rst) 
	state<=IDLE;
else
casex(state)
	IDLE:if(x==0) begin
		state<=IDLE;
		z<=0;
		end
		else begin
		state<=A;
		z<=0;
		end
	A:if(x==0) begin
		state<=B;
		z<=0;
		end
		else begin
 		state<=A;
		z<=0;
		end
	B:if(x==0) begin
		state<=C;
		z<=0;
		end
		else begin
		state<=F;
		z<=0;
		end
	C:if(x==0) begin
		state<=G;
		z<=0;
		end
		else begin
		state<=D;
		z<=0;
		end
	D:if(x==0) begin
		state<=E;
		z<=1;
		end
		else begin
		state<=A;
		z<=0;
		end
	E:if(x==0) begin
		state<=C;
		z<=0;
		end
		else begin
		state<=A;
		z<=0;
		end
	F:if(x==0) begin
		state<=B;
		z<=0;
		end
		else begin
			z<=0;
		state<=A;
		end
	G:if(x==0) begin
		state<=G;
		z<=0;
		end
		else begin
			z<=0;
		state<=F;
		end
	default: state<=IDLE;
endcase
end
endmodule 
//测试代码
`timescale 1ns/1ns
`define clockperiod 20
module t;
reg clk,rst;
reg [23:0] data;
wire z,x;
assign x=data[23];
initial
	begin
	clk=0;
	rst=1;
	#2 rst=0;
	#30 rst=1;
	data=20'b1100_1001_0000_1001_0100;
	#(`clockperiod*1000) $stop;
	end
always #(`clockperiod)  clk=~clk;
always@(posedge clk)
#2 data={data[22:0],data[23]};//序列移位
seqdet seqdet0(
.clk(clk),
.x(x),
.z(z),
.rst(rst)
);
endmodule 

在我编写的过程中,遇到了一些问题。
1.在编写源代码是使用了两个always块,并且在两个always块中对同一变量进行赋值,报错this signal is connected to multiple drivers。

解决办法:切记不要在两个always块中对同一变量赋值,这样容易报错。
复习:夏宇闻第十四章中的原则6)在不同always中,不要为同一个变量赋值。
2.在编写测试文件时,把测试文件名和目标文件名重合。报错信息:Instantiating ‘u_state_machine_pkt_top’ has exceeded the recursion depth limit
解决办法:改名。
网上教程:https://blog.csdn/qq_33231534/article/details/104782068
3.在进行联合仿真时,应该编译底层文件(test文件),而不是目标文件。
应该把测试文件设置为顶层文件。

最终的仿真结果:

都是一些小白问题,各位大佬不要见笑啊。

本文标签: 检测器序列