2016-03-07 94 views
1

我想学习verilog之前做过C++的。作为一种学习练习,我试着在看到10次按键后闪烁LED。我还有一个额外的重置按钮,可以再次启动10次计数。我试过的东西我不能编译。任何人都可以将我指向正确的方向吗?Verilog if语句赋值错误

我的代码是:

module led_counter (button, nreset, led); 

input button, nreset; 
output led; 
reg counter[4:0];   // to hold the current count 

always @ (negedge nreset) begin 
    counter <= 0;   // Just reset counter 
end 

always @ (negedge button) begin 

    if (counter == 10) begin // see if the button has been pressed 10 times 
     led_state <= 1;  // turn the led on 
    end 

    else begin 
    led_state <= 0;   // the led is off 
    counter <= counter + 1; 
    end 

end 

assign led = led_state; 

endmodule 

回答

3

led_state未声明,它应该是一个REG

为了让事情更简洁,我还将这两个过程重组为一个。这将使它看起来像是一个异步复位的同步过程,即由时钟触发并在复位的下降沿复位。

always @ (posedge button or negedge nreset) begin 
    if(~nreset)  //reset counter when nreset is low 
     counter <= 0; 
    else begin  //do something on posedge of button 
     //Do something// 
end //end process 

它也更有可能被合成。

+0

感谢您的评论@ krouitch - 帮助。 我不认为这就是我正在寻找的,因为nreset输入实际上是一个锁定按钮,而不是一个momentry按钮。所以我真的只想检测边缘。 我相信,当nreset按钮被锁定为低电平时,即使按钮的边沿触发它,该代码也会始终重置计数器。 是否可以修改以满足这些新要求? – Martin