El corazón de todo esto es un comparador de 8 bits junto a un contador, el cual suele tener una frecuencia bastante alta. El contador estará contando de 0 a 255 y vuelta a comenzar, así todo el rato. El comparador tomará la combinación de la entrada A (señal de muestra) y la comparará con lo que le entra del contador. Entonces si es mayor, menor o igual, se pondrá a '1' una de sus tres salidas. Las salidas "mayor que" y "menor que" son inversas y también son las señales PWM, excepto cuando A es igual a B.
Los PWM hay que ajustarlos un poco (señal "Clock" del contador) y en los ejemplos que he adjuntado va muy, pero que muy rápidos, porque los leds enseguida da la sensación que se encienden a tope y responde mejor a esas frecuencias para ver mejor contraste. Pero si en vez de leds fuese por ejemplo para controlar la velocidad de un motor, entonces habría que bajar mucho esa frecuencia de entrada al contador. Esto es un ir probado, porque depende de lo que quieras controlar va más fino o más bruto a según qué frecuencias (que por lo general suelen ser altas).
Verás en el esquema de por ejemplo "pwm_rampa.ice" que hay un segundo contador puesto en la entrada A, pero era para poner un ejemplo fácil de pequeñas cosas que se pueden hacer. Ese segundo contador va mucho más despacio, a unos 100Hz, para que haga variar el brillo de los leds cada 2,5 segundos aprox. Lo hace en forma de rampa, eso quiere decir que se va encendiendo y cuando llega al máximo se apaga bruscamente; este proceso se repite todo el rato. Le puse puertas NOT a la salida "menor que" para poder dar consumo a cada uno de los cinco leds de forma independiente y no hacer sufrir la salida de ese comparador, que además, como sabemos, las FPGA no va muy sobrada de corriente en sus salidas.
Luego hay un segundo ejemplo llamado "pwm_senoidal.ice", pero para comprender su funcionamiento habría que entender antes el anterior proyecto que hice que llama "KITT", es una manera de aplicar cosas aprendidas anteriormente. En este segundo programa conseguimos que los leds se enciendan y apaguen de forma progresiva.
Idealmente habría que poner un filtro pasa-bajos a la salida del PWM, para convertirla en lo más analógica posible, pero por sencillez queda así el esquema.
Todavía no estamos en Navidades, pero ya queda poco... (si cargas los ejemplos en tu FPGA entenderás a qué me refiero!)
Saludos!
--
Has recibido este mensaje porque estás suscrito al grupo "FPGA-WARS: explorando el lado libre" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/896f1233-49e2-4cbf-ad1b-811cef29299f%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.
Se me olvidó adjuntar los "ICE"!!!Adjuntos quedan!
--
Has recibido este mensaje porque estás suscrito al grupo "FPGA-WARS: explorando el lado libre" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/8478c4fe-24e4-4cf6-9881-491626fefe91%40googlegroups.com.
--
Has recibido este mensaje porque estás suscrito al grupo "FPGA-WARS: explorando el lado libre" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/36b1f3bb-2721-4411-b54f-abccfa293fca%40googlegroups.com.
reg pwm_out; reg [3:0] rampa=0;wire [3:0] pwm_in={i3,i2,i1,i0};
always @(posedge clk) begin rampa <= rampa + 1'b1; // Aumenta el contador con cada flanco de clk un escalón que va formando la rampa. pwm_out <= (pwm_in>rampa); // Compara el valor de entrada "pwm_in" con el contador "rampa" y el resultado lo mete a la salida "pwm_out". end