昨天研究音乐盒的时候,发现原来我算分频计数值的时候一直有错误,今天写下这个随笔,加强一下自己的记忆。
问题一:系统时钟50Mhz,分频1.5hz,那么计数值应该是多少呢?
cnt_level = 50_000_000 / 1.5 / 2 = 16_666_667
而我以前一直认为
cnt_level = 50_000_000 / 1.5 = 33_333_333
错误原因是:
50Mhz时钟里面有33_333_333个1.5hz,但是一个时钟里面一半是高电平,一半是低电平,所以计数器应该计数到16_666_667,然后每到达16_666_667时翻转一次,这样一个周期里面计数就是33_333_333,否则就是66_666_666,那样就差了2倍。
问题二:系统时钟是50Mhz,计数值是16_666_667,那么分频是多少hz?
f_div = 50_000_000 / (16_666_667 * 2) = 1.5 hz
问题三:系统时钟是50Mhz,reg [23:0] cnt,clk_div = cnt [23],那么分频时钟周期是多少?
t_div = 2^24 / 50_000_000 = 0.3355 s
原因:cnt [23] = 0 代表着cnt从24'b0000_0000_0000_0000_0000_0000到24'b0111_1111_1111_1111_1111_1111,而
cnt[23] = 1 代表着cnt从24'b1000_0000_0000_0000_0000_0000到24'b1111_1111_1111_1111_1111_1111,故
2^24是一个周期的计数值,那么t_div = 0.3355s