这是夏宇闻老师第十五章的实践。具体内容参看书本。下面是我的实践内容。
//源代码:
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文件),而不是目标文件。
应该把测试文件设置为顶层文件。
最终的仿真结果:
都是一些小白问题,各位大佬不要见笑啊。