FPGA - ¿Es posible cambiar la dirección / tipo del pin durante el tiempo de ejecución?

2

En un FPGA, ¿es posible imitar el comportamiento de algo como un Arduino, donde el código que se ejecuta en el chip puede designar un pin como entrada o salida?

Digamos que el FPGA está configurado como un procesador. Además, digamos que tenemos tres registros designados para controlar los pines de E / S, como los equivalentes de Arduino :

  

Cada puerto está controlado por tres registros ... El registro DDR, determina si el pin es una ENTRADA o SALIDA. El registro PORT controla si el pin es ALTO o BAJO, y el registro PIN lee el estado de los pines INPUT configurados para ingresar con pinMode ().

¿Cómo puede hacer que el FPGA use un registro (como DDR) para cambiar la dirección del pin, según lo que el programa en ejecución actualiza el registro? (Al ejecutar el programa, me refiero al programa que se ejecuta en el procesador en el que se ha configurado el FPGA).

No estoy seguro de si esto es posible dado que durante la asignación de pines para la síntesis tiene que especificar la dirección del pin. Pero espero que me equivoque? ¿Se podría hacer esto de alguna manera usando el modo pin bidireccional?

    
pregunta Jet Blue

1 respuesta

3

La respuesta es en la mayoría de los casos, sí. Los pines GPIO en la mayoría de los FPGA serán bidireccionales, al igual que los de una ATMega (placa de Arduino MCU).

Para un FPGA, simplemente debe describir la lógica de un búfer de tres estados para poder controlar la dirección. Esto es bastante simple en la mayoría de los casos.

Para dar un ejemplo, asumamos Verilog:

module tristate (
    inout ioPin, //inout means bidirectional

    input toPin,     //Data to io pin (i.e. PORT)
    input direction, //Direction control (i.e. DDR)
    output fromPin   //Data from io pin (i.e. PIN)
);

localparam INPUT = 1'b0;
assign ioPin = (direction == INPUT) ? 1'bz : toPin;
assign fromPin = ioPin;

endmodule

A partir del código anterior, las herramientas de síntesis inferirían un búfer triple con un pin de control. He etiquetado los puertos con los nombres de los registros ATMega correspondientes. La señal ioPin se conecta al mundo exterior y se declara como inout que significa bidireccional.

Cuando el pin direction es alto, entonces ioPin será una salida, manejada con el valor de toPin . Cuando direction es bajo, entonces ioPin será una entrada (conducida por high-z). La señal fromPin siempre reflejará el valor de ioPin independientemente de si se trata de una entrada o una salida.

Puedes hacer construcciones similares en VHDL y en métodos de ingreso de esquemas / netlist.

Además, muchos fabricantes de FPGA proporcionarán elementos primitivos para los buffers bidireccionales si prefiere no confiar en las conjeturas de síntesis.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas