¿Cómo implementar este selector especial?

1

¿Es posible escribir un módulo con 3 cables a, b, c que generaría una de las siguientes opciones?

  1. z (desconectado) si a = b = c = z
  2. a si a = (0 o 1) y b = c = z
  3. b si b = (0 o 1) y a = c = z
  4. c si c = (0 o 1) y a = b = z
  5. x (no importa) de lo contrario

¿En verilog?

    
pregunta Ofek Ron

3 respuestas

3

No, no lo es, porque z no es una condición que se pueda probar en lógica sintetizable. Necesitaría encontrar una manera de convertir el concepto de " z o no, z " en un nivel lógico.

    
respondido por el Dave Tweed
2

Para explicar por qué la alta impedancia no es una condición que se pueda verificar:

Cuando una señal es de alta impedancia, el FPGA simplemente deja esa señal flotando. Normalmente, si dirige una señal a 0 , la conectará a GND , si asigna 1 , la conectará a VCC . Al asignar Z , le está diciendo al FPGA que lo deje flotante y no hacia arriba o hacia abajo. En este estado, la señal está en un valor indeterminable, porque el circuito CMOS / TTL que determina si una señal es un 1 o un 0 no está diseñado para funcionar con señales flotantes.

Entonces, ¿cuál es el punto? ¿Por qué tienen señales de alta impedancia en primer lugar?

Digamos, por ejemplo, que en su tarjeta la señal está conectada a uno de los pines de salida y el circuito externo lo conecta a GND . Al dejar la señal en alta impedancia, está permitiendo que los circuitos externos hagan el arrastre hacia abajo. En este caso, si configurara la señal como Z , aún sería capaz de determinar su valor al verificar si es un 1 o un 0 , porque incluso en el FPGA no ha tirado abajo, ha sido derribado en otra parte del circuito.

Entonces, cuando estás haciendo asignaciones de señales, asignar a z es algo que se hace regularmente. Sin embargo, cuando está verificando las señales, no debe verificar z , sino más bien 1 o 0 dependiendo del comportamiento esperado de quien realmente las está conduciendo.

    
respondido por el stanri
0
always @(in1,in2,in3) begin
     case ({in1,in2,in3}) 
      3'bzzz:  data_out = 1'bz;
      3'b0zz:  data_out = 1'b0;
      3'bz0z:  data_out = 1'b0;
      3'bzz0:  data_out = 1'b0;
      3'b1zz:  data_out = 1'b1;
      3'bz1z:  data_out = 1'b1;
      3'bzz1:  data_out = 1'b1;
      endcase
end

esto parece funcionar ...

    
respondido por el Ofek Ron

Lea otras preguntas en las etiquetas