Capítulo 1 ¡Hola Mundo! Setbit

Embed Size (px)

Citation preview

  • 8/17/2019 Capítulo 1 ¡Hola Mundo! Setbit

    1/6

    Inicio (EN)

    Capítulos

    0 You are leaving the privativesector (EN)1 ¡Hola mundo! (EN)2 De un bit a datos (EN)3 Puerta NOT (EN)4 Contador de 26 bits (EN)5 Prescaler de N bits (EN)6 Múltiples prescalers7 Contador de 4 bits con prescaler 8 Registro de 4 bits9 Inicializador 10 Registro de desplazamiento11 Multiplexor de 2 a 112 Multiplexor de M a 113 Inicializando registros

    14 Registro de N bits con resetsíncrono15 Divisor de frecuencias16 Contador de segundos17 Generando tonos audibles18 Tocando notas19 Secuenciando notas20 Comunicaciones serieasíncronas21 Baudios y transmisión22 Reglas de diseño síncrono23 Controladores y autómatasfinitos

    24 Unidad de transmisión serieasíncrona25 Unidad de recepción serieasíncrona26 Memoria ROM27 Memoria ROM genérica28 Memoria RAM29 Puertas triestado30 Hacia el microprocesador y másallá

    Clone this wiki locally

    Capítulo 1: ¡Hola mundo! SetbitManuel F. Jaimes edited this page Feb 13, 2016 · 30 revisions

    Ejemplos de este capítulo en github

    Antes de empezar No olvides clonar los tutoriales en tu ordenador, para tener acceso a todos los programas deejemplo:

    https://github.com/Obijuan/open-fpga-verilog-tutorial.git

    Entra en el directorio de trabajo del tutorial 1:

    cd o pen-fpga-verilog- tutorial/tutorial/ICESTI CK/T01-s etbit /

    ¡Estás listo para hacer el tutorial!

    IntroducciónEl circuito digital más sencillo es simplemente un cable que está conectado a un nivel lógicoconocido, por ejemplo 1. De esta forma al conectar un led se iluminará (1) o se apagará (0)

    La salida de este circuito la hemos denominado A.

    setbit.v: Descripción del hardware

    Para sintetizar este circuito en la FPGA, primero lo tenemos que describir usando un lenguaje dedescripción hardware (HDL). En este tutorial utilizaremos Verilog, ya que tenemos todas lasherramientas libres para su simulación / síntesis.

    Verilog es un lenguaje que sirve para describir hardware... pero ¡Cuidado! ¡NO ES UN LENGUAJEDE PROGRAMACIÓN! ¡Es un lenguaje de descripción! Nos permite describir las conexiones y los

    13 31 15Watch Star ForkObijuan / open-fpga-verilog-tutorial

    Code Issues 0 Pull requests 0 Wiki Pulse G raphs

    Pages 40

    https://github.com/Obijua

    Clone in Desktop

    Personal Open source Business Explore Pricing Blog S upport This repository Search Sign upSign upSign inSign in

    converted by Web2PDFConvert.com

    https://github.com/Obijuanhttps://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/watchershttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/stargazershttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-30%3A-Hacia-el-microprocesador-y-m%C3%A1s-all%C3%A1http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttps://github.com/Obijuan/open-fpga-verilog-tutorial/tree/master/tutorial/ICESTICK/T01-setbithttps://windows.github.com/https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-30%3A-Hacia-el-microprocesador-y-m%C3%A1s-all%C3%A1https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-29%3A-Puertas-triestadohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-28%3A-Memoria-RAMhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-27%3A-Memoria-ROM-gen%C3%A9ricahttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-26%3A-Memoria-ROMhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-25%3A-Unidad-de-recepci%C3%B3n-serie-as%C3%ADncronahttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-24%3A-Unidad-de-transmisi%C3%B3n-serie-as%C3%ADncronahttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-23%3A-Controladores-y-aut%C3%B3matas-finitoshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-22%3A-Reglas-de-dise%C3%B1o-s%C3%ADncronohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-21%3A-Baudios-y-transmisi%C3%B3nhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-20%3A-Comunicaciones-serie-as%C3%ADncronashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-19%3A-Secuenciando-notashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-18%3A-Tocando-notashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-17%3A-Generando-tonos-audibleshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-16%3A-Contador-de-segundoshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-15%3A-Divisor-de-frecuenciashttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-14%3A-Registro-de-N-bits-con-reset-s%C3%ADncronohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-13%3A-Inicializando-registroshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-12%3A-Multiplexor-de-M-a-1https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-11%3A-Multiplexor-de-2-a-1https://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-10%3A-Registro-de-desplazamientohttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-9%3A-Inicializadorhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-8%3A-registro-de-4-bitshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-7%3A-Contador-de-4-bits-con-prescalerhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-6%3A-Multiples-prescalershttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-5%3A-N-bit-prescalerhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-5%3A-Prescaler-de-N-bitshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-4%3A-26-bit-counterhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-4%3A-Contador-de-26-bitshttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-3%3A-NOT-Gate.-Invhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-3%3A-Puerta-NOT.-Invhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-2%3A-From-bit-to-data.-Fporthttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-2%3A-De-un-bit-a-datos.-Fporthttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-1%3A-%C2%A1Hello-world%21-Setbithttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-1%3A-%C2%A1Hola-mundo%21-Setbithttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Chapter-0%3A-you-are-leaving-the-privative-sectorhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-0%3A-you-are-leaving-the-privative-sectorhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Home_ENhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Homehttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki/Cap%C3%ADtulo-1:-%C2%A1Hola-mundo!-Setbit/_historyhttps://github.com/Obijuan/open-fpga-verilog-tutorial/graphshttps://github.com/Obijuan/open-fpga-verilog-tutorial/pulsehttps://github.com/Obijuan/open-fpga-verilog-tutorial/wikihttps://github.com/Obijuan/open-fpga-verilog-tutorial/pullshttps://github.com/Obijuan/open-fpga-verilog-tutorial/issueshttps://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/Obijuanhttps://github.com/Obijuan/open-fpga-verilog-tutorial/networkhttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/stargazershttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/watchershttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorialhttps://help.github.com/https://github.com/bloghttps://github.com/pricinghttps://github.com/login?return_to=%2FObijuan%2Fopen-fpga-verilog-tutorial%2Fwiki%2FCap%25c3%25adtulo-1%3A-%25c2%25a1Hola-mundo%21-Setbithttps://github.com/join?source=header-repohttps://github.com/explorehttps://github.com/businesshttps://github.com/open-sourcehttps://github.com/personalhttps://github.com/

  • 8/17/2019 Capítulo 1 ¡Hola Mundo! Setbit

    2/6

    elementos de un sistema digital.

    El código verilog que implementa este circuito "hola mundo" se encuentra en el fichero setbit.v . Tiene

    esta pinta:

    //-- Fichero setbit.vmodule setbit ( output A);wire A;

    assign A = 1;

    endmodule

    Síntesis en la FPGA Además del fichero en verilog del componente, necesitamos indicar a qué pin de la FPGA queremosconectar la salida A de nuestro componente. Este mapeo se realiza en el fichero setbit.pcf (pcf =Physical Constraint file). Lo sacaremos por el pin 99 que se corresponde con el led D1 de la placaICEStick. Pero podría ser cualquier otro :

    set_io A 99

    Sólo consta de una línea, en la que se asocia la etiqueta A del componente al pin 99 de la FPGA

    En la figura 2 se muestra gráficamente esta idea. Como lo que estamos describiendo es hardware,

    siempre es interesante hacerse esquemas y dibujos para comprenderlo mejor:

    Para hacer la síntesis completa nos vamos al directorio tutorial/T01-setbit y ejecutamos el comandosudo make sint desde la consola:

    $ sudo make sint

    yosys -p "synth_ice40 -blif setbit.blif" setbit.v

    /----------------------------------------------------------------------------\| || yosys -- Yosys Open SYnthesis Suite |

    | || Copyright (C) 2012 - 2015 Clifford Wolf || || Permission to use, copy, modify, and/or distribute this software for any || purpose with or without fee is hereby granted, provided that the above |...

    converted by Web2PDFConvert.com

    http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttps://github.com/Obijuan/open-fpga-verilog-tutorial/blob/master/tutorial/ICESTICK/T01-setbit/setbit.v

  • 8/17/2019 Capítulo 1 ¡Hola Mundo! Setbit

    3/6

    Saldrán muchos más mensajes. En mi portátil tarda en sintetizar menos de 1 segundo . Losmensajes finales que se obtienen son:

    ...After placement:PIOs 1 / 96PLBs 1 / 160BRAMs 0 / 16

    place time 0.00sroute...pass 1, 0 shared.route time 0.00swrite_txt setbit.txt...#-- Generar binario final, listo para descargar en fgpaicepack setbit.txt setbit.bin$

    Al terminar se habrá generado el fichero setbit.bin que es el que cargaremos en la FPGA paraconfigurarla. Introducimos la iCEStick en el USB y ejecutamos este comando:

    $ sudo iceprog setbit.bin

    NOTA: Si tenemos configurada la ICEStick como se indica en el capítulo 0, la carga se puedehacer sin necesidad de usar sudo

    El proceso dura aproximadamente 3 segundos . Los mensajes que aparecen son:

    [sudo] password for obijuan:init..cdone: highreset..cdone: lowflash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x12 0x67 0x21 0x23 0x00 0x21 0x00 0x43file size: 32216erase 64kB sector at 0x000000..programming..reading..VERIFY OKcdone: highBye.$

    El led D1 de la ICEStick se encenderá :

    Nota: Puede que los otros LED se enciendan parcialmente; esto es normal y debido a que no leshemos asignado ninguna señal (internamente están conectados "al aire").

    SimulaciónPrimero simulamos, luego sintetizamosEl ejemplo anterior lo hemos cargado directamente en la FPGA porque el diseño ya ESTABA

    converted by Web2PDFConvert.com

    http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF

  • 8/17/2019 Capítulo 1 ¡Hola Mundo! Setbit

    4/6

    PROBADO PREVIAMENTE. Cuando trabajamos con FPGAs estamos haciendo hardware ytenemos que tener siempre mucho cuidado. Podemos escribir un código que por ejemplo tenga un

    cortocircuito. Y podría ocurrir que las herramientas de síntesis no nos avisen con un warning (sobretodo con estas primeras versiones que todavía están en estado alfa). Si lo cargamos en la FPGA la

    podríamos estropear parcialmente.

    Por ello, SIEMPRE hay que simular el código que hagamos. Y una vez que estamos lo bastanteseguros de que funciona (o que no tiene error gordos) es cuando lo cargamos en la FPGA.

    Probando componentes: banco de trabajoSi compramos un chip y lo queremos probar, ¿Qué hacemos?. Hombre, normalmente lo soldamos

    directamente en el PCB o lo introducimos en un zócalo. Pero también lo podemos pinchar en una

    placa entrendora y colocar nosotros los cables de conexión a la alimentación, señales y resto de

    componentes.

    En verilog (y resto de lenguajes HDL) hacemos lo mismo. Un componente descrito en Veri log (como

    por ejemplo setbi t.v) no se puede simular directamente . Es necesario escribir un banco depruebas que indique qué cables conectar a sus pines, qué valores de prueba enviar y comprobar que por sus salidas salen resultados correctos. Este banco de pruebas es un fichero también en

    Verilog.

    ¿Cómo comprobamos el componente setbit? Se trata de un chip que sólo tiene un pin de salidaque siempre está a '1'. En la vida real lo pondríamos en su placa de puntos, lo alimentaríamos,

    conectaríamos un cable en su pin de salida (A) y usando un polímetro comprobaríamos que sale una

    tensión igual a la de alimentación (un '1'). Haremos exactamente eso, pero describiéndolo en Verilog.

    Gráficamente tendríamos lo siguiente:

    El fichero se llama setbit_tb.v . Siempre usaremos el sufijo _tb para indicar que se trata de unbanco de pruebas (TestBench) y ¡No de hardware real!. Este banco de pruebas NO ESSINTETIZABLE. Es un código que sólo vale para la SIMULACIÓN. Lo que sintetizamos es el

    componente setbit.v. Por eso, a la hora de hacer bancos de pruebas, estamos empleando Verilog nocomo una herramienta de descripción hardware sino como un programa. Aquí sí podemos pensar en Verilog como un lenguaje de programación tradicional .

    El banco de pruebas tiene 3 elementos: el componente setbit, un cable que hemos llamado A y unbloque de comprobación (que sería el equivalente al polímetro en el mundo real). El código es elsiguiente:

    converted by Web2PDFConvert.com

    http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF

  • 8/17/2019 Capítulo 1 ¡Hola Mundo! Setbit

    5/6

    //-- Fichero setbit_tb.v//-- Modulo para el test benchmodule setbit_tb ;

    //-- Cable para conectar al pin de salida de setbit//-- Le podemos dar CUALQUIER nombre. Pero le llamamos A (igual que el pin de setbit)wire A;

    //-- Colocar el componente (se denomina "Instanciar") y//-- Conectar en el pin A el cable Asetbit SB1 ( .A (A));

    //-- Comenzamos las pruebas (bloque de comprobacion)initial begin

    //-- Definir el fichero donde volcar los datos $dumpfile ( "setbit_tb.vcd" );

    //-- Volcar todos los datos a ese fichero (al finalizar la simulacion) $dumpvars ( 0, setbit_tb);

    //-- Pasadas 10 unidades de tiempo comprobamos si el cable está a '1' //-- En caso de no estar a 1, se informa del problema, pero la //-- simulacion no se detiene # 10 if (A != 1) $display ( "---->¡ERROR! Salida no esta a 1" ); else $display ( "Componente ok!" );

    //-- Terminar la simulacion tras 10 unidades de tiempo desde la comprobacion # 10 $finish ;endendmodule

    ¡Simulando!Para simular utilizamos las herramientas Icarus Verilog y GTKwave. Ejecutamos el comando:

    $ make sim

    y automáticamente se nos abrirá una ventana con el resultado de la simulación:

    A un golpe de vista comprobamos que se comporta como esperábamos: la señal del cable A está

    siempre a '1'. Ignoramos las unidades de tiempo que pone, que por defecto está en segundos. Para

    nosotros serán unidades de tiempo. Tras 20 unidades, la simulación termina.

    En la consola veremos que han aparecido los siguientes mensajes:

    converted by Web2PDFConvert.com

    http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDF

  • 8/17/2019 Capítulo 1 ¡Hola Mundo! Setbit

    6/6

    #-- Compilariverilog setbit.v setbit_tb.v -o setbit_tb.out#-- Simular./setbit_tb.outVCD info: dumpfile setbit_tb.vcd opened for output.Componente ok!#-- Ver visualmente la simulacion con gtkwavegtkwave setbit_tb.vcd setbit_tb.gtkw &

    El que pone " Componente ok! " es el que hemos puesto nosotros en el banco de pruebas cuando lasalida estaba a '1'

    Ejercicios propuestosCambiar el componente para que saque un 0. Descargarlo en la FPGA. Comprobar que el LED

    está ahora apagado

    Cambiar el ejemplo original para que se encienda el LED D2 en vez el D1 (está asociado al pin

    98 en vez de al 99)

    ConclusionesHemos creado nuestro primer circuito en verilog , un "hola mundo" formado por 1 cable . Lohemos sintetizado y cargado en la FPGA. También hemos programado un banco de pruebas enverilog para simularlo. Ya tenemos todas las herramientas instaladas, configuradas y hemos

    comprobado que funcionan. Estamos listos para abordar diseños más complejos e ir aprendiendo

    más verilog

    Conceptos introducidos:Conexión de cables son assignCreación de componentes con moduleDefinición de puertos de salida con outputDefinición de un cable con wireBanco de pruebas

    FPGA Libres: [ Wiki] [Repo ]

    Status API Training Shop Blog About© 2016 GitHub, Inc. Terms Privacy Security Contact Help

    http://www.web2pdfconvert.com/?ref=PDFhttp://www.web2pdfconvert.com/?ref=PDFhttps://help.github.com/https://github.com/contacthttps://github.com/securityhttps://github.com/site/privacyhttps://github.com/site/termshttps://github.com/abouthttps://github.com/bloghttps://shop.github.com/https://training.github.com/https://developer.github.com/https://status.github.com/https://github.com/Obijuan/open-fpga-verilog-tutorialhttps://github.com/Obijuan/open-fpga-verilog-tutorial/wiki