verilog有限状态机中序列检测器的问题

问题描述

我想制作能够检测三个连续序列的序列检测器。当检测到序列时,数字电路停止并等待复位信号有效,因此它会再次检测序列。我写了代码,但它有一些问题。在 xvlog 文件中,我有以下错误

"Syntax error near ;"(第 23,25,27,29,35,47,48 行)

"default case should appear only once"(对于第 23、25、27、29、35、48、49 行)。

代码如下:

`timescale 1ns / 1ps

`define S0 3'd0;
`define S1 3'd1;
`define S2 3'd2;
`define S3 3'd3;
`define S4 3'd4;

module kolo1(out,in,r,clk);
output out;
reg out;
input in,clk;
reg [2:0] stanje,sledece_stanje;
initial
begin
stanje=`S0;
sledece_stanje=`S0;
out=0;
end
always @(stanje or r or in)
begin
case(stanje)
`S0: if(r) sledece_stanje=`S1;
     else sledece_stanje=`S0;
`S1: if(in) sledece_stanje=`S2;
     else sledece_stanje=`S0;
`S2: if(in) sledece_stanje=`S3;
     else sledece_stanje=`S0;
`S3: if(in) sledece_stanje=`S4;
     else sledece_stanje=`S0;
`S4: begin 
repeat(1) @(posedge clk);
sledece_stanje=`S0;
end
default: sledece_stanje=`S0;
endcase 
end

always @(posedge clk)
begin
stanje=sledece_stanje;
end

always @(stanje)
begin
case(stanje)
`S0,`S1,`S2,`S3: out=0;
`S4:out=1;
default: out=0;
endcase
end
endmodule

module stimulus;
reg clk,res;
wire out;

kolo1 k1(out,res,clk);

initial
clk=1'b0;

always 
#2 clk=~clk;

initial 
begin
$monitor($time,"out=%b in=%b res=%b clk=%b",out,clk);
in=0;res=0;
#2 res=1;
#20 res=0;
#5 res=1;
#30 $finish;
end

endmodule

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)