verilog编译器错误:near&#34 ;;&#34 ;:语法错误,意外&#39 ;;'

时间:2014-04-23 05:43:29

标签: verilog

我正在尝试为绿色,黄色,红色写交通灯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

1 个答案:

答案 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

另外,请记住分配具有非阻塞(<=)的触发器。阻止(=)分配组合逻辑。