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

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 C yo k ). Las señales de salida y 1 , y 2 , y 3 , y 4 se determinan de la siguiente manera:

En el borde ascendente de C yo k , la señal de salida y i con i = 1 , 4 entrada máxima correspondiente X i con X i = metro a X ( X 1 , X 2 , X 3 , X 4 ) en este momento tendrá valor 1 mientras que otras señales de salida son cero durante ese período.

Por ejemplo, X 3 = metro a X ( X 1 , X 2 , X 3 , X 4 ) entonces y 3 = 1 y y 1 = y 2 = y 4 = 0 .

Como no sé cómo hacerlo a partir de puertas 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 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? Se puede obtener a partir del diseño de circuitos a partir de puertas lógicas o sintetizarse a partir de verilog.

Señales de entrada X 1 , X 2 , X 3 , X 4 son señales positivas de valor real, pero no necesito una alta precisión, solo unas 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:

ingrese la descripción de la imagen aquí

¿Qué salida espera si todas xlas entradas son 1?
También dice que los xs tienen un "valor real", pero por la forma en que lo codificó, se supondrá que son valores digitales de 1 bit. Verilog no tiene números "reales", por lo que deberá tener un ADC externo y obtener la entrada de este módulo como valores digitales de punto fijo (a menos que desee desarrollar o comprar un bloque de IP de punto flotante).
@ThePhoton: 1 son las señales de salida, no las entradas.
El código que tiene ahora trata las entradas x1, x2, etc., como valores digitales de 1 bit.
@ThePhoton: Oh, sí, entonces estoy equivocado en el código.
Alternativa: use comparadores analógicos externos para proporcionar entradas a su dispositivo digital. El diseño de estos no es un trabajo para Verilog.
@ThePhoton: sí, usar comparadores está bien.

Respuestas (2)

  • El código verilog que escribe para FPGA se ocupa de la lógica digital. Solo ve señales que tienen un "alto" o "bajo", no conoce ningún valor intermedio. En su código actual, solo está comparando entre señales sobre la base de altos y bajos. Está interesado en "valores reales", digamos una señal analógica que varía entre 0 y 5 V, y desea compararlos. Lo que necesita es solo un conjunto de comparadores analógicos. Por ejemplo para dos señales:

ingrese la descripción de la imagen aquí

  • Otra forma es conectar sus entradas analógicas a ADC, convertirlas en equivalentes digitales. Digamos, por ejemplo, valores digitales de 10 bits. Y alimente estos valores digitales a su FPGA. Debería escribir un código verilog similar para comparar estos vectores de señal y controlar las salidas en consecuencia.

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