N奇数分频方法总结
2012-06-02
标签: 奇数分频

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

可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号