Ожидание POSEDGE CLK, прежде чем выполнять работу? - Как

StackOverflow https://stackoverflow.com/questions/5853868

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top