Pregunta

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

Línea marcada con (i), quiero esperar solo Posedge CLK antes de enviar OUTP al puerto de salida. Sin embargo, cuando lo haya intentado;

if ( posedge clk )

Da un error

while ( clk != 1 ) begin

end 

Da salida de respuesta/simulación de abogados.¿Qué (s) debería poner a esa línea para esperar Posedge CLK antes de enviar la salida?

¿Fue útil?

Solución

Puede retrasar la ejecución hasta el borde del reloj como este:

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

Eso puede o no lograr lo que desea. No es sintetizable, y el always el bloque no se reprogramará mientras se ejecuta o suspendido, por lo que si open Alternar varias veces en un período de reloj, ese código probablemente no hará lo que desee.

Más antecedentes: puede especificar un control de retraso/evento en cualquier declaración, incluida una declaración nula. (por ejemplo @(posedge clk);, el punto y coma es una declaración nula.) De hecho, la definición de sintaxis de un always La construcción es:

siempre_construct: siempre declaración

Lo que significa que no hay nada mágico sobre always @(open) o always @(posedge clk), simplemente están introduciendo una declaración y especificando el control de eventos. Cuando el control de retraso (#) se adjunta a una declaración, la ejecución de la declaración se difiere hasta un tiempo fijo en el futuro. Cuando el control de eventos (@) se adjunta a una declaración, la ejecución de la declaración se aplaza hasta que se cumpla la condición del evento.

Otros consejos

Tienes que pensar un poco más críticamente sobre lo que estás tratando de modelar. Parece que solo está tratando de modelar una memoria con "Abrir" controlando la operación de lectura/escritura.

Tiene una escritura asíncrona de datos y lectura sincrónica de datos. Para el acceso a la memoria, es mejor tener un comportamiento sincrónico completo.

always @(posedge clk) begin
if( open )
    outp = Memory[addressOftheMemory];
else
    Memory[addressOftheMemory] = data;
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top