2019/08/04

Preguntar bien para aprender

Como esta es la... ya perdí la cuenta de las veces que me ha ocurrido, ha llegado el momento de compartirlo.


Tenía una duda de verilog que tenía que ver con que se estaba usando un vector como clock de un módulo y no lograba comprenderlo bien. Entonces me preparé como otras tantas veces para preguntar en el foro de embebidos:

Mi disciplina en estos casos y lo que quiero compartir es que cada vez que voy a hacer una pregunta, intento "hacer bien los deberes", esto es, evitar que alguien me conteste "hiciste esta obviedad?" o "mandá la salida de tal operación".

Para eso escribo la pregunta y voy completando todo lo que se me ocurre que alguien me reclamaría, lo cual me obliga a ir explorando muchas ramificaciones, algunas útiles y otras no tanto, de un modo u otro aprendiendo.

Asi que puse la pregunta, copié el código, quité de éste todo lo que estorbaba y esta es la primer versión del mail que no mandé, te propongo que intentés darte cuenta, si sabés algo de Verilog, claro, cuál es la respuesta:

Hola

Mirando un ejemplo que tengo de un PWM he hallado que aparentemente un posedge de un vector corresponde a su overflow o algo así, ¿es así?


Este es el código en cuestión, quitándole todo lo que me pareció superfluo.

   module pwm_test(
   ...
   );
   reg [6:0] prescaler = 0; // CLK freq / 128 / 256 = 1.5kHz
                            // depende del reloj de la placa

   pwm p(.pwm_clk (prescaler[6]), ......);

   always @(posedge CLK)
   begin
      prescaler <= prescaler + 1;
     ...
   end

El otro módulo

   module pwm(
      input pwm_clk,
      ...
   );

   always @(posedge pwm_clk)
   .....

Gracias y saludos


¿Listo?

Busqué "verilog posedge of a vector" y me llevó una conversación donde dice que:

A posedge on (|vec) ?  Actually the standard says that [pos|neg]edge tests only the least significant bit of the vector.
Algo encaminado estoy, pero es lo contrario a los resultados, si fuera el LSB, la frecuencia sería la mitad del clock, no? ¿50 MHz en lugar de 391kHz?



Chiquito dice que la frecuencia es 391kHz


Todavía estoy intentando entender exactamente como funciona, eso lo relataré en un próximo post, pero mientras, mantengámonos en la pregunta de la relación entre posedge y un vector.

Para aclarar las cosas tanto para mí como para quien leyera, marqué con negrita el vector en los dos módulos y ahí hallé la respuesta que marco en rojo:

Se está usando el MSB del prescaler de 7 bits, encontré y entendí la respuesta a mi pregunta.



reg [6:0] prescaler = 0; // CLK freq / 128 / 256 = 1.5kHz
                         // depende del reloj de la placa

pwm p(.pwm_clk (prescaler[6]), ......);

always @(posedge CLK)
begin
  prescaler <= prescaler + 1;
  ....
end

------------------------
module pwm(
    input pwm_clk,
   ...
);

always @(posedge pwm_clk)
.....
 
<Actualización 2022-08-04>
 
Al releer, me doy cuenta que nunca dije qué pasó. Quien diseño el código original lo hizo para un clock de 50Mhz, no se le pasó por la cabeza que iba a ser ejecutado con 100Mhz, el doble, necesita un bit más.

Respecto al "eso lo relataré en un próximo post", la verdad es que ya ni me acuerdo de este tema, quizás ya lo entendí y lo olvidé, lo siento.

</actualización>

Aunque estas son cosas muy personales, recomiendo este método, pues muchas veces en el foro hay preguntas tipo "no puedo leer el acelerómetro con la sAPI"  que hacen que quien quiera contestar tenga que empezar a escarbar para poder responder.


Está claro que quien pregunta puede estar muy perdido, pero intentar esto, si no llevarte a la solución, puede mejorar bastante la conversación.

En alguna conversación Alejandro me dijo "Gracias Carlos, siempre me contestás a mis post, te debo tener harto". Para nada, es la misma actitud, ponerse en el lugar del otro pero para aprender.


El código completo está en github y corresponde a la adaptación que estoy haciendo a una nexys4ddr de los ejemplos de un libro cuyo código está en github tambien.



No hay comentarios:

Publicar un comentario