首页 > 解决方案 > ModelSim 中的错误,“=”附近:语法错误,意外的“=”。在“Y”之后的范围内发现语法错误。是否缺少'::'?

问题描述

我正在制作主 JK 触发器,错误如下:

** Error: (vlog-13069) C:/Windows/System32/ssy_1775_final.v(13): near "=": syntax error, unexpected '='.
** Error: C:/Windows/System32/ssy_1775_final.v(13): (vlog-13205) Syntax error found in the scope following 'Y'. Is there a missing '::'?

我制作的代码如下:

    module JK_FlipFlop(J, K, clk, Y_BAR, Y, Q);
    input J, K, clk;
    output Y, Q;
    reg Y_BAR;
    wire Y, Q;

always@(posedge clk) 
assign Y_BAR = ~Y;
begin
if(J==0 && K==0) 
begin Y=Y; Y_BAR=Y_BAR; end
else if(J==0 && K==1) 
begin Y<=1'b0; Y_BAR<=1'b1; end
else if(J==1 && K==0) 
begin Y<=1'b1; Y_BAR<=1'b0; end
else if(J==1 && K==1) 
begin Y=Y_BAR; Y_BAR=Y; end
end

always@(negedge clk)
begin
if(Y==0 && Y_BAR==0)
 begin end
else if(Y==0 && Y_BAR==1)
  begin Q<=1'b0; end
else if(Y==1 && Y_BAR==0)
  begin Q<=1'b1; end
else if(Y==1 && Y_BAR==1)
  begin Q<=~Q; end
end

endmodule

我不知道为什么会出现错误。

我祈祷有人会放过我。

标签: verilog

解决方案


您的端口和信号声明中有多个错误。由于您对所有输出进行程序分配,因此它们都必须声明为reg,而不是wire。要减少信号名称重复,从而避免此类常见错误,请使用 ANSI 样式端口,如下所示。

另一个问题是您不应该在块assign内使用关键字。always以下代码编译没有错误:

module JK_FlipFlop (
    input J, K, clk,
    output reg Y, Q, Y_BAR
);

always@(posedge clk) 
begin
    Y_BAR = ~Y;
    if(J==0 && K==0) 
    begin Y=Y; Y_BAR=Y_BAR; end
    else if(J==0 && K==1) 
    begin Y<=1'b0; Y_BAR<=1'b1; end
    else if(J==1 && K==0) 
    begin Y<=1'b1; Y_BAR<=1'b0; end
    else if(J==1 && K==1) 
    begin Y=Y_BAR; Y_BAR=Y; end
end

always@(negedge clk)
begin
    if(Y==0 && Y_BAR==0)
     begin end
    else if(Y==0 && Y_BAR==1)
      begin Q<=1'b0; end
    else if(Y==1 && Y_BAR==0)
      begin Q<=1'b1; end
    else if(Y==1 && Y_BAR==1)
      begin Q<=~Q; end
end

endmodule

如果您改进缩进,您的代码会更容易理解。


推荐阅读