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
- Instala Quartus Prime Lite Edition 22.1std.2 y selecciona durante la instalación el soporte para dispositivos MAX 10.
- Conecta el cable USB al puerto micro‑B de la DE10‑Lite rotulado como USB‑Blaster. Alimenta la placa desde ese mismo USB.
- Verifica que el LED de alimentación de la placa enciende.
- En Windows, comprueba en el Administrador de dispositivos que aparece “USB‑Blaster II”. Si hay un triángulo amarillo, instala el driver desde:
- C:\intelFPGA_lite\22.1std\drivers\usb-blaster\ (ruta por defecto)
- En Linux, lista el hardware JTAG:
- Abre una terminal y ejecuta:
quartus_pgm -l - 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
- Abre Quartus Prime Lite 22.1std.2.
- File → New Project Wizard:
- Working directory: elige una ruta sin espacios, por ejemplo:
- Windows: C:\fpga\de10lite_adc_bar\
- Linux: ~/fpga/de10lite_adc_bar/
- Project name: de10lite_adc_bar
- Top-level entity: top_adc_ledbar
- Family and Device Settings:
- Family: MAX 10
- Device: 10M50DAF484C7G
- Finaliza el asistente.
Crear el sistema Qsys (Platform Designer)
- Tools → Platform Designer (Qsys).
- New System:
- Guarda el archivo como: adc_system.qsys dentro de tu carpeta del proyecto (por ejemplo, ./ip/adc_system.qsys).
- Añadir componentes:
- 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).
- 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.
- Conexiones en Platform Designer:
- 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.
- 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.
- 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.
- Exporta interfaces a nivel superior del sistema:
- 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)
- Guarda el sistema (adc_system.qsys).
- Genera HDL:
- En Platform Designer: “Generate HDL…” → Verilog
- Output directory: ./ip/adc_system/synthesis/
- Click “Generate”.
- 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
- Añade al proyecto:
- Project → Add/Remove Files in Project…
- 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)
- Verifica que el archivo .qip del Qsys (adc_system.qip) esté incluido, pues arrastra el resto.
- Top-level entity:
- 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)
- Lista dispositivos para confirmar el programador:
quartus_pgm -l
- 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.
- Convertir .sof → .pof:
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"
- 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.
- Tras programar con .sof:
- Observa que uno o más LED se encienden.
- Si todos están apagados: gira el potenciómetro lentamente en un extremo a otro.
- Gira el potenciómetro completamente hacia un extremo:
- Esperado: 0–1 LED encendidos.
- Gira al extremo opuesto:
- Esperado: ~10 LED encendidos (todos ON).
- Posiciones intermedias:
- Esperado: el número de LED encendidos cambia suavemente conforme aumente/disminuya el valor del potenciómetro.
- Estabilidad:
- 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”).
- Frecuencia de actualización:
- 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_bartermina 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
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.



