在某些场合,下位机只能处理整型数据,而我们需要产生的分频频率并不是整数,可以考虑用以下的方法逼近:
比如执行以下的分频:
while(1)
{
cnt += div_cnt;//2
if(cnt >=given_frequency)//6
out=1;
else
out=0;
cnt%= given_frequency;//6
}
循环中out会以平均每 "given_frequency/div_cnt" 个时间间隔输出1。
在FPGA中,同样可以用此方法分频。
如果FPGA的时钟频率为50MHz,需要分频成115200Hz。50M/115200=434.027...约等于 "65536/151" =434.013.... 这跟要求的分频比很接近,2的幂次方数在FPGA上实现起来相当有效。
代码如下:
reg [16:0] cnt; //
always @(posedge clk)
cnt <= cnt[15:0] + 151; //保留最高位
wire frequency = cnt[16]; //最高位作为进位输出
产生分频要求的频率。