Hay una serie de cosas con las que estás luchando. Creo que lo mejor que puedes hacer es dar un paso atrás y definir qué es exactamente lo que quieres hacer antes de empezar a conectar las cosas. Esto es mucho más simple de lo que puede sonar, y tener algo EN PAPEL que puede consultar le ahorrará un sinfín de dolores de cabeza. Simplemente dibuje dos tablas: una para entradas y otra para salidas. Ahora, para cada salida, escriba para qué es la salida y qué debe suceder para que la salida se convierta en '1' o '0'. Para las entradas, anote para qué sirve cada una y qué significa para el sistema un cambio a '1' o '0'. Desde ese simple documento, puede comenzar a descubrir qué pines físicos en el FPGA y el microcontrolador son los mejores para usar para cada propósito, y comenzar a construir un esquema.
Ahora ... ¿pulsadores supersensibles? Creo que lo que estás describiendo se conoce como "rebote de contacto": no puedes conectar un interruptor mecánico a un circuito digital de alta velocidad y esperar obtener buenas transiciones de limpieza de encendido y apagado. Los interruptores mecánicos rebotan, y así es como son. Tienes que rebotar ellos.
Puede hacerlo en hardware, en HDL o en software. El lugar donde decida hacerlo depende de usted, y de hecho, para un principiante, probablemente sea un buen ejercicio probar varios métodos para que cada uno tenga una idea de cómo funcionan. El rebote se reduce a ignorar o "absorber" las transiciones extrañas del interruptor hasta que el interruptor deje de rebotar. Una forma realmente sencilla de hacerlo en software es buscar la transición de conmutador que le interesa (1- > 0, 0- > 1 o quizás ambas) y, si se ve una transición, inicialice un contador. Ignore más las transiciones de conmutación hasta que el contador esté listo, luego vuelva a mirar el conmutador y vea cuál es el estado. Si el valor es el mismo, tienes tu nuevo valor. Si no lo es, fue un error y debe ser ignorado. El valor al que inicializa el contador depende de la capacidad de respuesta que necesita y de cuán "ruidosos" son sus interruptores, pero un buen valor de inicio sería 50-100ms.
Software muy simple para el rebote de botones:
/* main loop code, executed regularly */
if(debounce1 == 0) { /* count is 0, we are looking for button presses */
if(button1 == 0) {
debounce1 = DEBOUNCE_COUNT;
}
} else { /* count isn't 0, we are debouncing. */
--debounce1;
if(debounce1 == 0 && button1 == 0) {
do_something_because_of_button1();
}
}
if(debounce2 == 0) {
if(button2 == 0) {
debounce2 = DEBOUNCE_COUNT;
}
} else {
--debounce2;
if(debounce2 == 0 && button2 == 0) {
do_something_because_of_button2();
}
}
Por supuesto, aquí DEBOUNCE_COUNT es un valor que representa 50 ms. Si su bucle principal se ejecuta cada 1 ms, este valor sería 50. Ajuste según sea necesario.
Hay formas más elegantes de hacer esto, pero esto es probablemente lo suficientemente bueno para que comiences, y es lo suficientemente sencillo como para entenderlo.
Si el concepto de eliminación de botones es nuevo para usted, pondría lejos el FPGA por ahora y me concentraría solo en la interfaz básica con el PIC durante un tiempo. Una vez que se sienta cómodo con el funcionamiento del PIC y tenga algo de experiencia, guarde el PIC y haga lo mismo con el FPGA. ENTONCES enganchar los dos. Tratar de hacer demasiado pronto te dejará frustrado y odiando los aparatos electrónicos.