嘿嘿,首先声明一下,绝对的原创哈,赚点分,希望4月份能上个榜赚两本书,顺道分享一下以前遇到过几次的一个问题,在此先谢谢大家支持!
对于分频器大家可能都有意或者无意的会用到很多,但是不知道大家是否有留意,一般情况下我们用的都是偶数分频的分频器,比如用计数器对时钟沿计数,计数大小为5,超过5后计数结果清零,输出取反,这样得出来的一个分频结果实际是10分频,用100Hz的时钟通过此分频器后,输出将是10Hz。因此在此便可以因为今天我想分享的问题:如果希望实现5分频,我们该如何实现了?
我曾不止一次遇到过要求实现3分频的问题,好在没有限制,用什么方式实现都行。好在鄙人手艺不潮,遇上该问题都被俺把招给拆了。
从逻辑上来看的话,直接对时钟沿简单计数是无法完成的。那么可否用计数来实现咧?答案是肯定的。方法也有很多,首先,如果你熟悉verilog中always可用的触发条件的话,你可能会想到对时钟电平进行计数!哈哈,这也正是鄙人第一次遇到这个问题时给出的解决方案,用时钟电平作触发条件,只要电平切换就触发计数器计数一次,计3个时钟电平得到一个输出电平,这样就可以实现3分频了,这个办法相信不少人其实都能想到的吧。代码描述如下(verilog):
moduledv3( output clk_out,
input clk_in,
input reset
);
reg [1:0] cnt;
reg clk_out_temp;
always@ (clk_in or reset)
begin
if(reset== 1)
begin
cnt<= 0;
clk_out_temp<= 0;
end
else if(cnt >= 2'b10)
begin
cnt<= 0;
clk_out_temp<= ~clk_out_temp;
end
else
cnt<= cnt + 1;
end
assignclk_out = clk_out_temp;
endmodule
但是这样描述能否综合出来?综合出来后是什么玩意?这个我自己确实也想不出照这个逻辑来做,电路会是怎么样的(哈哈,俺的数字电路逻辑能力比较弱滴,这种实现对俺来说算是复杂的了),但是我们可以看看综合工具给出的结果
这个已经是能看到的最底层了,再往下就点不进去了,我是真没弄明白里边实现的电路。经过仿真发现功能是可以出来的,波形图如下:
后来有一次我作一个电路的移位寄存器分析的时候,在画时序图的时候突然找到灵感,发现可以用移位寄存器来实现3分频的电路,电路图如下:
哈哈,这个实现就友好多了吧,即使一下看不明白,稍微画一下时序图就出来了。
:-),这些其实都是很早前的故事了,大概乾龙年间吧:lol,当年俺还靠这个把王总给忽悠了,嘿嘿
当时确实很傻很天真,自己想不出电路实现也不知道去baidu,后来等想起来去bai了一把,结果发现乱七八糟的方法还真不少,有用verilog或VHDL胡乱描述的,把逻辑搞的很复杂,估计也很浪费资源的,至于能否实现俺是米有兴趣去仿真和验证的,也发现有用JK触发器来作的,实际跟用DFF作移位异曲同工
有了3分频的基础,5分频就不难了,照着原理依葫芦画瓢吧,先把时钟作偶数分频成非50% duty,用移位寄存器吧duty调整好,使其与180度相移信号可以组合出奇数分频的输出即可 |