【问题标题】:Waiting posedge clk before doing a job? -- How在工作之前等待posedge clk? - 如何
【发布时间】:2011-05-02 05:53:46
【问题描述】:
module DoorControl( clk, data, open,addressOftheMemory,  outp );

localparam Size_ofTheWord = 32;
input open;

input [16:0] addressOftheMemory;
input [Size_ofTheWord-1:0] data;

input clk ;
output reg outp;
reg [WordSize-1: 0] Memory [65535: 0];


always @ ( open )  // open is 1 or 0 
  if ( open  )          
     // i
     outp = Memory[addressOftheMemory];
  else if ( !open )    
     Memory[addressOftheMemory] = data;


endmodule

标有 (i) 的行,我想在将 outp 发送到输出端口之前等待 posedge clk。但是,当我尝试过类似 ;

if ( posedge clk )

报错

while ( clk != 1 ) begin

end 

它给出了荒谬的答案/模拟输出。 在发送输出之前,我应该在该行放置什么以等待 posedge clk ?

【问题讨论】:

    标签: verilog hdl system-verilog


    【解决方案1】:

    您必须更批判性地思考您要建模的内容。看起来你只是想用“打开”控制读/写操作来模拟一个内存。

    您有数据的异步写入和数据的同步读取。对于内存访问,最好只具有完整的同步行为。

    always @(posedge clk) begin
    if( open )
        outp = Memory[addressOftheMemory];
    else
        Memory[addressOftheMemory] = data;
    end
    

    【讨论】:

    • 完全同意。对于同步逻辑,时钟是主要的。
    【解决方案2】:

    您可以像这样延迟执行直到时钟边缘:

    always @ ( open )  // open is 1 or 0 
      if ( open  )
         @(posedge clk) outp = Memory[addressOftheMemory];
      else if ( !open )    
         Memory[addressOftheMemory] = data;
    

    这可能会也可能不会实现您想要的。它是不可合成的,always 块在执行或挂起时不会被重新调度,因此如果open 在一个时钟周期内多次切换,那么该代码可能不会执行您想要的操作。

    更多背景:您可以在任何语句上指定延迟/事件控制,包括空语句。 (例如,在@(posedge clk); 中,分号是一个空语句。)事实上,always 构造的语法定义是:

    always_construct:always 声明

    意思是always @(open)always @(posedge clk)没有什么神奇之处,它们只是引入了一个语句并指定了事件控制。当延迟控制 (#) 附加到语句时,语句的执行将延迟到将来的固定时间。当事件控制 (@) 附加到语句时,语句的执行将延迟到满足事件条件为止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多