序列检测器(10010)

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

//源代码:
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.net/qq_33231534/article/details/104782068
3.在进行联合仿真时,应该编译底层文件(test文件),而不是目标文件。
应该把测试文件设置为顶层文件。
在这里插入图片描述
最终的仿真结果:
在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值