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'?
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 ioPin
señal se conecta con el mundo exterior y se declara inout
bidireccional.
Cuando el direction
pin es alto, ioPin
habrá una salida, impulsada con el valor de toPin
. Cuando direction
es bajo, entonces ioPin
será una entrada (impulsada por alta-z). La fromPin
señal siempre reflejará el valor ioPin
independientemente 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.
fromPin = (direction == OUTPUT) ? 1'bz : ioPin
Eugenio Sh.
inout
tipo pin en Verilog, para este propósito. La lógica de cómo se controla depende de usted.Andy alias
crj11
TonyM
tubo
crj11