Entendiendo los circuitos combinados de retroalimentación

0
  1. Por favor, dame un ejemplo simple de un código de verilog que dé como resultado un combo de retroalimentación.

  2. ¿Por qué estos bucles de realimentación no son deseados en su diseño? ¿Cómo interpretar las asignaciones de bloqueo vs no de bloqueo en Verilog? - Pregunta de StackOverflow

  3. ¿Por qué / cómo están presentes los combo-loops en (algunas) Máquinas de estado finito y etapas de tubería?

pregunta Anand

2 respuestas

2

Piensa en qué es la lógica combinatoria?
Puertas lógicas donde la salida está definida completamente por la entrada, no hay estado.

Imagina b = XOR de a y b.

un cambio a 1 cambio de salida a 1 bucles atrás xor ahora es 0, feedback significa que xor ahora es 1 etc.

Esta es una oscilación no controlada que solo se detendrá cuando la entrada a se establezca en 0 y se detendrá en un estado indeterminado.

El ejemplo anterior debería poder codificarse como: pero cualquier lógica combinatoria que reutiliza una salida es un bucle.

input a;
reg b;

always @* begin
  b = b ^ a; 
end

o

input a;
wire b;
assign b = b ^ a;
    
respondido por el pre_randomize
0

Los bucles de retroalimentación combinatorios son generalmente indeseables porque la salida oscilará y la salida es impredecible. Sin embargo, a veces eso es exactamente lo que desea: un generador de números aleatorios de hardware (RNG). Altera ha lanzado un código verilog de ejemplo que hace exactamente eso. Consulte 14–2 en su Libro de cocina de síntesis avanzada .

Aquí está uno de sus ejemplos, encontrado aquí, bajo random / ring_counter.v :

module ring_counter (clk,rst,out);

parameter DELAY = 100;

input clk,rst;
output [15:0] out;

wire [DELAY-1:0] delay_line /* synthesis keep */;

reg [15:0] cntr;
reg sync0;
reg wobble;

// unstable ring oscillator
genvar i;
generate
for (i=1; i<DELAY; i=i+1)
  begin : del
    assign delay_line [i] = delay_line[i-1];
  end
endgenerate
assign delay_line [0] = !delay_line [DELAY-1];

// sync it over to the input clock
always @(posedge clk) begin
  sync0 <= delay_line[0];
  wobble <= sync0;
end

// count when the wobbly oscillator is high
always @(posedge clk or posedge rst) begin
  if (rst) cntr <= 0;
  else if (wobble) cntr <= cntr + 1;
end

assign out = cntr;

endmodule
    
respondido por el sbell

Lea otras preguntas en las etiquetas