verilog - 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,r,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,in,res;
wire out;
kolo1 k1(out,in,res,clk);
initial
clk=1'b0;
always
#2 clk=~clk;
initial
begin
$monitor($time,"out=%b in=%b res=%b clk=%b",out,in,res,clk);
in=0;res=0;
#2 res=1;
#20 res=0;
#5 res=1;
#30 $finish;
end
endmodule
解决方案
您应该从define
宏中删除分号:
`define S0 3'd0
`define S1 3'd1
`define S2 3'd2
`define S3 3'd3
`define S4 3'd4
编译器进行简单的文本替换。例如,每当它看到 时,都会将`S0
其替换为3'd0;
。因此,
`S0: if(r) sledece_stanje=`S1;
变成:
3'd0;: if(r) sledece_stanje=`S1;
这;:
是一个语法错误。
推荐阅读
- php - 在 DOM XPath 中获取数据属性链接的文本值
- java - 如何去除neo4j中map的属性?
- android - 自适应卡中的运行时数据处理
- tensorflow - 为什么我的 Keras 图像分类预测总是返回一个值...?
- dpdk - DPDK pktgen run.py 错误 - 未找到配置文件“默认”
- jquery - 使用jquery单击复选框内的列时添加行跨度
- google-admin-sdk - 如何通过 google API 获取 Gsuite 帐户类型
- javascript - dagre-d3- 使长文本适合节点内
- laravel - 流明交易
- c++ - 如果地图中包含指针,如何清除内存?