Diseñe un circuito de compuertas lógicas, flip flops y / o multiplexores

0

Me gustaría crear un circuito simple a partir de puertas lógicas, flip-flops (sin componentes RLC) para realizar la siguiente tarea:

Este circuito tiene 5 entradas (4 señales positivas de valor real \ $ x_1, x_2, x_3, x_4 \ $ y una señal de reloj \ $ clk \ $). Las señales de salida \ $ y_1, y_2, y_3, y_4 \ $ se determinan de la siguiente manera:

En el borde ascendente de \ $ clk \ $, la señal de salida \ $ y_i \ $ con \ $ i = 1,4 \ $ correspondiente entrada máxima \ $ x_i \ $ con \ $ x_i = max (x_1, x_2 , x_3, x_4) \ $ en este momento tendrá un valor \ $ 1 \ $ mientras que otras señales de salida son cero durante ese período.

Por ejemplo, \ $ x_3 = max (x_1, x_2, x_3, x_4) \ $ luego \ $ y_3 = 1 \ $ y \ $ y_1 = y_2 = y_4 = 0 \ $.

Como no sé cómo hacerlo a partir de compuertas lógicas, traté de escribir código verilog y luego lo sinteticé para obtener el circuito. Sin embargo, creo que el resultado es demasiado complicado de lo necesario. Los componentes tales como puertas lógicas, flip-flops, multiplexores están bien, pero el bloque comparador es quizás demasiado complejo. ¿Hay un circuito simple para hacer esta tarea? Puede obtenerse a partir del diseño de circuitos a partir de puertas lógicas o sintetizarse a partir de verilog.

Las señales de entrada \ $ x_1, x_2, x_3, x_4 \ $ son señales de valor real positivas, pero no necesito una alta precisión, solo 3 cifras significativas están bien.

A continuación se muestra mi código y el circuito obtenido de este código.

module example (clk, x1, x2, x3, x4, y1, y2, y3, y4);
input clk, x1, x2, x3, x4;
output reg y1, y2, y3, y4;

always @(posedge clk)
    if((x1>x2) && (x1>x3) && (x1>x4))
        begin 
            y1 <= 1'b1;
            y2 <= 1'b0;
            y3 <= 1'b0;
                y4 <= 1'b0;
        end
    else if((x2>x1) && (x2>x3) && (x2>x4)) 
        begin 
            y1 <= 1'b0;
            y2 <= 1'b1;
            y3 <= 1'b0;
            y4 <= 1'b0;
     end
    else if((x3>x1) && (x3>x2) && (x3>x4))
        begin
            y1 <= 1'b0;
            y2 <= 1'b0;
            y3 <= 1'b1;
                            y4 <= 1'b0;
        end
     else if((x4>x1) && (x4>x2) && (x4>x3))

        begin
            y1 <= 1'b0;
            y2 <= 1'b0;
            y3 <= 1'b0;
        y4 <= 1'b1;
        end
   endmodule

Esquema obtenido del código anterior:

    
pregunta anhnha

2 respuestas

2
  • El código verilog que escribe para los FPGA trata con la lógica digital. Solo ve que las señales tienen un valor "alto" o "bajo", no conoce ningún valor intermedio. En su código actual, simplemente está comparando entre señales en función de los valores máximos y mínimos. Usted está interesado en los "valores reales", digamos una señal analógica que varía entre 0 y 5V, y desea compararlos. Lo que necesitas es sólo un conjunto de comparadores analógicos. Por ejemplo, para dos señales:

  • Otra forma es conectar sus entradas analógicas a los ADC, convertirlas en equivalentes digitales. Digamos por ejemplo valores digitales de 10 bits. Y alimenta estos valores digitales a tu FPGA. Necesitaría escribir un código verilog similar para la comparación de estos vectores de señal y unidades de salida en consecuencia.
respondido por el MITU RAJ
1

Una forma de simplificar el circuito es reemplazar lo último si por otra persona, ya que siempre debe especificar la salida de su función para cualquier entrada. Después de eso, siempre podría intentar crear la tabla lógica a mano y ver si puede encontrar un patrón, pero mi opinión personal es que probablemente debería usar un FPGA o un microcontrolador para eso.

    
respondido por el lucas92

Lea otras preguntas en las etiquetas