He estado tratando de hacer funcionar mi FPGA Cyclone II (del kit de inicio, EP2C20). Conseguí que el software Quartus II funcione en mi configuración de Ubuntu y CASI funciona: puedo escribir algo de Verilog, compilarlo y ponerlo en mi dispositivo a través del programador. Sin embargo, no puedo obtener mi código para controlar las salidas de FPGA de manera significativa. Aquí está, esencialmente, el código que estoy intentando:
module fpga(output LEDG[7:0);
assign LEDG = 1;
endmodule
Quiero que se enciendan todos los LED verdes del FPGA. ¿Qué estoy haciendo mal?
Lo siento mucho si esto es algo que podría haber buscado en Google, pasé la última hora intentándolo pero no llegué demasiado lejos (no parece haber mucho ejemplo de código Verilog hecho para FPGA en Internet, al menos cualquier código que se ocupa de minucias como la activación de LED).
No puedo esperar para comenzar a jugar con esto de verdad, ¡así que agradecería cualquier ayuda para que este pequeño paso funcione!
Actualización : el planificador de pines Quartus II muestra que la ubicación del instalador para los pines que me interesan es diferente de los pines especificados en la hoja de datos. ¿Cómo puedo solucionar esto sin reasignar manualmente todos los pines a los lugares correctos?
Tu código no es del todo correcto.
Si desea establecer algo en un valor, debe crear un registro y establecerlo en consecuencia, luego asigne el valor a una salida. En general, no puede usar initial
declaraciones para la síntesis (consulte su documentación), por lo que establecer el registro en una constante en una señal de reinicio o usar un bloque ROM son opciones.
Sin embargo, digamos que desea hacer parpadear los LED, esto es más emocionante que simplemente encenderlos. Digamos que tenemos un reloj de 16 MHz, para reducir la velocidad del reloj para que los LED parpadeen visiblemente, necesitamos dividirlo. Si elegimos un registro de conteo de 24 bits, 16e6 / (2^24) = ~ 1 Hz, por lo que los LED se actualizarán una vez por segundo.
module fpga(
input clk,
output LEDG[7:0);
// output reg to set
reg rOUT[7:0]
// counter reg to slow clock down
reg rCOUNT[24:0]
// this models the synchronous logic, the block is activated on each positive edge of clk
always(@ posedge clk)
begin
// add one to rCOUNT on each clock positive edge
rCOUNT <= rCOUNT + 1;
// if rCOUNT equals 0xFFFFFF then increment rOUT by 1
if(rCOUNT == 24'hFFFFFF)
begin
rOUT <= rOUT + 1;
end
end
assign value of rOUT to LEDG so LEDs will light according to rOUTs current value
assign LEDG = rOUT;
endmodule
Tenga en cuenta que al asignar un valor a un registro, debe especificar el ancho; de lo contrario, se establecerá de forma predeterminada en el ancho predeterminado del sistema (por ejemplo, 32 bits). Por lo tanto,
si crea un registro de 8 bits rOUT
y desea establecerlo en todos los 1, luego, suponiendo que su software de síntesis permita asignar un valor inicial que escribiría reg rOUT = 8'b11111111;
o reg rOUT = 8'hFF;
Todo esto se aclarará a medida que lea más.
Sobre el planificador de pines Quartus, no estoy seguro (ya que uso Xilinx/Actel FPGA), pero asegúrese de que las asignaciones de pines sean correctas. Debería poder cambiarlos en el planificador de pines o editar manualmente el archivo de restricciones según sea necesario. Todo estará allí en la documentación (sin duda muy larga).
Un buen libro es "FPGA Prototyping by Verilog Examples" (Pong P Chu), pero hay algunos ejemplos que puede seguir: fpga4fun es un buen sitio con muchos proyectos de ejemplo. Pasa algún tiempo leyendo y conociendo las construcciones del lenguaje. Pruebe cosas en el simulador primero para confirmar la operación correcta antes de programar FPGA.
martin thompson
ben voigt