No estoy familiarizado con las herramientas de Xilinx, pero sí con las de Altera, así que te contaré sobre las suyas. Xilinx y otros no deberían ser muy diferentes.
Verilog
Lo primero que deberá hacer es aprender Verilog . Esto hará que te duela la cabeza porque Verilog (y el VHDL algo similar) se diseñó por primera vez como un lenguaje de simulación , y muchas construcciones (como lo #5
que significa "esperar 5 pasos de tiempo", un paso de tiempo generalmente es un nanosegundo). Por lo tanto, hay muchas restricciones que debe tener en cuenta para que su código Verilog sea sintetizable , es decir, compilable en un flujo de bits para un FPGA.
Sin embargo, la mayor sorpresa es que lo que escribe en Verilog (y VHDL) es el comportamiento que espera del sistema , y el compilador infiere la lógica adecuada de su descripción. Si no tienes cuidado, puedes obtener muchos errores desagradables de esto.
Por ejemplo, un flip-flop D se ve así:
always @(posedge RESET or posedge CLK)
begin
if(RESET)
Q <= 1'b0;
else if(CLK_ENA)
Q <= D;
end
Esto describe cómo funciona un DFF, y el compilador tiene que analizarlo y descubrir que desea un DFF. Se @(...)
llama una lista de sensibilidad , que es una lista de señales que desencadenan una reevaluación del bloque de código; por lo tanto, en este bloque, Q
solo cambia si hay un flanco ascendente RESET
o CLK
(esto es para un reinicio activo-alto). Si olvida algo en la lista de sensibilidad (que debe contener todas las variables del lado derecho sin ninguno posedge
o negedge
modificadores para un bloque lógico combinacional) el compilador sintetizará los bloqueos según sea necesario en lugar de llamar a un error. Loco, pero es así, porque Verilog era originalmente un lenguaje de simulación que ocultaba (y por lo tanto no requería) detalles de implementación. VHDL es igual pero mucho más detallado.
Finalmente, hace unos años se lanzó una nueva versión de Verilog llamada SystemVerilog que hace que escribir código sintetizable sea mucho, mucho más fácil . Si es posible, aprenda este idioma, ya que Xilinx ISE y Altera Quartus II lo admiten. El principal problema es la falta total de buen material de referencia.
La versión SystemVerilog de un DFF limpia un par de cosas pequeñas:
always_ff @(posedge RESET, posedge CLK)
begin
if(RESET)
Q <= '0;
else if(CLK_ENA)
Q <= D;
end
Tenga en cuenta que las señales en la lista de sensibilidad están separadas por comas. Esto se debe a que or
era confuso ya and
que no podía funcionar allí. También tenga en cuenta la sustitución de 1'b0
(un solo 0
bit) con '0
(un símbolo que se expande a la cantidad de 0
bits necesarios según lo que se le asigne; mucho más flexible con los módulos parametrizados). Finalmente, observe el reemplazo de always
(que podría usarse para cualquier cosa; lógica combinacional, pestillos y flip flops) con el always_ff
que se requiere que el contenido se sintetice en flip-flops. También hay una always_comb
que elimina la lista de sensibilidad, ya que solo resuelve las sensibilidades de las entradas al bloque.
El software de diseño de Altera se llama Quartus II, y estará buscando la Edición Web . (Las ediciones de suscripción son bastante caras y solo se necesitan para los modelos FPGA más rápidos o más recientes).
La parte triste es que no he encontrado un buen libro sobre el tema. Lo que aprendí lo obtuve juntando cosas de múltiples fuentes, como los libros de Verilog que no hacen un buen trabajo al decirle qué es sintetizable y qué no, y el código de ejemplo. Quartus II tiene un comando "insertar plantilla" que inserta código de plantilla para varias estructuras comunes, desde flip-flops D hasta máquinas de estado.
Hardware de demostración
Una vez que haya implementado su procesador en Verilog, debe compilarlo. Por el momento, deje que Quartus elija el chip (debe elegir la familia; recomendaría el Cyclone IV) y los pinouts. Una vez que se agiliza, sabrás cuánto chip necesitas. Le dirá cuántos elementos lógicos, flip flops, bits de RAM, etc., utilizó. Asegúrese de no tener más del 50% en ninguno de esos; si es así, mire el chip que eligió el compilador y seleccione manualmente el siguiente chip más grande (en elementos lógicos) que tenga al menos tantos pines, y repita hasta obtener una utilización por debajo del 50%.
Luego, compre una placa de demostración que tenga un chip al menos tan grande como el que finalmente construyó. Verifique que tenga los periféricos y / o conectores de E / S que necesitará. No es raro construir una tarjeta secundaria que se conecte a un conector de expansión para proporcionar el hardware que falta.
Ahora que ha elegido su hardware, descubra los pines reales y use el Planificador de pines para colocar las señales correctas en los pines correctos. La placa de demostración tendrá una guía del usuario que le indica qué pines están conectados a qué dispositivos o pines de conector en la placa de demostración.
Una vez que establezca los pinouts, compílelo nuevamente para que use los pin que desee. Tenga en cuenta que algunas señales como los relojes del sistema necesitarán pines de entrada dedicados (por lo que se dirigen directamente a los PLL internos).
Use el programador para descargar su diseño directamente en el FPGA (ese registro de desplazamiento que mencioné hace un tiempo). Ahora estás en el ciclo familiar de depuración de edición, compilación y ejecución. Golpea hasta que funcione.
Una vez que funciona, puede usar el programador para descargar el código en el dispositivo de configuración integrado para que su programa se cargue y se ejecute al encenderlo.
Esto fue bastante largo, y espero que haya ayudado un poco. Hay mucho que aprender; no es como aprender un nuevo lenguaje de programación tanto como es aprender un nuevo paradigma de programación, por ejemplo, pasar de lenguajes procesales a funcionales. Verilog es un lenguaje simultáneo; la mayor parte del código siempre se está ejecutando.
¡Buena suerte!