1
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 ?

4

2 回答 2

3

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

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

always @(posedge clk) begin
if( open )
    outp = Memory[addressOftheMemory];
else
    Memory[addressOftheMemory] = data;
end
于 2011-05-02T17:57:25.627 回答
1

您可以将执行延迟到时钟沿,如下所示:

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

于 2011-05-02T06:25:20.827 回答