Bueno, con el manual en español, lo vais a tener un poco crudo. Estas cosas son asi.
En cuanto a la interfaz, quizas os meti demasido miedo, ya que es no es tan dificil, pero si no habeis echo ni visto ninguna comprendo que esteis perdidos. Cuando empece en este mundillo cualquier cosa se hacía cuesta arriba. Pues aqui os pongo una que he hecho.
La interfaz tiene 2 puertos uno de entrada "puerto_entrada" y otro de salida "puerto_salida". Ambos tienen una dirección parametrizable, es decir, por defecto les he puesto las direcciones que me a dado la gana (0x0A y 0x0B). Las podeis cambiar facilmente en la sentencia "generic". Básicamente, lo que hace el módulo es comparar la dirección que pone el micro en el bus PORT_ID, con las direcciones que se han definido con el "generic". Cuando coinciden y detectan una operación de lectura o escritura, leen el dato del puerto de entrada o lo colocan en el de salida respectivamente.
A partir de éste módulo, podeis hacer lo que querais, como por ejemplo, un controlador de displays de 7 segmentos, un controlador de teclado, etc. Aunque con estos dos puertos teneis de sobra para hacer lo que me comentábais de leer un par de datos, sumarlos y sacarlos por el puerto de salida.
Codigo:
-- Módulo que se comporta como un puerto de entrada y otro de salida para el PicoBlaze
-- Cuando el micro quiere escribir en el puerto de salida, coloca su dirección en PORT_ID
-- el dato en OUT_POTR y activa la señal WRITE_STROBE
-- Cuando el micro quiere leer del puerto de entrada, coloca su dirección en PORT_ID
-- activa la señal READ_STROBE y captura el dato del IN_PORT
-- La dirección de los puertos de entrada/salida es parametrizable
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity interface is
-- Direcciones de los puertos
Generic ( ID_ENTRADA : std_logic_vector(7 downto 0) := X"0A";
ID_SALIDA : std_logic_vector(7 downto 0) := X"0B"
;
-- Señales
Port ( clk :in std_logic;
reset : in std_logic;
puerto_salida : out std_logic_vector(7 downto 0);
puerto_entrada : in std_logic_vector(7 downto 0);
IN_PORT : out std_logic_vector(7 downto 0);
OUT_PORT : in std_logic_vector(7 downto 0);
PORT_ID : in std_logic_vector(7 downto 0);
WRITE_STROBE : in std_logic;
READ_STROBE : in std_logic);
end entity interface;
architecture Behavioral of interface is
begin
puertos : process (clk, reset) begin
if(reset = "1") then
puerto_salida <= (others => "0"); -- Al inicio, el puerto de salida e cero.
elsif(clk"event and clk="1")then
if(WRITE_STROBE = "1") then
if(PORT_ID = ID_SALIDA) then
puerto_salida <= OUT_PORT; -- Se carga el puerto de salida
end if;
elsif(READ_STROBE = "1") then
if(PORT_ID = ID_ENTRADA) then
IN_PORT <= puerto_entrada; -- Se lee el puerto de entrada
else
IN_PORT <= (others => "Z"); -- Si no corresponde con la netrad, se deja libre el puerto
end if;
end if;
end if;
end process puertos;
end Behavioral;