Alternar salida usando Verilog

-1

¿Puede alguien explicarme este código?

module test(clk,a);
  input clk;
  output a;
  reg temp;
  initial begin
  temp  <= 1'b1;
  always @(posedge clk)
    a <= ~temp;
  end
endmodule

Quería escribir un código tal que para cada ciclo de reloj el valor de 'a' alternara entre '0' y '1'.

    
pregunta Sai Siril

4 respuestas

2
module test(clk,temp);
  input clk;
  output reg temp;
  initial temp = 1'b1;
  always @(posedge clk)
    temp <= ~temp;
endmodule

En su código, indique que a cada reloj que asigne a con un valor invertido de temp que se mantiene constante; y también poner todas estas cosas en el bloque inicial. Utilice temp en el código anterior, no necesita ningún registro adicional.

Editar: de acuerdo con el comentario para otro póster de respuesta, initial se usa para simulación, dentro del hardware real necesitará una señal de entrada de reinicio

module test(clk,temp,reset_n);
  input clk;
  input reset_n;
  output reg temp;
  always @(posedge clk or negedge reset_n)
    if(!reset_n) temp <= 1'b1;
    else temp <= ~temp;
endmodule
    
respondido por el Anonymous
0

Si mi verilog no está demasiado oxidado.

Inicia el módulo y define todas las entradas, salidas y señales que planea utilizar. Que es esta parte:

input clk;
output a;
reg temp;

Empiezas el módulo con

Initial begin

Usted define su señal de temperatura como una. 1'b1 es la sintaxis de Verilog para un valor constante que es un número de un bit expresado en formato binario con un valor de uno. Un valor de bit de cero se expresaría como 1'b0.

 temp  <= 1'b1;

en la siguiente parte que dices, cada vez que el reloj tiene un borde positivo, alterna el bit que está en temperatura y lo escribe en una El símbolo ~ representa una negación a nivel de bit. Cada bit en el valor se alterna

always @(posedge clk)
a <= ~temp;
    
respondido por el Remco Vink
0

los bloques iniciales solo se ejecutan una vez en el tiempo = 0. Si desea usar intitial, úselo, pero coloque su always@ en otro lugar, fuera del bloque inicial, que está definido por begin... end

y, sí, como dicen otros, initial es solo para simulación ... para HW real, use un reinicio para "inicializar" un registro

    
respondido por el CapnJJ
0

Ayuda a otros a explicar lo que esperabas (hiciste) y lo que realmente viste (error de sintaxis).

El problema con su código es que tiene una construcción always donde solo se permiten declaraciones de procedimientos. La construcción always crea una instancia de un proceso para ejecutar código de procedimiento, pero no es una declaración de procedimiento en sí misma. La construcción initial también crea un proceso, pero no es una declaración de procedimiento. Es posible que desee leer esta discusión .

El otro problema con su código es que está intentando realizar asignaciones de procedimiento al cable a , lo cual no está permitido. Consulte esta publicación para obtener una explicación completa.

Lo que querías escribir es:

module test(input wire clk,
            output reg a);
  initial a = 1;
  always @(posedge clk)
    a <= ~a;
  end
endmodule

El siguiente problema es si desea sintetizar este código en hardware, si su herramienta admite un estado inicial para a , o necesitará una señal de restablecimiento por separado para hacerlo.

    
respondido por el dave_59

Lea otras preguntas en las etiquetas