FPGA: ¿es posible cambiar la dirección/tipo de pin durante el tiempo de ejecución?

En un FPGA, ¿es posible imitar el comportamiento de algo como un Arduino, mediante el cual 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 IO de manera muy similar a los equivalentes de Arduino :

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

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

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

Por supuesto que es posible. Hay inouttipo pin en Verilog, para este propósito. La lógica de cómo se controla depende de usted.
Y he probado una salida completamente sobre la marcha al diseñar parte de un PLL.
Si define el pin como bidireccional, siempre recibirá el estado del pin. Su código FPGA decide si conducir el pin. Si no es así, el estado se determina externamente y puede considerar el pin y la entrada. Si la FPGA habilita el controlador de salida, entonces es una salida y el estado está determinado por lo que la FPGA maneja. Solo asegúrese de que el pin solo sea impulsado por una fuente a la vez.
Sí. Casi todos los FPGA y CPLD tienen controladores de pines de tres estados y búferes de entrada de pines. Todos están conectados a la matriz de circuitos lógicos internos y pueden ser controlados o utilizados por ese circuito como desee. Eche un vistazo a los circuitos de pines de E/S en una hoja de datos típica de FPGA. Pruebe la hoja de datos de un Xilinx Spartan-3E.
@ crj11 Has escrito tu respuesta en el lugar equivocado. Ahora no puede ser examinado por la comunidad ni aceptado como correcto.
Me doy cuenta de que lo puse en el lugar equivocado. Solo quería dar una respuesta rápida, al diablo con el crédito.

Respuestas (1)

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 un ATMega (MCU de la placa Arduino).

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

Para dar un ejemplo, supongamos 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 de tres estados con un pin de control. He etiquetado los puertos con los nombres de los registros ATMega correspondientes. La ioPinseñal se conecta con el mundo exterior y se declara inoutbidireccional.

Cuando el directionpin es alto, ioPinhabrá una salida, impulsada con el valor de toPin. Cuando directiones bajo, entonces ioPinserá una entrada (impulsada por alta-z). La fromPinseñal siempre reflejará el valor ioPinindependientemente de si es una entrada o una salida.

Puede realizar construcciones similares en VHDL y métodos de entrada de esquemas/netlist.

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

¿Hay algún inconveniente en colocar también un tristate en el lado de entrada? Es decirfromPin = (direction == OUTPUT) ? 1'bz : ioPin
Además, al no tener un búfer en el lado de entrada, ¿no terminaría con una especie de cortocircuito? Digamos que escribes 1/alto en el pin io. Al mismo tiempo, también estaría leyendo el mismo 1/alto que está escribiendo. Entonces, ¿al mismo tiempo que te abasteces también te estás hundiendo?
Bueno, fromPin está impulsando la lógica interna, por lo que no puede hacer que se tristate en la mayoría de los dispositivos, incluso si lo desea (la mayoría de los FPGA no admiten tristate interno). Y sí, esperarías volver a leer al mismo nivel que estás escribiendo, a menos que haya un cortocircuito externo a tierra o algo así.