我正在尝试为绿色,黄色,红色写交通灯FSM代码,其延迟时间为20个单位。它来自绿 - 黄 - 红 - 黄 - 绿。这是我的代码,我在使用'repeat'进行延迟时遇到错误。
错误:
错误:C:/Users/Desktop/Design/tlights.v(33):near“;”:语法错误,意外';'
错误:C:/Users/Desktop/Design/tlights.v(37):near“;”:语法错误,意外';'
错误:C:/Users/Desktop/Design/tlights.v(44):near“;”:语法错误,意外';'
`define delay 20;
module tlights(clk, rst, y);
input clk, rst;
output [1:0]y;
reg [1:0]y;
reg [1:0] cs,ns;
integer p;
parameter red = 2'd2;
parameter orange = 2'd1;
parameter green = 2'd0;
parameter s0 = 2'd0;
parameter s1 = 2'd1;
parameter s2 = 2'd2;
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
cs<=s0;
end
else
cs<=ns;
end
always@(cs)
begin
case(cs)
s0: begin
repeat (`delay) @(posedge clk); // <-- Error here
ns=s1;
end
s1: begin
repeat (`delay) @(posedge clk); // <-- Error here
if (p==0)
ns =s2;
else
ns=s0;
end
s2: begin
repeat (`delay) @(posedge clk); // <-- Error here
ns<=s1;
end
default: ns<=s0;
endcase
end
always@ (cs)
begin
case(cs)
s0:begin
y<=2'b00;
p<=0;
end
s1:y<=2'b01;
s2:begin
y<=2'b10;
p<=1;
end
endcase
end
endmodule
答案 0 :(得分:1)
问题在于您的`define
声明。 `define
与C / C ++中的#define
类似。语句执行文字替换,终结符是行尾,而不是分号。 repeat (`delay)
表示repeat ( 20; )
。删除;
,它将模拟。
即使纠正它也不会合成。在组合逻辑中不允许阻止语句(即@
,#
和wait
)。要合成,你需要为计数器添加一些触发器。您的下一个状态和下一个计数器组合逻辑应如下所示:
always @* begin
// default value
ns = cs;
next_counter = counter + 1;
// update value
case(cs)
s0: begin
if (counter >= `delay) begin
ns = s1;
next_counter = 0;
end
end
/* ... */
endcase
end
另外,请记住分配具有非阻塞(<=
)的触发器。阻止(=
)分配组合逻辑。