未知的Verilog错误要求在其他之后结束

时间:2015-04-27 03:32:22

标签: verilog

module blank(
  input[7:0]r1,
  input[7:0]g1,
  input[7:0]b1,
  input en1,
  output reg[7:0] r2,
  output reg[7:0] g2,
  output reg[7:0] b2,
  output en2
);

always @(*)
begin 
  if ( 48 < r2 < 255  &&  0 < g2 < 223  && 0  < b2 < 196 ) 
     r2 = 255;
     g2 = 255;
     b2 = 255;
  else   
     r2 = 0;
     g2 = 0;
     b2 = 0;
end
endmodule

这用于阈值,我希望它能够检测人体皮肤颜色并将其变为白色而其他颜色变为黑色。

2 个答案:

答案 0 :(得分:2)

有几个问题:

  1. if-else中的条件应该取决于输入,而不是输出。
  2. 与C,Java等一样,{}之后需要if-else,在Verilog中,您需要begin-end才能执行多项操作。
  3. 您的代码应如下所示:

    always @(*)
    begin 
      if ( 48 < r1 &&  ...  && b1 < 196 ) begin
        r2 = 255;
        g2 = 255;
        b2 = 255;
      end else begin   
        r2 = 0;
        g2 = 0;
        b2 = 0;
      end
    end
    

答案 1 :(得分:2)

我同意Qui的评论,但还有另一个问题。看起来你是一个Python程序员,并认为48 < r1 < 255会检查r1是否在48到255之间。这在Verilog中不起作用。相反,它将检查r1是否> 48然后从中产生0或1.然后它将检查0或1对255,这将始终为真。我改写了等式:

always @(*)
begin 
  if ( 48 < r1 && r1 < 255  &&  0 < g1 && g1 < 223  && 0 < b1 && b1 < 196 ) begin
    r2 = 255;
    g2 = 255;
    b2 = 255;
  end else begin   
    r2 = 0;
    g2 = 0;
    b2 = 0;
  end
end