Making a clock divider

后端 未结 2 1286
说谎
说谎 2021-01-23 09:27

I found this code in how to make a clock divider. I have a general understanding on how to make a divider using counters but i not sure what this code is doing and why its doing

2条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-01-23 10:20

    What the above code does is simply that it creates a VHDL module containing a 24 bit counter q, which is counted up on each rising edge from the master clock mclk. It then derives clk190 and clk48 by using different bits of this counter directly as clock signals.

    For instance, with mclk at 50 MHz, the lsb (q(0)), would effectively run at 25 MHz. Each rising edge of mclk gives you one edge on q(0) - similarly upwards, so that each subsequent bit runs at half the frequency of the previous bit.

    For instance:

    mclk = 50 MHz
    q(0) = mclk / 2 = 25 Mhz
    q(1) = q(0) / 2 = mclk / 4 = 12.5 MHz
    ...
    q(n) = mclk / (2^(n+1))
    

    Your derived clocks will thus be depend on your master clock, and be:

    q(17) = 50 MHz / 262144 = 191 Hz
    q(19) = 50 MHz / 1048576 = 48 Hz
    

    However - generating clocks like this is often the wrong way to do it!

    It may seem as if you get nice synchronized clocks, but in reality, they'll be slightly skewed compared to each other, since you're generating what is known as a gated clock (many tools will even warn you about this).

    More info on that here, including a way of doing the same thing (but better) with clock enables: VHDL: creating a very slow clock pulse based on a very fast clock

提交回复
热议问题