Captura de pulsos (modulación amplia) de FPGA

Me gusta pensar que hay cuatro formas diferentes en que las personas usan FPGA:

  • Use la FPGA como una CPU que le permite agregar bloques de E / S predefinidos
  • Cree dispositivos laterales personalizados para una CPU externa de bloques de E / S predefinidos
  • Construya circuitos lógicos personalizados desde cero
  • Proyectos que no necesitan una FPGA, pero le ayudan a aprender
  • Apostaría a que la mayoría del uso de FPGA pertenece a las categorías uno y dos. Algunas FPGA incluso tienen procesadores ya integrados. Incluso sin una CPU incorporada, normalmente puede colocar un "núcleo" de CPU (piense en una biblioteca reutilizable) en el chip. De cualquier manera, siempre puede agregar otros núcleos para crear UART, USB, Ethernet, PWM o cualquier otra E / S que necesite. Puede conectarlos a una CPU en el chip o a una externa. Con las herramientas actuales, a menudo eliges lo que quieres de una lista y luego todo tu proyecto se convierte en un esfuerzo de software.

    El tercer estilo cumple con un diseño lógico. Puede que esté utilizando algunos núcleos, pero no tiene ningún procesador. Configura la FPGA para ejecutar exactamente las funciones lógicas que necesita. Por supuesto, si crea una CPU personalizada, mezclará todos estos estilos en varios puntos de desarrollo. Otros desarrolladores pueden construir sistemas que incluyen CPU en FPGA, algunos núcleos personalizados y algún desarrollo lógico completo, por lo que las líneas pueden difuminarse de manera efectiva.

    Ignoraré el cuarto estilo. Es una buena práctica hacer que una máquina de estado de semáforo o un LED parpadee en FPGA. Sin embargo, en la práctica, también podría usar un Arduino u otro microcontrolador para hacer esto.

    ¿Por qué utilizar FPGA?

    Con los dos primeros estilos, la razón para usar FPGA es clara: aquellos desarrolladores solo quieren mezclar y combinar kernels prediseñados. Al igual que construir cosas con ladrillos de Lego, puede que no resulte en una estructura óptima, pero puede hacer mucho con poco esfuerzo. Las desventajas son en su mayoría costosas y, a menudo, consumen energía, según el dispositivo.

    Las razones por las que usa FPGA para hacer un proyecto de lógica "pura" son las mismas razones por las que desarrolla usando lógica discreta. Los FPGA pueden implementar una lógica muy rápida. Cuando una CPU tiene que seguir muchas instrucciones para hacer cosas, la FPGA solo tiene una lógica dedicada para hacer todo lo que necesita, a menudo en un ciclo de reloj.

    Además, la mayoría de las operaciones en FPGA funcionan en paralelo. Digamos que construye un bloque PWM y lo coloca en la FPGA (algo que haremos a continuación). Si decide que necesita dos bloques PWM, funcionarán igual de rápido. Si necesita 20 bloques PWM, también funcionarán tan rápido como un bloque.

    La capacidad de FPGA para operar rápidamente y en paralelo lo convierte en una excelente opción para el procesamiento paralelo y el procesamiento de señales de alta velocidad. Hay algunas otras pequeñas razones por las que los diseñadores a veces usan FPGA, como la disponibilidad de piezas endurecidas por radio, pero la velocidad y el paralelismo suelen ser los impulsores.

    Proyecto

    A principios de este año, les mostré cómo construir un proyecto simple usando Lattice iCEStick y herramientas de código abierto. (El iCEStick aparece a la derecha.) Desde entonces quiero volver y hacer algo más práctico. Esta vez tomaré un núcleo UART de GitHub y lo usaré para hablar con la computadora a través del puerto USB del iCEStick. Luego, construiré un bloque PWM personalizado desde cero y crearé un periférico PWM de computadora. En el camino, verá algunos matices de veracidad como parámetros y obtendrá un poco más de experiencia práctica utilizando núcleos existentes y trabajando con bancos de prueba. Luego, agregaremos varias salidas PWM rápidamente creando más instancias del bloque PWM.

    Comunicaciones de UART

    Por mucho que disfruto construyendo todo desde cero, también sé que puedo tomar algunos edificios comunes para facilitar las cosas. A veces reutilizo mi propio código y hay otros lugares para buscar, que incluyen:

    • El sitio web del proveedor de FPGA
    • Núcleos abiertos
    • GitHub
    • Internet en general
    • En este caso, sabía que el puerto USB de iCEStick podría funcionar como un puerto serie en la computadora, y una búsqueda rápida encontró este repositorio de GitHub. El UART es un sobre delgado alrededor de un UART de código abierto que reside en OpenCores.

      Tengo mi propio código UART, así que si no fuera por el contenedor específico de iCEStick, probablemente lo usaría. Sin embargo, era demasiado fácil descargar el UART listo. Hay un inconveniente: el proyecto incluye el UART de código libre a continuación como un subproyecto. Si descarga el archivo ZIP de GitHub, ese subproyecto será una carpeta vacía que deberá completar por separado. Si está clonando el proyecto, debe inicializar el subproyecto de la siguiente manera: git submodule update --init

      El proyecto incluye un sencillo tester que eoesas personajes. Siempre es una buena idea asegurarse de que el código prestado funcione antes de comenzar a agregarle cosas, por lo que la primera tarea es descargar el proyecto de prueba en iCEStick y ejecutarlo. De hecho, para este proyecto simple, comenzaré con el código de prueba como un esqueleto para el proyecto terminado.

      Si necesita una actualización de Ice Storm (las herramientas de código abierto para iCEStick), puede consultar mi publicación anterior. El repositorio tiene un Makefile que le permitirá simplemente lanzar un make para construir el proyecto. Si escribe make flash a la línea de comando, el archivo MAKE construirá el proyecto si es necesario y lo programará en la FPGA. Asegúrese de que la FPGA esté conectada a un puerto USB.

      La FPGA aparecerá como un puerto serie - / dev / ttyUSBx en Linux. Para hablar con la FPGA, deberá conectar un programa de terminal a ese puerto. Para este paso, cualquier programa final sería bueno (por ejemplo, minikom, pikokom o mastic). Sin embargo, cuando el bloque PWM funciona, desea un terminal que maneje fácilmente el código hexadecimal en lugar de los caracteres ASCII. Hay muchas opciones, pero sugiero Cutecom, que debería estar en su repositorio de aplicaciones (o descargarlo de su página de inicio).

      Una vez que tenga el puerto abierto a 9600 baudios, debe escribir caracteres y verlos salir. La uart_demo.v El archivo produce el eoon a través de una instancia del kernel UART:

always @(posedge iCE_CLK) begin
    if (received) begin
        tx_byte <= rx_byte;
        transmit <= 1;
    end else begin
        transmit <= 0;
    end

Solo por diversión, convierta minúsculas a mayúsculas:

always @(posedge iCE_CLK) begin
    if (received) begin
        if (rx_byte >= 8'h61 && rx_byte <= 8'h7a)
            tx_byte <= rx_byte & 8'hDF;
        else begin
            tx_byte <= rx_byte;
            transmit <= 1;
        end 
    else begin // else goes with if (received)
            transmit <= 0; 
    end

Hay muchas formas de escribir esto, pero apunté a la claridad. En inglés, el lado derecho del tx_byte texto de la tarea: Si rx_byte está entre 61 hexadecimal y séptimo hexadecimal, inclusive, use rx_byte y con 0xDF, de lo contrario solo use rx_byte como es. Cambie el código y encienda el dispositivo nuevamente y verifique que las minúsculas se conviertan en mayúsculas.

Sobre PWM

Con la operación UART, podemos movernos al corazón del proyecto: generador de Modulación de Ancho de Pulso (PWM). Hay muchas formas de generar PWM. Imagina que estás parado frente a un interruptor de luz en una habitación oscura. Si enciende el interruptor, la habitación se ilumina, por supuesto. Si enciende la luz durante 1 segundo y luego apaga 59 segundos, la luz total en la habitación será 1/60 de la cantidad de luz cuando se enciende el interruptor. Ahora imagina que puedes encender la luz muy rápidamente. Entonces, por ejemplo, 60 milisegundos, enciende la luz durante un milisegundo. Su ojo promediará la luz y parecerá que la luz es muy tenue.

¿Qué pasaría si quisieras que la luz fuera un 50% más brillante que la luz total? Tienes algunas opciones. Puede encender la luz durante 30 ms y luego mantenerla apagada durante 30 ms. Esto se denomina "PWM de igual área". Sin embargo, también puede encender la luz durante 1 ms y luego apagarla durante 1 ms, dando un "PWM proporcional". ¿Qué camino es mejor? Eso depende de lo que quieras hacer. Por ejemplo, tener pulsos de 1 ms probablemente hará que cualquier parpadeo sea menos obvio. Sin embargo, el uso de PWM proporcional significa que la frecuencia de los pulsos cambia de acuerdo con el ciclo de trabajo, lo que podría causar zumbidos en los motores a ciertas velocidades.

La siguiente imagen muestra dos señales PWM al 50%. La traza superior es el reloj, la traza del medio utiliza semántica de igual área y la traza inferior es un generador de PWM proporcional. Aunque las señales se ven diferentes, ambas pistas de fondo están en la mitad del tiempo y desaparecen en la mitad del tiempo.

Decidí crear un bloque que pueda hacer ambos tipos de PWM. Cuando use el kernel, podrá elegir qué método desea usar.

Crear un bloque PWM

Es fácil generar salidas PWM simplemente manejando un contador con la cantidad de bits de resolución que necesita. Para PWM de igual área, puede comenzar con la salida encendida cuando el contador es cero. Cuando el contador alcanza el ciclo deseado, apaga la salida. Por ejemplo, con un contador de 8 bits, un ciclo de trabajo del 50% sería un cálculo de 127. La salida sería alta en los cálculos de 0 a 127 y baja en los cálculos de 128 a 255. Puede reducir el número de pasos restableciendo el cálculo a cero temprano. Por ejemplo, si restablece el contador a 200, entonces el 50% sería 100, lo cual es conveniente si no es necesario.

El PWM proporcional es un poco más difícil, pero aún así es fácil. Manteniendo la resolución de 8 bits, el generador PWM puede usar un contador de 8 bits con salida portátil. En cada ciclo de reloj, agrega el valor del impuesto. Aquí lo tienes. La salida es la salida del contador. Considere un ciclo de impuestos de 0x80. Inicialmente, el contador está en cero. Durante el primer ciclo de reloj, la calculadora será 0x80, y debido a que el bit de salida de la portadora es cero, la salida será baja. La siguiente adición da como resultado un contador 0x00, pero se produce la transferencia, por lo que la salida es alta. Puede ver que esto se repetirá ya que el próximo ciclo será 0x80. Así es como ocurre el ciclo de trabajo del 50%.

Si trabaja a través del contador con un ciclo de desarrollo de 1, verá que habrá una gran brecha entre los resultados altos. Si agrega 0xFF al contador en cada ciclo de reloj, obtendrá resultados altos casi constantes.

Decidí crear un bloque para hacer ambos estilos. La interfaz de Verilog se ve así:

module pwmblock #(parameter CNT_WIDTH=8, DIV_WIDTH=8)
    (input clk, input reset, input [CNT_WIDTH-1:0] increment, 
     input [CNT_WIDTH-1:0] endval, input [CNT_WIDTH-1:0] match,
     input [DIV_WIDTH-1:0] scale, output reg epwm, output ppwm);

Hablaré más sobre los parámetros en la publicación de mañana. Los argumentos incluyen el reloj estándar (clk) y reset entradas. Las entradas restantes son:

  • increment - La cantidad que se agregará al contador para cada ciclo de reloj (1 para área igual; ciclo de desarrollo para proporcional)
  • endval - El valor del contador que provoca el reajuste.
  • match - El valor del contador que hace que cambie la salida (el ciclo de trabajo para un área igual)
  • scale - Pre-calculadora para el reloj (puesta a cero para no pre-calculadora)
  • Las salidas son epwm para la salida de área igual y ppwm para la salida proporcional. Por supuesto, solo usaría un ejemplo a la vez.

    Atajos de PWM

    Configurar el bloque PWM para el modo de área proporcional o igual solo requiere configurar los parámetros correctos y seleccionar la salida correcta. Sin embargo, para que sea más fácil, he creado dos envolturas que solo exponen los argumentos que necesita para cada modo:

// Handy wrapper for equal area
module epwmblock #(parameter CNT_WIDTH=8, DIV_WIDTH=8)
  (input clk, input reset, input [CNT_WIDTH-1:0] endval,
  input [CNT_WIDTH-1:0] match, input [DIV_WIDTH-1:0] scale, output pwm);
  pwmblock #(.CNT_WIDTH(CNT_WIDTH), .DIV_WIDTH(DIV_WIDTH)) 
  pwmb(clk, reset, 1, endval, match, scale, pwm,);
endmodule
// Handy wrapper for proportional
module ppwmblock #(parameter CNT_WIDTH=8, DIV_WIDTH=8)
  (input clk, input reset, input [CNT_WIDTH-1:0] duty, input [DIV_WIDTH-1:0] scale, 
  output pwm);
  pwmblock #(.CNT_WIDTH(CNT_WIDTH), .DIV_WIDTH(DIV_WIDTH)) 
  pwmb(clk, reset, duty, 0, 0, scale,,pwm);
endmodule

A menos que necesite algo especial, probablemente usará las envolturas.

Banco de pruebas y simulación

Aunque es tentador intentar cargar código en el FPGA para probarlo, a menos que se esté ejecutando por primera vez (sí, ¿no es así?), Es mucho más eficiente desarrollar el sistema en simulación. Utilizo EDAPlayground para probar el código PWM. Para practicarlo, necesitaba un banco de pruebas, que es solo un controlador simple para usar el bloque y generar algunos resultados que puedas comparar con lo que esperas.

Puede encontrar el banco de pruebas y el código en el sitio web de EDAPlayground, y también puede ejecutarlo allí. Así es como se ve el sitio de prueba:

`default_nettype none
module test;
reg clk=0, reset=1;
wire ep, pp, ep0, pp2, ep1;
always #1 clk=~clk;
// 10/256 
epwmblock dut0(clk, reset, 8'hff, 8'h10, 8'h0, ep0);  
// 10/1024
epwmblock #(.CNT_WIDTH(10)) dut1(clk, reset, 10'h3ff, 10'h10, 8'h0, ep);
// 255/256
ppwmblock dut2(clk, reset, 8'hFF, 8'h0, pp);  
// 128/256 with prescale=1
ppwmblock dut3(clk, reset, 8'h80, 8'h1, pp2);  
// 16/32
epwmblock dut4(clk, reset, 8'h1f, 8'h10, 8'h0, ep1);
initial
begin
  $dumpfile("dump.vcd");
  $dumpvars(3);
#5 reset=0;
#4096 
  $finish;
end
endmodule

El sitio de prueba no es difícil de entender. Genera un reloj y solo conecta algunos dispositivos de prueba, registrando los resultados durante unos pocos miles de ciclos de reloj. Aquí hay una ejecución parcial de la simulación:

Puede hacer coincidir los nombres de las señales a la izquierda con el código del banco de pruebas para ver el ciclo PWM obligatorio para cada pista.

La próxima vez

Este ejemplo es casi demasiado simple, pero también es muy digerible. La próxima vez integraremos PWM y UART en silicio real, agregaremos algunos canales y haremos el protocolo un poco más complejo. En el camino, verás, como Verilog se ocupa de matrices y parámetros. Si quieres saber cómo usar EDAPlayground para hacer una simulación, mira los videos de la última vez que hablé sobre iCEStick, incluido el siguiente video.

  • Artenz dice:

    Recomiendo encarecidamente llamar en lugar de parámetros ordenados. Evita errores y hace que el código sea mucho más legible.

    • Al Williams dice:

      Todavía hay muchos ejemplos de código que no cumplen con el estándar de 2001 que introdujo los denominados parámetros. Pero es hermoso, e imagino que todas las herramientas que usamos las usan. Buen artículo sobre esto: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-884-complex-digital-systems-spring-2005/related-resources/parameter_models.pdf

      • Palmadita dice:

        "Todavía hay muchos ejemplos de código que no cumplen con el estándar de 2001"

        Estoy de acuerdo, así que no creemos más. 🙂

  • Mack dice:

    Puede encender la luz durante 30 ms y luego mantenerla encendida durante 30 ms. Esto se denomina "PWM de igual área".

    Quédatelo, ¿qué? ¿Lo es? Eso no es PWM, eso es ... Probablemente sea mejor hacer un ejemplo con un ciclo de desarrollo diferente al 50%, de lo contrario, se ven idénticos, pero con un ciclo de pulso más rápido ...

    • Al Williams dice:

      La palabra que falta se ha desactivado. El mismo patrón que en el ejemplo de 60 segundos anterior. Reparado.

      • Mack dice:

        Fresco. De hecho, traté de señalar que su imagen o explicación no parece ser una buena representación de dos tipos diferentes de PWM ... ambos parecen un ciclo de trabajo fijo (50%) con dos frecuencias diferentes para mí, que es un tipo de PWM. Los otros dos tipos que conozco son de frecuencia fija con devociclo variable y ancho de pulso fijo con frecuencia variable.

  • Alan Hightower dice:

    La parte difícil del trabajo de FPGA viene en muchas dimensiones, a saber, el tiempo. Si necesitara 10 PWM programables de forma independiente, ¿qué haría? No es tan simple como instalar 10 de sus módulos Verilog definidos si está limitado a un área lógica. El entrelazado funcional, la estimación de puertas, las tuberías y otros conceptos dimensionados en el tiempo son los conceptos más difíciles de entender con el diseño programable; y normalmente donde se comete el 99% de los errores.

    • Sheldon dice:

      Tenía la intención de repetir ese comentario cuando vi "Si necesita 20 bloques PWM, también funcionarán tan rápido como un bloque". porque, aunque a veces puede ser tan simple, a menos que se sepa qué lógica se sintetiza y cómo se usa la FPGA, rápidamente se pueden encontrar problemas donde no hay espacio para sintetizar la lógica solicitada y la velocidad deseada sin algo de tiempo / anillos de lógica / rompecabezas omitidos para mantener el resultado final.

  • Artenz dice:

    Creo que tener un módulo PWM que cumpla con dos tipos es demasiado inteligente para fines educativos e innecesariamente complejo para un uso real. Sería más sencillo tener dos proyectos separados. Más fácil de entender y quizás más eficaz de implementar.

    También elija un estilo de inserción coherente, especialmente cuando tiene tantas afirmaciones if-other. Por ejemplo, el 'otro' en la línea 33 va con el si en la línea 32, pero esto no es evidente según el guión. Esto es especialmente importante si el objetivo es enseñar a los principiantes.

  • Miroslav dice:

    ¿Cuál es la frecuencia máxima de PWM en este FPGA en particular?

    • Artenz dice:

      Eso depende de algunos factores, como la longitud de bits, el diseño de PWM, la asignación de pines y la cantidad de lógica adicional que tenga (cuanto más completa sea la FPGA, más difícil será encontrar un buen enrutamiento).

      El huésped aproximado está entre 100-200 MHz. La mejor forma es ejecutar el diseño con las herramientas y hacer un análisis de tiempo estático.

      • Miroslav dice:

        Gracias. Pensé en la generación de señal de onda sinusoidal a altas velocidades, cambiando constantemente los anchos de pulso y usando el filtro de paso bajo después. Así que este podría ser el punto de inflexión para convencerme de comprar mi primera FPGA.

        • Artenz dice:

          Recuerde que la frecuencia PWM debe estar muy por encima de su frecuencia objetivo. Suponga que logra obtener un reloj de 256 MHz y, al usar un PWM de 8 bits, solo terminará con 1 MHz al final. Menos aún, porque tu filtro no será perfecto. Además, cualquier ruido digital de la FPGA se superpondrá a la señal.

          Para generar ondas sinusoidales, es más fácil utilizar un DAC adecuado. Para las frecuencias de audio, existen DAC de audio baratos I2S con todos los filtros incorporados.

          • Miroslav dice:

            Sí, DAC podría ser mejor. Opciones, opciones ... Estoy pensando en comprar un FPGA de este artículo o de algún otro modelo para empezar 🙂 Todavía tiene que funcionar bien en Linux.

  • biblioteca cibernética dice:

    mi solución PWM "go" en TTL siempre ha sido un contador de 8 bits que funciona de forma gratuita desde una fuente de reloj, las salidas del contador van a las entradas "A" de 2 74xx85, comparadores de tamaño de 4 bits con límite, enlazan el Entradas "B" a "Hola" o "Lo".
    La señal PWM luego sale de A> B o A

  • Sheldon dice:

    Tenga cuidado con los problemas de x-prop en código como:
    siempre @ (posedge iCE_CLK) comienza
    si (recibido) comienza
    transmitir terminar de lo contrario comenzar
    transmitir hasta

    Si 'recibido' va X (desconocido), en lugar de transmitir en ese desconocido por transmisión, en este escenario, la transmisión será 0 (la condición 'si' cumple efectivamente “obtiene exactamente igual a 1”, que no es porque sea X ). Es una manera fácil de pasar por alto problemas en la simulación que causan problemas en el código real.

    También en la secuencia de código inmediatamente debajo de esto en el artículo, ¿cuál es el valor esperado de "transmitir" al convertir a mayúsculas? (se establece en '1' cuando pasa por un byte y en '0' cuando no se recibe nada, esperaría que las herramientas sintéticas concluyeran un clic y solo 'transmitieran' un carácter en mayúscula si sigue en el ciclo de reloj adyacente por byte enviado)

    • Artenz dice:

      No es un perno sino un flip-flop, y la transmisión sería 0, suponiendo que la señal "recibida" sea alta solo durante un ciclo después de cada señal recibida.

      • Sheldon dice:

        Es un proceso de relojería, por lo que todos serían fallas (transmisión y tx_byte). Mis disculpas, utilicé la abreviatura "pestillo" en el contexto de fallas como una falla que tiene el valor en otros ciclos de reloj posteriores (perno). En este caso, una transmisión mantendrá el valor del último ciclo cuando realice una conversión a superior (puede ser que sea "0" ya que nunca "aumentará" en muchos ciclos de reloj adyacentes).

        • Artenz dice:

          Veo. Es bastante común olvidar una rama case / if-other con lógica condicional y terminar con un pestillo involuntario.

  • W dice:

    Su lista de casos de uso pasa por alto el más importante que he visto aplicar FPGA en mi carrera profesional (defensa): el procesamiento de señales. La capacidad de inhalar datos a decenas de Gbps y hacer un número complejo con ellos es bastante única para los FPGA. Si desea construir un radar de alto rendimiento o un sistema de contramedidas de radar, dirección de haz de matriz en fase, preprocesador MIMO anti-jamming, etc., lo hace en FPGA. Del mismo modo, muchas comunicaciones de radio se implementan en FPGA: considere lo que puede hacer con SDR de consumidor, luego ajuste el ancho de banda y la complejidad en algunas magnitudes.

    • Al Williams dice:

      A continuación se muestra por qué utilizar una FPGA:
      > La capacidad de FPGA para operar rápidamente y en paralelo lo convierte en una excelente opción para el procesamiento en paralelo y el procesamiento de señales de alta velocidad.

      La mayor parte de mi trabajo con FPGA en este momento es difícil.

  • Dax dice:

    ¿Qué utilidad tiene el PWM proporcional en el ejemplo?

    También es el caso de PWM con corrección de fase, que debe ser simétrica alrededor de la señal del reloj, o de lo contrario obtendrá modulación de frecuencia a medida que cambia el ciclo de frecuencia y esto aparece como problemas de EMI. Suponga que cambia el ciclo de vinculación del contador ingenuo PWM en 1 cada ciclo: el punto medio de la forma de onda cambia en relación con el ciclo del reloj, lo que significa que la fase de la señal comienza a retrasar o adelantar la señal del reloj, lo que significa que la frecuencia de salida difiere de la frecuencia del reloj siempre que continúe cambiando el ciclo de impuestos.

  • Andrés Pullin (@AndrewPullin) dice:

    fpga4fun.com tiene hermosos ejemplos

  • Mike Lu dice:

    Si está utilizando FPGA para PWM, ¿no tendría más sentido hacer algo más avanzado como Delta Sigma? En otras palabras, algo que no se puede hacer con un microcontrolador clásico.

    • Artenz dice:

      El "PWM proporcional" descrito en este artículo es Delta Sigma.

    • hboy007 dice:

      ¡Absolutamente! Hay mucha discusión en línea sobre “PWM vs. Delta Sigma DAC” y una nota de programa interesante http://www.ti.com/lit/an/slyt076/slyt076.pdf
      Me gustaría poder hacer más sobre ese tema, podría obtener un número efectivo comparable de bits con velocidades de reloj significativamente más bajas. Sin embargo, la teoría que introduce la implementación del DAC delta sigma apropiado es algo que seguramente extinguirá el interés en los principiantes.
      Tal vez Jeri pueda ayudar, https://www.youtube.com/watch?v=DTCtx9eNHXE

  • James dice:

    Gracias por esta serie de artículos. Me gusta que el nuevo material llegue lo suficientemente rápido como para ser interesante, pero no tan rápido como para resultar abrumador.

    Si bien aprecio los comentarios que muestran sutilezas técnicas, creo que es importante recordar que el objetivo es lograr que los principiantes hagan algo con FPGA. No creo que importe que "algo" sea óptimo o incluso práctico. Para un tema tan complejo como los principiantes en FPGA, es un objetivo digno.

  • nraynaud dice:

    Tenía el software PSOC-5 por ahí, y gracias a este artículo creé mi primer parpadeo en verilog. Siempre he considerado al PSOC como el fármaco de entrada a los FPGA, pero en realidad nunca lo he investigado, en este momento. Tengo el peor LED parpadeante del temporizador PWM (sin reinicio, sin división, y sospecho que la salida se retrasa en la entrada).

    ¡Gracias!

Maya Lorenzo
Maya Lorenzo

Deja una respuesta

Tu dirección de correo electrónico no será publicada.