关于奇数分频电路的毛刺问题
module div_3
(
input clk,
input reset_l,
output clk_div_3
);
reg [1:0] cnt_p;
always @(posedge clk)
if(!reset_l)
cnt_p<=2'b00;
else if(cnt_p==2'b10)
cnt_p<=2'b00;
else
cnt_p<=cnt_p+1;
reg [1:0] cnt_n;
always @(negedge clk)
if(!reset_l)
cnt_n<=2'b00;
else if(cnt_n==2'b10)
cnt_n<=2'b00;
else
cnt_n<=cnt_n+1;
assign clk_div_3=(cnt_p==2'b01)|(cnt_n==2'b01);
endmodule
也学习一下
来学习一下,共同进步
求大神解答,如何去毛刺
这个电路很安全啊,感觉不会有什么毛刺。
小编能说一下你觉得哪里会出现毛刺吗?
奇数分频没法寄存输出,毛刺不可避免吧,估计只能用施密特。
这是当时技术部经理根据我的答题试卷进行电话面试,问我的一个问题,说这个三分频电路会产生毛刺,问我解决方案,我说用触发器就可以了,他没再继续深问。我后来想想普通触发器是不行的,是不是用施密特触发器,所以过来问问
我见过的用施密特的都是处理外部输入的信号,为了改善电平特性,这个感觉无关吧……
数字电路产生毛刺一般是因为两个信号同时变化,比如说cnt_p[1:0]从1变为2,可能会经历一个1->0->2或者1->3->2的过程,但在这里好像也不会造成毛刺……
同求解。
这个产生毛刺应该就是指输出的那段组合逻辑产生的毛刺,我觉得吧,就在末端加个触发器就行了 = = 不知道是不是我想简单了。
你可以画个时序图看看,触发器根本不行= =
这个我也想知道答案,希望知道的高手给解答一下。
可以用异步方式处理吧
也希望能知道答案,学习学习
最好不要这么写分频器,用状态机写比较好,你这样前一级的输出时钟作为下一级的输入时钟会有风险的
module div_3
(
input clk,
input reset_l,
output clk_div_3
);
reg [1:0] cnt_p;
always @(posedge clk)
if(!reset_l)
cnt_p<=2'b00;
else if(cnt_p==2'b10)
cnt_p<=2'b00;
else
cnt_p<=cnt_p+1;
reg p_clk;
always @(posedge clk)
if(!reset_l)
p_clk<=1'b0;
else if(cnt_p==2'b01)
p_clk<=1'b1;
else
p_clk<=1'b0;
reg [1:0] cnt_n;
always @(negedge clk)
if(!reset_l)
cnt_n<=2'b00;
else if(cnt_n==2'b10)
cnt_n<=2'b00;
else
cnt_n<=cnt_n+1;
reg n_clk;
always @(negedge clk)
if(!reset_l)
n_clk<=1'b0;
else if(cnt_n==2'b01)
n_clk<=1'b1;
else
n_clk<=1'b0;
//assign clk_div_3=(cnt_p==2'b01)|(cnt_n==2'b01);
//instance lib gate to avoid glitch
OR2x1 (.y(clk_div),.a(p_clk),.b(n_clk));
endmodule
把代码改成这样也许可行。
用正时钟沿做2分频,做负沿做4分频,二者异或就得到了3分频时钟,不会有毛刺。
学无止尽!
为什么用 always @(posedge clk)
而不是always @(posedge clk or negedge reset_l) ?
我用always @(posedge clk) 仿真不出来啊
这个只是同步和异步的差别而已
其实计数器就是状态机的一种。我觉得不是这个问题引起的
不对,你没搞清楚如何分频,O(∩_∩)O
非常感谢你的回答,O(∩_∩)O,很有启发,比我的电路要好,在或门OR2X1的输入都是寄存器输出。但是我觉得cnt_p和cnt_n已经是寄存器输出了,经过组合逻辑应该没什么问题(我画时序图没发现什么问题)。
你原来的代码,从功能上看,是没有问题的,所以不用画时序图。
关健是如何去毛刺。
1:你原来电路中的两个比较器,有可能导致最后输出时钟的上午沿或者下降沿不干净(这个词不知道是不是这样说。)
2:最后的or门,这个最好是用库单元例化,不要让DC给优化掉了。
3:后端进行DC综合以及做时钟树时,这个or门的输出要重点对待。
以上个人意见!
add optimize option
我在想能不能直接将敏感变量写成上升下降延,然后计数,这样输出的也实现计数分频啊。这样绝对没有毛刺了吧!?
这个如果周期非常的大,可以用晶振时钟做延迟消抖,如果没那么大,只能用史密斯特触发器了。史密斯特触发器肯定是行的。
