You dont have javascript enabled! Please enable it!

Caso práctico: ADC de potenciómetro a barra LEDs DE10-Lite

Caso práctico: ADC de potenciómetro a barra LEDs DE10-Lite — hero

Objetivo y caso de uso

Qué construirás: Leer un potenciómetro utilizando el ADC del Intel MAX 10 y visualizar los valores en una barra de LEDs en la DE10-Lite.

Para qué sirve

  • Monitoreo de niveles de voltaje en aplicaciones de control de iluminación.
  • Interfaz de usuario para ajustar parámetros en sistemas embebidos.
  • Visualización de datos analógicos en proyectos de robótica.

Resultado esperado

  • Lectura del potenciómetro con una precisión de 10 bits.
  • Actualización de la barra de LEDs en tiempo real con latencias menores a 50 ms.
  • Capacidad de mostrar hasta 10 niveles de voltaje diferentes en la barra de LEDs.

Público objetivo: Estudiantes y entusiastas de la electrónica; Nivel: Básico

Arquitectura/flujo: ADC del Intel MAX 10 -> Procesamiento en FPGA -> Visualización en LEDs de la DE10-Lite.

Nivel: Básico

Prerrequisitos

  • Sistema operativo (uno de los siguientes):
  • Windows 10/11 64‑bit (recomendado para principiantes)
  • Ubuntu 20.04 LTS 64‑bit (funciona bien con CLI)
  • Toolchain (versiones exactas y coherentes con MAX 10):
  • Intel Quartus Prime Lite Edition 22.1std.2 (Build 922 12/07/2022)
  • Platform Designer (incluido en Quartus Prime Lite 22.1std.2)
  • Intel FPGA Programmer (quartus_pgm) 22.1std.2
  • ModelSim‑Intel FPGA Starter Edition 22.1 (opcional, solo si quieres simular)
  • Controlador del programador:
  • USB‑Blaster II Driver 22.1 (Windows; en Linux no requiere driver adicional si se configura udev)
  • Permisos/entorno:
  • En Linux, tu usuario debe pertenecer al grupo plugdev (o configurar reglas udev para USB‑Blaster).
  • Espacio en disco: > 10 GB libres.

Materiales

  • 1 × Placa de desarrollo DE10‑Lite (Intel MAX 10), dispositivo: 10M50DAF484C7G
  • 1 × Cable USB micro‑B (para el puerto USB‑Blaster integrado de la DE10‑Lite)
  • 1 × PC con Quartus Prime Lite 22.1std.2 instalado
  • Opcional:
  • 1 × Multímetro para comprobar 5 V/3.3 V de alimentación de placa (validación de entorno)
  • 1 × Regla o cinta para marcar posiciones del potenciómetro si quieres reproducibilidad de lectura

Observación importante:
– La DE10‑Lite integra un potenciómetro analógico conectado al ADC interno del MAX 10 (12 bits). Nuestra tarea es leer ese valor y representarlo como una “barra” de 10 LED (LEDR[9:0]).

Preparación y conexión

Pasos previos

  1. Instala Quartus Prime Lite Edition 22.1std.2 y selecciona durante la instalación el soporte para dispositivos MAX 10.
  2. Conecta el cable USB al puerto micro‑B de la DE10‑Lite rotulado como USB‑Blaster. Alimenta la placa desde ese mismo USB.
  3. Verifica que el LED de alimentación de la placa enciende.
  4. En Windows, comprueba en el Administrador de dispositivos que aparece “USB‑Blaster II”. Si hay un triángulo amarillo, instala el driver desde:
  5. C:\intelFPGA_lite\22.1std\drivers\usb-blaster\ (ruta por defecto)
  6. En Linux, lista el hardware JTAG:
  7. Abre una terminal y ejecuta: quartus_pgm -l
  8. Debe aparecer algo como “USB‑Blaster [USB‑0]”.

Recursos de la placa a utilizar

Para este caso práctico, usaremos:
– Reloj de 50 MHz principal de la placa (clock base)
– ADC interno del MAX 10 a través del IP “Modular ADC” de Intel, con el potenciómetro en un canal analógico
– 10 LED de usuario (LEDR[9:0])

A fin de evitar errores de asignación de pines, importaremos las asignaciones oficiales del fabricante (Terasic), incluidas en su System CD.

Tabla de resumen de señales del diseño

Señal top-level Dirección Función Recurso de placa
CLOCK_50 Input Reloj base de 50 MHz Oscilador on‑board
LEDR[9:0] Output Barra de 10 LED (0 = bajo, 9 = alto) 10 LED de usuario
reset_n Input Reset activo en bajo (interno fijo 1) No se usa físicamente
sample_data Interna Muestra ADC (12 bits) ADC interno MAX 10
sample_valid Interna Pulso de dato válido del ADC ADC interno MAX 10

Nota sobre el canal del potenciómetro:
– En revisiones habituales de la DE10‑Lite, el potenciómetro está cableado a uno de los canales single‑ended del ADC (p. ej., CH4). Sin embargo, es muy recomendable validar el canal en tu placa/revisión. En este tutorial configuraremos el “Modular ADC” con el “Sequencer” en modo free‑run sobre 1 canal (CH4) y te indicaremos cómo cambiarlo si tu revisión usa otro canal.

Código completo (Verilog) y arquitectura del proyecto

Usaremos Verilog (subset conciso) y un pequeño sistema de Platform Designer que encapsula:
– Un PLL para generar el reloj del ADC (p. ej., 10 MHz desde los 50 MHz)
– El IP “Modular ADC” con el secuenciador habilitado en free‑run en 1 canal
– Una interfaz de streaming (Avalon‑ST) con datos de 12 bits y pulso “valid”

En el tope del diseño:
– Recibiremos sample_valid + sample_data[11:0].
– Implementaremos un “bargraph” en LEDR[9:0] donde el número de LED encendidos es proporcional al valor ADC (0…FS).

Módulo top (top_adc_ledbar.v)

// top_adc_ledbar.v
// Proyecto: adc-potentiometer-to-leds-bargraph en DE10-Lite (Intel MAX 10)
// Toolchain: Quartus Prime Lite 22.1std.2
// Dispositivo: 10M50DAF484C7G

module top_adc_ledbar (
    input  wire        CLOCK_50,   // 50 MHz board clock
    output wire [9:0]  LEDR        // 10 user LEDs
);

    // Reset interno (no usamos botón; diseño simple)
    wire reset_n = 1'b1;

    // Señales desde el subsistema ADC (generado en Platform Designer)
    wire        adc_sample_valid;
    wire [11:0] adc_sample_data;

    // Instancia del subsistema ADC (envoltura del Qsys/Platform Designer)
    // Asegúrate de que los nombres de puertos coincidan con los generados.
    adc_subsystem u_adc_subsystem (
        .clk_50          (CLOCK_50),
        .reset_n         (reset_n),
        .sample_valid    (adc_sample_valid),
        .sample_data     (adc_sample_data)
    );

    // Registro para la barra de LED
    reg [9:0] led_bar;

    // Mapeo final a pines de salida
    assign LEDR = led_bar;

    // Lógica: convertir sample_data (12 bits) en una barra de 10 LED
    // Método simple:
    // - Tomamos los 4 MSB (bits 11..8) para una resolución de 0..15 "niveles".
    // - Saturamos a 10.
    // - Encendemos 'nivel' LEDs desde LEDR[0] hacia arriba.
    integer k;
    reg [3:0] level;

    always @(posedge CLOCK_50) begin
        if (adc_sample_valid) begin
            level = adc_sample_data[11:8];  // 0..15
            if (level > 4'd10)
                level = 4'd10;

            // Construcción de la barra
            led_bar = 10'b0000000000;
            for (k = 0; k < 10; k = k + 1) begin
                if (k < level)
                    led_bar[k] = 1'b1;
            end
        end
    end

endmodule

Envoltura del subsistema ADC (adc_subsystem.v)

Esta envoltura es un cascarón del sistema generado en Platform Designer (que llamaremos “adc_system”). El propósito es exponer un interfaz claro: clk_50, reset_n, sample_valid y sample_data.

// adc_subsystem.v
// Envoltura de Platform Designer para el ADC del MAX 10 con PLL

module adc_subsystem (
    input  wire        clk_50,
    input  wire        reset_n,
    output wire        sample_valid,
    output wire [11:0] sample_data
);

    // Instancia del sistema generado por Platform Designer (Qsys)
    // Ajusta los nombres de puerto de acuerdo a tu generación concreta.
    // Recomendación: en Platform Designer, exporta el stream como:
    //   - sample_stream_valid
    //   - sample_stream_data[11:0]
    // y el clock/reset como:
    //   - clk_clk
    //   - reset_reset_n
    //
    // Si tus nombres difieren, cambia el mapeo aquí.

    adc_system u_adc_system (
        .clk_clk                     (clk_50),
        .reset_reset_n               (reset_n),
        .sample_stream_valid         (sample_valid),
        .sample_stream_data          (sample_data)
        // Notas:
        // - El PLL de ADC y señales de lock se quedan internas del Qsys.
        // - No exportes las entradas analógicas: son internas al MAX 10.
    );

endmodule

Explicación breve de las partes clave:
– adc_subsystem encapsula todo el detalle del ADC: PLL a ~10 MHz, IP Modular ADC en modo sequencer free‑run de 1 canal (potenciómetro), y produce un flujo de muestras 12‑bit con pulso de “valid”.
– top_adc_ledbar recibe ese flujo y en cada muestra válida actualiza el patrón de 10 LED como una barra proporcional. Se usa un método muy liviano en recursos: capturar 4 bits MSB para 0..15 niveles, saturar a 10 y formar una máscara con un bucle for sintetizable.

Construcción del IP ADC con Platform Designer (22.1std.2)

A continuación, detallo los pasos para crear el sistema “adc_system” con el IP de ADC del MAX 10. No dibujaremos un diagrama; seguiremos pasos textuales precisos.

Crear el proyecto Quartus

  1. Abre Quartus Prime Lite 22.1std.2.
  2. File → New Project Wizard:
  3. Working directory: elige una ruta sin espacios, por ejemplo:
    • Windows: C:\fpga\de10lite_adc_bar\
    • Linux: ~/fpga/de10lite_adc_bar/
  4. Project name: de10lite_adc_bar
  5. Top-level entity: top_adc_ledbar
  6. Family and Device Settings:
  7. Family: MAX 10
  8. Device: 10M50DAF484C7G
  9. Finaliza el asistente.

Crear el sistema Qsys (Platform Designer)

  1. Tools → Platform Designer (Qsys).
  2. New System:
  3. Guarda el archivo como: adc_system.qsys dentro de tu carpeta del proyecto (por ejemplo, ./ip/adc_system.qsys).
  4. Añadir componentes:
  5. Click: “+” → Basic Functions → Clocks and PLLs → ALTPLL (o “Clocking and PLLs” según idioma)
    • Nombre de instancia: adc_pll
    • Entradas: inclk0 a 50 MHz
    • Salida c0: 10 MHz (frecuencias típicas admisibles por el ADC; 10 MHz es una elección segura)
    • Asegúrate de que la salida c0 sea “Exported” como “adc_pll_c0” (o déjala interna si la UI del Modular ADC permite seleccionar el clock interno del PLL).
  6. Click: “+” → Analog → Modular ADC (altera_modular_adc)
    • Nombre de instancia: modular_adc_0
    • Parámetros:
    • Device family: MAX 10
    • Mode: Single ADC
    • Sequencer: Enabled
      • Mode: Continuous (free‑run)
      • Channels: marca un canal single‑ended. Recomendación: CH4 (potenciómetro en revisiones comunes). Si tu placa es distinta, podrás cambiar esto después.
    • Streaming output: Enable Avalon‑ST output (sample data)
    • Sample resolution: 12 bits (por defecto para MAX 10)
    • Clocking:
      • ADC clock source: “External PLL” (selecciona la salida c0 del adc_pll)
    • Reset: habilita reset input.
  7. Conexiones en Platform Designer:
  8. Conecta “adc_pll”:
    • Conecta adc_pll.inclk0 a “clk_50” (que crearemos como fuente de clock externa).
    • Conecta modular_adc_0.adc_pll_clock a adc_pll.c0 (10 MHz).
    • Conecta modular_adc_0.adc_pll_locked al adc_pll.locked.
  9. Clock y reset del sistema Qsys:
    • Añade un “Clock Source” (o exporta el clock) y conéctalo al clock de sistema de modular_adc_0 si la interfaz lo requiere. En muchas plantillas, modular_adc_0 tiene “clock” (p. ej., clk) y “reset” (reset_n) para el bus/stream: usa el clock de 50 MHz (“clk_50”) para lógica, y el 10 MHz del PLL solo para el ADC.
  10. Salida de datos:
    • Exporta el stream de datos del ADC:
    • modular_adc_0.sample_stream.valid → exporta como sample_stream_valid
    • modular_adc_0.sample_stream.data[11:0] → exporta como sample_stream_data
    • Si la interfaz tiene “ready”, desactiva back‑pressure (o amarra a 1) según parámetro del IP para simplificar.
  11. Exporta interfaces a nivel superior del sistema:
  12. Exporta:
    • clk_clk (50 MHz de la placa): crea un “Clock source” y márcalo como export, nombre: clk_clk
    • reset_reset_n: crea un reset input y márcalo como export, nombre: reset_reset_n
    • sample_stream_valid (salida)
    • sample_stream_data[11:0] (salida)
  13. Guarda el sistema (adc_system.qsys).
  14. Genera HDL:
  15. En Platform Designer: “Generate HDL…” → Verilog
  16. Output directory: ./ip/adc_system/synthesis/
  17. Click “Generate”.
  18. Asegúrate de que no haya errores.

Notas prácticas:
– Si no estás seguro del canal del potenciómetro, habilita temporalmente 2 o 3 canales single‑ended (p. ej., CH3, CH4, CH5). Luego, en tu lógica podrías multiplexar/comprobar cuál cambia al mover el potenciómetro y quedarte con ese. Para este caso, supondremos CH4.

Añadir archivos al proyecto y top-level

  1. Añade al proyecto:
  2. Project → Add/Remove Files in Project…
  3. Añade:
    • ./top_adc_ledbar.v
    • ./adc_subsystem.v
    • Todos los archivos generados del Qsys ubicados en ./ip/adc_system/synthesis/ (Quartus los gestionará al añadir el .qip principal)
  4. Verifica que el archivo .qip del Qsys (adc_system.qip) esté incluido, pues arrastra el resto.
  5. Top-level entity:
  6. Assignments → Settings → General → Top-level entity → top_adc_ledbar

Asignación de pines (importar de Terasic)

Para no equivocarnos, importaremos las asignaciones oficiales del System CD de Terasic.

Pasos:
1. Descarga el “DE10-Lite System CD” desde el sitio de Terasic (busca “DE10-Lite” → “Resources” → “System CD”).
2. Descomprime y localiza un proyecto de referencia (p. ej., “DE10_Lite_Default/DE10_Lite_Default.qsf”).
3. En tu proyecto:
– Assignments → Import Assignments…
– Selecciona el archivo .qsf de referencia (DE10_Lite_Default.qsf).
– Importa.
4. Verifica en Pin Planner que:
– CLOCK_50 esté asignado correctamente al pin del oscilador de 50 MHz.
– LEDR[9:0] estén asignados a los 10 LED de usuario.

Si tu proyecto usa nombres de señales distintos a los del proyecto de Terasic, crea asignaciones manualmente o renombra tus puertos para coincidir. Una práctica común es usar exactamente:
– CLOCK_50 para el reloj (input)
– LEDR[9:0] para los 10 LED (output)

Compilación, programación (flash) y ejecución

A continuación, todos los comandos CLI exactos usando Quartus Prime Lite 22.1std.2. Puedes usarlos en Windows (PowerShell/CMD) o Linux (bash). Ajusta rutas.

Preparar estructura de carpetas (opcional)

  • Windows:
  • C:\fpga\de10lite_adc_bar\
  • Linux:
  • ~/fpga/de10lite_adc_bar/

Asegúrate de colocar top_adc_ledbar.v, adc_subsystem.v y los generados del Qsys dentro del proyecto. Si usaste la GUI para crear el proyecto, ya tendrás los .qsf, .qpf y referencias a .qip.

Compilar (synth → fit → asm)

  • Comando único:
quartus_sh --flow compile de10lite_adc_bar
  • Si tienes varias revisiones o quieres especificar la “Revision” (coincide con el nombre del .qpf/.qsf si difieren), usa:
quartus_sh --flow compile de10lite_adc_bar -c de10lite_adc_bar

Resultado esperado:
– output_files/de10lite_adc_bar.sof (bitstream para JTAG/SRAM)

Programar por JTAG (cargar .sof a SRAM)

  1. Lista dispositivos para confirmar el programador:
quartus_pgm -l
  1. Programa:
quartus_pgm -m jtag -o "p;output_files/de10lite_adc_bar.sof"

Notas:
– Este método carga la configuración en SRAM (volátil). Si apagas la placa, se borra. Para hacerla persistente, crea y programa un .pof (ver opcional).

Programar en la Flash interna (opcional, persistente)

MAX 10 permite programar un .pof para que el diseño arranque al encender.

  1. Convertir .sof → .pof:
quartus_cpf -c output_files/de10lite_adc_bar.sof output_files/de10lite_adc_bar.pof
  1. Programar .pof:
quartus_pgm -m jtag -o "p;output_files/de10lite_adc_bar.pof"
  1. Reinicia la placa (o power cycle). El diseño debería cargar automáticamente desde la flash.

Validación paso a paso

Objetivo: Confirmar que la barra de LED sigue proporcionalmente el potenciómetro.

  1. Tras programar con .sof:
  2. Observa que uno o más LED se encienden.
  3. Si todos están apagados: gira el potenciómetro lentamente en un extremo a otro.
  4. Gira el potenciómetro completamente hacia un extremo:
  5. Esperado: 0–1 LED encendidos.
  6. Gira al extremo opuesto:
  7. Esperado: ~10 LED encendidos (todos ON).
  8. Posiciones intermedias:
  9. Esperado: el número de LED encendidos cambia suavemente conforme aumente/disminuya el valor del potenciómetro.
  10. Estabilidad:
  11. Es normal un leve parpadeo de transición; el código actual actualiza en cada muestra. Si ves parpadeos grandes, ajusta el contacto del potenciómetro o añade filtrado (ver “Mejoras”).
  12. Frecuencia de actualización:
  13. El Modular ADC en free‑run produce muestras a una tasa determinada por su configuración/clock. Verás cambios en los LED casi instantáneos al mover la perilla.

Verificaciones adicionales (opcionales):
– Si habilitaste varios canales en el sequencer:
– Observa cuál responde claramente al movimiento del potenciómetro y reconfigura el IP para dejar solo ese canal.
– Si ModelSim está instalado:
– Podrías simular la lógica del bargraph inyectando valores sintéticos en sample_data y observar led_bar en forma de escalera.

Troubleshooting (5–8 problemas típicos y solución)

1) No aparece el USB‑Blaster en la lista
– Síntoma:
quartus_pgm -l no muestra el programador.
– Causas:
– Driver no instalado (Windows), cable defectuoso, puerto USB con poca corriente, conflictos de permisos (Linux).
– Solución:
– Windows: instala el driver desde C:\intelFPGA_lite\22.1std\drivers\usb-blaster\
– Linux: ejecuta como usuario con permisos o configura reglas udev (consulta la guía de Intel); prueba otro puerto/cable USB.

2) Quartus no encuentra el dispositivo o falla el JTAG
– Síntoma:
– Error al programar “No device detected” o cadena JTAG vacía.
– Causas:
– Placa sin alimentación, conector USB flojo, interferencia de otro software JTAG, switch de modo incorrecto (si existiera).
– Solución:
– Verifica LED de power. Revisa el cable. Cierra otros programas que usen USB‑Blaster. Reinicia la placa y el PC si es necesario.

3) La compilación falla por falta de archivos del Qsys/IP
– Síntoma:
– Errores tipo “Cannot find file adc_system.qip” o módulos no definidos.
– Causas:
– No añadiste el .qip del sistema o no generaste HDL desde Platform Designer.
– Solución:
– En Platform Designer, “Generate HDL” (Verilog). Luego, Project → Add/Remove Files… y añade adc_system.qip ubicado en ip/adc_system/synthesis/.

4) Los LED no se mueven al girar el potenciómetro
– Síntoma:
– LED estáticos (siempre la misma cantidad), o 0/10 fijos.
– Causas:
– Canal ADC equivocado en el secuenciador, reset en estado activo, PLL no bloquea, sample_valid nunca se activa, falta de clock.
– Solución:
– En Platform Designer, habilita otros canales (p. ej., CH3/CH4/CH5) para probar y detectar el correcto.
– Revisa conexiones del PLL: adc_pll.locked → modular_adc.adc_pll_locked.
– Asegúrate de que clk del sistema (50 MHz) está conectado y exportado como clk_clk.
– Revisa que sample_stream esté exportado y mapeado a adc_subsystem.

5) El patrón de LED parece “inestable” o parpadea mucho
– Síntoma:
– Cambios bruscos de LED sin mover el potenciómetro.
– Causas:
– Ruido analógico normal del ADC, sumado a cuantización y falta de filtrado.
– Solución:
– Implementa una media móvil (moving average) o histéresis en el valor antes de calcular la barra (ver sección “Mejoras”).

6) Error de licencia al agregar el IP de ADC
– Síntoma:
– Mensaje indicando requerimiento de licencia para el IP.
– Causas:
– Plataforma o versión incorrecta, o componente no disponible en Lite (inusual para MAX 10 Modular ADC; debería estar permitido).
– Solución:
– Verifica que instalaste Quartus Prime Lite 22.1std.2 con soporte para MAX 10. Si persiste, reinstala o crea un proyecto nuevo limpio.

7) Pin Planner muestra conflictos o pines sin asignar
– Síntoma:
– Warnings/Errores sobre pines no asignados (CLOCK_50, LEDR).
– Causas:
– No importaste el .qsf de referencia de Terasic, o los nombres difieren.
– Solución:
– Importa el .qsf del proyecto de referencia o crea asignaciones manuales; preferible usar nombres estándar: CLOCK_50 y LEDR[9:0].

8) Tiempos no cumplidos (timing) tras añadir lógica extra
– Síntoma:
– Fitter OK pero con Timing Fail.
– Causas:
– Constrains faltantes, mal uso de relojes, exceso de lógica en un solo ciclo.
– Solución:
– Asegura la restricción del reloj de 50 MHz en el .sdc (Quartus suele generarla). Divide lógica, registra comparadores, o baja la tasa del ADC si innecesario.

Mejoras/variantes

  • Filtrado digital (moving average):
  • Implementa una media móvil de N muestras (p. ej., N=16) antes de calcular la barra. Esto reduce el ruido percibido en los LED.
  • Histéresis en niveles:
  • Evita parpadeos entre umbrales aplicando histéresis (subir el nivel con umbral alto, bajarlo con umbral bajo).
  • Escala logarítmica:
  • Para sensores no lineales, mapea el valor ADC con una curva log o gamma para más resolución en zonas de interés.
  • Índice y barra:
  • Mostrar en los 7 segmentos (HEX displays) el valor decimal/hex del ADC mientras la barra indica la intensidad.
  • Promedio por bloque:
  • Acumula 64 muestras y actualiza LED solo 15–20 veces por segundo; ilumina más “suave”.
  • Selección de canal por DIP switch:
  • Conecta SW[1:0] para elegir entre 4 canales del ADC (si has habilitado varios en el secuenciador).
  • Persistencia en flash:
  • Convierte y programa .pof para que el demo inicie siempre al energizar (ya mostrado).

Ejemplo rápido de filtrado (suma y desplazamiento) que puedes insertar en top_adc_ledbar:

  • Sustituye la captura directa por un acumulador de 16 muestras:
  • Usa un sumador de 16 muestras y luego desplaza 4 bits a la derecha (divide por 16).
  • Simplifica: evita divisores caros en hardware.

Pseudo‑código Verilog (ideas, no el bloque completo):
– Usa un contador de 0..15, un acumulador de 16 bits, y cada 16 valid actualiza ‘avg_sample’.

Checklist de verificación

  • [ ] He instalado Intel Quartus Prime Lite 22.1std.2 (Build 922 12/07/2022) con soporte MAX 10.
  • [ ] Conecto DE10‑Lite por USB micro‑B y veo “USB‑Blaster II” con quartus_pgm -l.
  • [ ] He creado el proyecto para el dispositivo 10M50DAF484C7G.
  • [ ] He generado el sistema adc_system en Platform Designer:
  • [ ] PLL a ~10 MHz para el ADC.
  • [ ] Modular ADC con Sequencer en free‑run en 1 canal (CH4 o el que corresponda a mi placa).
  • [ ] Exporté sample_stream_valid y sample_stream_data[11:0].
  • [ ] Exporté clk_clk (50 MHz) y reset_reset_n.
  • [ ] He incluido en el proyecto el .qip del sistema (adc_system.qip) y mis fuentes Verilog.
  • [ ] He importado las asignaciones de pines del .qsf de referencia de Terasic o las he configurado manualmente (CLOCK_50, LEDR[9:0]).
  • [ ] La compilación con quartus_sh --flow compile de10lite_adc_bar termina sin errores.
  • [ ] Programo con quartus_pgm -m jtag -o "p;output_files/de10lite_adc_bar.sof".
  • [ ] Girando el potenciómetro, la barra de LED (LEDR[9:0]) responde (más LED conforme aumento el valor).
  • [ ] (Opcional) Convertí a .pof y programé la flash para arranque automático.

Apéndice: comandos útiles (referencia rápida)

  • Listar programadores:
quartus_pgm -l
  • Compilar (síntesis/emplazamiento/ensamblado):
quartus_sh --flow compile de10lite_adc_bar
  • Programar .sof:
quartus_pgm -m jtag -o "p;output_files/de10lite_adc_bar.sof"
  • Generar .pof desde .sof:
quartus_cpf -c output_files/de10lite_adc_bar.sof output_files/de10lite_adc_bar.pof
  • Programar .pof:
quartus_pgm -m jtag -o "p;output_files/de10lite_adc_bar.pof"

Notas finales de coherencia con el hardware

  • Este caso práctico está diseñado específicamente para la DE10‑Lite (Intel MAX 10 10M50DAF484C7G) y utiliza la toolchain Intel Quartus Prime Lite 22.1std.2, con Platform Designer para el IP del ADC.
  • La selección del canal del potenciómetro se realiza en el IP “Modular ADC”. En la mayoría de revisiones de DE10‑Lite, el potenciómetro está en un canal single‑ended típico (frecuente: CH4). Si tu System CD o manual indica un canal distinto, simplemente cambia el canal habilitado en el “Sequencer” y recompila.
  • No es necesario asignar pines para el ADC, ya que los canales analógicos del MAX 10 son recursos internos. Sí es imprescindible tener correctamente asignados CLOCK_50 y LEDR[9:0] (importando el .qsf de Terasic evitas errores).

Con esto, dispones de un flujo completo y reproducible para llevar la lectura del potenciómetro analógico al bargraph de 10 LED en la DE10‑Lite, con pasos claros de configuración, código conciso en Verilog, compilación y programación JTAG, más comprobaciones y mejoras posibles.

Encuentra este producto y/o libros sobre este tema en Amazon

Ir a Amazon

Como afiliado de Amazon, gano con las compras que cumplan los requisitos. Si compras a través de este enlace, ayudas a mantener este proyecto.

Quiz rápido

Pregunta 1: ¿Cuál es el sistema operativo recomendado para principiantes según el artículo?




Pregunta 2: ¿Qué versión de Intel Quartus Prime Lite Edition se menciona en el artículo?




Pregunta 3: ¿Qué dispositivo se utiliza en el artículo para la práctica?




Pregunta 4: ¿Qué tipo de cable se necesita para conectar la DE10-Lite?




Pregunta 5: ¿Qué herramienta es opcional para simular según el artículo?




Pregunta 6: ¿Qué espacio en disco se recomienda tener libre?




Pregunta 7: ¿Qué se debe verificar en la placa DE10-Lite después de conectarla?




Pregunta 8: ¿Qué grupo debe pertenecer el usuario en Linux para usar el USB-Blaster?




Pregunta 9: ¿Cuál es el propósito de la tarea mencionada en el artículo?




Pregunta 10: ¿Qué tipo de controlador se necesita para el programador USB-Blaster II en Windows?




Carlos Núñez Zorrilla
Carlos Núñez Zorrilla
Electronics & Computer Engineer

Ingeniero Superior en Electrónica de Telecomunicaciones e Ingeniero en Informática (titulaciones oficiales en España).

Sígueme:
Scroll al inicio