Ожидание POSEDGE CLK, прежде чем выполнять работу? - Как
-
27-10-2019 - |
Вопрос
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
Строка, помеченная (я), я хочу подождать, просто Posedge CLK, прежде чем отправлять Outp на выходной порт. Однако, когда я пытался;
if ( posedge clk )
это дает ошибку
while ( clk != 1 ) begin
end
Это дает непредоставление ответа/вывод моделирования.Что (ы) я должен поставить на эту линию, чтобы подождать Posedge CLK перед отправкой вывода?
Решение
Вы можете отложить выполнение, пока не будет так:
always @ ( open ) // open is 1 or 0
if ( open )
@(posedge clk) outp = Memory[addressOftheMemory];
else if ( !open )
Memory[addressOftheMemory] = data;
Это может или не может достичь того, что вы хотите. Это не синтезируется, и always
Блок не будет перенесен во время выполнения или приостановки, поэтому, если open
Переключается несколько раз в период часов, этот код, вероятно, не собирается делать то, что вы хотите.
Более подробную информацию: вы можете указать управление задержкой/событиями на любом операторе, включая NULL оператор. (например, в @(posedge clk);
, полуколон является нулевым утверждением.) Фактически, синтаксическое определение always
конструкция:
Always_construct: всегда утверждение
Это означает, что в этом нет ничего волшебного always @(open)
или же always @(posedge clk)
, они просто вводят заявление и определяют контроль событий. Когда контроль задержки (#
) прилагается к оператору, выполнение оператора откладывается до фиксированного времени в будущем. Когда контроль событий (@
) прилагается к оператору, выполнение оператора откладывается до тех пор, пока условие события не будет выполнено.
Другие советы
Вы должны подумать немного более критически о том, что вы пытаетесь моделировать. Похоже, вы просто пытаетесь моделировать память с «открытым», контролирующим операцию чтения/записи.
У вас есть асинхронное написание данных и синхронного чтения данных. Для доступа к памяти лучше просто иметь полное синхронное поведение.
always @(posedge clk) begin
if( open )
outp = Memory[addressOftheMemory];
else
Memory[addressOftheMemory] = data;
end