在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3438|回复: 9

N奇数分频思路总结

[复制链接]
发表于 2009-1-5 08:47:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
N奇数分频思路总结 N奇数分频思路总结

N奇数分频,要使占空比为50%,以如下思路实现:
A、以原时钟周期的N倍作为一个处理周期;(用计数器计数的作用)
B、生成占空比为N2 : N2+1(除法取整)的波形;(以计数器值采样)
C、将B生成的波形相移原时钟的半个周期;(用负沿打的作用)
D、若高电平占N2宽,输出将B和C的波形相或;若高电平占N2+1宽,输出将B和C的波形相与

其它的思路:
1、用状态机实现,但感觉没有上面的方法直接;
2、其它波形处理方式,大家可补充;

几个观念:
1、并不是用了时钟的正沿和负沿打,就不能综合了,以上的代码均能正确进行综合实现;
2、虽然原则上不建议一个设计中既用时钟的上沿打,又用时钟的负沿打,因为违反的时钟的归一性,但是根据

具体情况可适当运用,这只是原则,不是说用了就是错!
3、以上只是个人观点,有不同观点的大家可补充讨论。

**********************************************************
三倍分频

方式一,行为描述:

module threediv(rst,clk,clkout,clkout1,clkout2);
input rst,clk;
output clkout,clkout1,clkout2;
reg clkout;
reg clk1o;
reg clkout1;
reg clk2o;
reg clkout2;
always@(posedge clk)
if(!rst)
clkout2<=0;
else
clkout2<=(~clk1o)^clkout2;

always@(posedge clk)
if(!rst)
clk1o<=0;
else
clk1o<=clkout2;

always@(negedge clk)
if(!rst)
clkout1<=0;
else
clkout1<=(~clk2o)^clkout1;

always@(negedge clk)
if(!rst)
clk2o<=0;
else
clk2o<=clkout1;

always@(clkout1 or clkout2 or rst)
if(!rst)
clkout=0;
else
clkout=clkout2|clkout1;
endmodule  

根据以上的逻辑,我用寄存器级描述了一下,更接近原理图的方式,可直接绘图,代码如下:

module dffdiv3(rst,clk,clko);
    input rst;
    input clk;
    output clko;
     
    dffp dp1(.rst(rst),.clk(clk),.din(feedp),.dout(wp1));
    dffp dp2(.rst(rst),.clk(clk),.din(wp1),.dout(wp2));
    assign feedp=~wp2^wp1;
   
    dffn dn1(.rst(rst),.clk(clk),.din(feedn),.dout(wn1));
    dffn dn2(.rst(rst),.clk(clk),.din(wn1),.dout(wn2));
    assign feedn=~wn2^wn1;
   
    assign clko=feedp|feedn;
        
endmodule


module dffp(rst,clk,din,dout);
    input rst;
    input clk;
    input din;
    output dout;
   
    reg dout;
   
    always @(negedge rst or posedge clk)
    if(!rst)
    dout<=0;
    else
    dout<=din;
   
endmodule

module dffn(rst,clk,din,dout);
    input rst;
    input clk;
    input din;
    output dout;
   
    reg dout;
   
    always @(negedge rst or negedge clk)
    if(!rst)
    dout<=0;
    else
    dout<=din;
   
endmodule

测试仿真代码:
`timescale 1ns/1ns

module dffdiv3_tp();
    reg rst,clk;
    wire clko;
   

dffdiv3 Dffdiv3(.rst(rst),.clk(clk),.clko(clko));

initial
begin
   rst=1;
   clk=0;
   #20;
   rst=0;
   #20;
   rst=1;
end

always #10 clk=~clk;

endmodule
//以上的实现没有时钟双沿的问题,因为时钟的正负沿使用针对不同的数据流
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
扩展到N倍奇数分频方式

module odddiv(rst,clk,clkout);
    parameter N=3;  //计数器的位数        N的最大计数值要大于或等于M
    parameter M=7;         //要分频的模,取奇数
    input rst;
    input clk;
    output clkout;
   
    reg tempp,tempn;
   
    //assign clkp=clk;
    //assign clkn=~clk;
   
    reg [N-1:0] count;
   
    always @(negedge rst or posedge clk)
    if(!rst)
    begin
    count<=0;
    tempp<=0;
    end
    else
    begin
    count<=count+1;
    if(count==M/2)
    tempp<=1;
    else if(count==M-1)
    begin
    tempp<=0;
    count<=0;
    end
    end
   
    always @(negedge rst or negedge clk)
    if(!rst)
    tempn<=0;
    else
    tempn<=tempp;
   
    assign clkout=tempp|tempn;
   
endmodule

测试代码:
`timescale 1ns/1ns

module odddiv_tp();
    reg rst,clk;
    wire clkout;
   

odddiv Odddiv(.rst(rst),.clk(clk),.clkout(clkout));

initial
begin
   rst=1;
   clk=0;
   #20;
   rst=0;
   #20;
   rst=1;
end

always #10 clk=~clk;

endmodule
发表于 2009-1-5 10:20:43 | 显示全部楼层
感谢分享!支持!
发表于 2009-1-6 10:43:49 | 显示全部楼层
这样分频的效果不是非常好,对后端clock tree的生成也有影响。最好是有2x时钟,做1/2N的分频
发表于 2009-1-6 14:09:34 | 显示全部楼层
It can't be used in ASIC.
发表于 2009-1-6 20:30:09 | 显示全部楼层
谢谢楼主,学习中!多谢
发表于 2009-1-8 21:44:33 | 显示全部楼层
多谢提供员代码,正在消化
发表于 2009-1-9 16:50:00 | 显示全部楼层
可以在ASIC中使用,本人在一块芯片设计中用了5分频电路,用的就是类似的方法。
不过楼主的代码可读性有点差。


发表于 2009-1-12 18:42:03 | 显示全部楼层
这个思路还是不错的
发表于 2009-1-12 23:37:15 | 显示全部楼层
谢谢楼主啊,一直在想怎么分频!
发表于 2014-5-5 11:15:22 | 显示全部楼层
占空比  50%?吗,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 22:41 , Processed in 0.024562 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表