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
它给出了absurb答案/模拟输出。 在发送输出之前,我应该在该行等待posedge clk做什么?
答案 0 :(得分:3)
你必须更加批判性地思考你想要建模的东西。看起来你只是试图用“打开”来控制读/写操作来建模内存。
你有异步写入数据&同步读取数据。对于内存访问,最好只具有完整的同步行为。
always @(posedge clk) begin
if( open )
outp = Memory[addressOftheMemory];
else
Memory[addressOftheMemory] = data;
end
答案 1 :(得分: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)
或always @(posedge clk)
没有什么神奇之处,它们只是简单地引入一个语句并指定事件控制。当延迟控制(#
)附加到语句时,语句的执行将推迟到将来的固定时间。当事件控制(@
)附加到语句时,语句的执行将延迟到满足事件条件。