2017-05-07 145 views
0

我的Verilog代码有问题。我有2个时钟 - 一个100kHz,第二个10kHz。只有当10kHz为高电平时,我才想用100kHz频率切换LED。但是我的产量仍然很低。这是我的代码:Verilog等待函数说明

module LED_toggle(
    input clock_100kHz, 
    input clock_10kHz, 

    output reg LED_PIN, 
); 
    initial begin   
     LED_PIN <= 1'b0; 
    end 

    always begin 
     if(clock_10kHz) begin 
      LED_PIN = 1'b1; 
      @(posedge clock_100kHz);    
      LED_PIN = 1'b0; 
      @(posedge clock_100kHz); 
     end 
     else begin 
      LED_PIN = 1'b0; 
     end 
    end 

endmodule 

我知道我可以在其他的方式(在100kHz的边缘像触发器和检查状态OT 10kHz时)做到这一点,但我试着去理解为什么@(posedge clock_100kHz);不要像我所期望的那样行事。我也尝试等待(clock_100kHz)insted,但这也不起作用。

我敢肯定,我的时钟都配置正确,因为这个代码工作像我期望:

module LED_toggle (
    input clock_100kHz, 
    input clock_10kHz, 

    output reg LED_PIN, 
); 
    initial begin   
     LED_PIN <= 1'b0; 
    end 

    always begin 
     if(clock_10kHz) begin 
      LED_PIN = ~LED_PIN; 
     end 
     else begin 
      LED_PIN = 1'b0; 
     end 
    end 

endmodule 

,但我试着去了解什么是错的我等待条件。

回答

2

这可能是最好的,如果你建立这个更像HW而不是SW。你的总是起始块更像是一个行为模型而不是硬件表示。

看起来,基于第一个片段,您实际上希望LED以50kHz的频率运行(因为您在100kHz的每个边界上切换LED输出)?这将是我会做什么,为100kHz的:

assign LED_PIN = clock_10kHz & clock_100Hz; 

对于50kHz的

always @(posedge clock_100kHz) begin 
    if(clock_10kHz) LED_PIN <= ~LED_PIN 
    else   LED_PIN <= 1'b0; 
end 

什么第一个片段不只是用在10kHz时钟作为栅极和基本100kHz的时钟直接驱动LED 。

第二个片段仍然使用10kHz时钟作为门,但是有一个寄存器内置了驱动LED_PIN输出的100kHz时钟。这将使LED 50kHz有效切换,而不是您所描述/要求的100kHz,但这与您的第一个片段中的行为相符。我假设这些时钟是同步的,但真正的门应该同步到100kHZ时钟域,但这是一个不同的话题。

总是开始真的是一个行为构造。它基本上是说“总是这样做,并且像我说的那样尽快地完成”。在你的例子中,我不确定模拟器在clock_10kHz低时不会跑掉。许多模拟器不会看到时间语句(例如#delay或@()),并尝试尽可能多地计算它,或者如果它足够聪明以至于看到无限循环,那么只是错误。请记住,verilog是一种基于事件的语言。在你的代码中,有些情况下你没有任何“事件”,只是应该发生的行为。这可以,并会导致你一些悲伤。如果你已经完成了其他编程语言并开始使用verilog,这通常是最难掌握的部分,但是当你这样做时,它就更有意义了。

希望这有助于!