Recientemente me he involucrado en el diseño de FPGA y solo estoy probando un nuevo hardware de SoC de Zync. He seguido un tutorial en línea para hacer parpadear algunos LED, sin embargo, lo he modificado para que parpadee todos los LED a diferentes velocidades. Mi código es el siguiente y describe un potencial contador de LED de 8 elementos:
// Simple LED logic
// reg [28-1:0] led_reg2 [8-1:0]; // 28 bit wide, 8 element memory
reg [28-1:0] led_cnt_0; // 29 bit LED counter
reg [27-1:0] led_cnt_1;
...
always @(posedge sys_clk_i) begin // on every positive edge of system clock
if (!sys_rstn_i) begin // if the system is reset
// led_reg2{8-1:0} <= 28'h0; // failed attempt to describe resetting an 8 bit bank of registers to 0
led_cnt_0 <= 28'h0; // reset the LED counter
led_cnt_1 <= 27'h0;
...
end
else begin
led_cnt_0 <= led_cnt_0 + 28'h1; // increment counter
led_cnt_1 <= led_cnt_1 + 27'h1;
...
end
end
assign led_o = {led_cnt_0[28-1],led_cnt_1[27-1],led_cnt_2[26-1],led_cnt_3[25-1],led_cnt_4[24-1],led_cnt_5[23-1],led_cnt_6[22-1],led_cnt_7[21-1]};
Mi código hace lo que desea y parpadean a velocidades iguales a 125e6 / 2 ^ n - Sin embargo, no estoy satisfecho con el diseño de mi código y la sintaxis, considerando que Verilog está diseñado para resolver este tipo de problemas de esta naturaleza.
Mi pregunta es:
¿Cuál es la sintaxis correcta / adecuada de tal problema? He intentado resolver esto haciendo un registro de 8 elementos de 28 bits de ancho, pero no sé cómo controlarlo correctamente. He pasado bastante tiempo buscando problemas y sintaxis similares, pero no he podido implementarlo correctamente. También creo que un enfoque de prueba y error no es el camino a seguir, ya que no se trata simplemente de programación.
Además, cualquiera podría recomendar material de lectura adecuado para aprender y practicar Verilog, estoy familiarizado con las estructuras, etc., a través de los profesores hace algunos años, pero no tengo ni idea sobre la implementación.
Muchas gracias.