--------------------------------------------------------------------- -- -- Fichero: -- gpio.vhd 30/9/2015 -- -- (c) J.M. Mendias -- Diseño Automático de Sistemas -- Facultad de Informática. Universidad Complutense de Madrid -- -- Propósito: -- Puerto de entrada/salida de propósito general programable -- con protocolo de strobe de 1 ciclo de duracion -- -- Notas de diseño: -- - Desde el punto de vista del programador dispone de un -- regitro de datos (tipo R/W) y un registro de configuración -- (tipo R/W). -- --------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; entity gpio is generic ( DWIDTH : natural; -- anchura del bus de datos PWIDTH : natural -- anchura del puerto ); port ( -- host side rst_n : in std_logic; -- reset asíncrono del sistema (a baja) clk : in std_logic; -- reloj del sistema regSel : in std_logic; -- selecciona registro de datos/configuración (0/1) wrE : in std_logic; -- se activa durante 1 ciclo para escribir en el registro de datos/configuración del puerto dataIn : in std_logic_vector(DWIDTH-1 downto 0); -- dato a escribir rdE : in std_logic; -- se activa durante 1 ciclo para leer el registro de datos/configuración del puerto dataOut : out std_logic_vector(DWIDTH-1 downto 0); -- dato a leer int : out std_logic; -- se actica durante 1 ciclo si alguna linea configurada como entrada cambia de valor -- io pads side io : inout std_logic_vector(PWIDTH-1 downto 0) -- entrada/salida del puerto (conexión a pines) ); end gpio; --------------------------------------------------------------------- use work.common.all; architecture syn of gpio is -- Codificación de registros constant PDAT : std_logic := '0'; constant PCON : std_logic := '1'; -- Codificación de PCON(i) constant OUTPUT : std_logic := '0'; constant INPUT : std_logic := '1'; signal ioSync : std_logic_vector(io'range); signal datReg : std_logic_vector(io'range); signal conReg : std_logic_vector(io'range); begin configurationRegister : process (rst_n, clk) begin ... end process; dataRegister : process (rst_n, clk) begin ... end process; intGenerator: process( datReg, ioSync ) variable intAux : std_logic; begin ... end process; inputSynchronizer : for j in io'range generate begin ... end generate; ioBuffers : for i in io'range generate begin ... end generate; dataOutMux : process (regSel, rdE, conReg, datReg) begin ... end process; end syn;