原创 N奇数分频方法总结

2008-8-4 11:30 3924 3 5 分类: FPGA/CPLD

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

文章评论2条评论)

登录后参与讨论

用户1373959 2008-8-7 15:24

楼主可参考一下如下文章. (原創) 如何設計除頻器? (SOC) (Verilog) (MegaCore) http://www.cnblogs.com/oomusou/archive/2008/07/16/verilog_clock_divider.html

ilove314_323192455 2008-8-4 21:00

不错
相关推荐阅读
用户461316 2009-08-17 17:57
Zigbee星型网络组网程序段
最近一直在做Zigbee的星型网络的组网试验,由于时间的原因,现在只是在最高的应用层上来编写程序。即协议栈的程序是2430的开发商(无限龙)编写的,我只是调用相应的函数来完成组网的,星型网络组网部分的...
用户461316 2009-08-17 17:14
VB6的标题栏使用上真彩色图标
模块 ModIcon.Bas 代码: Option Explicit Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long...
用户461316 2009-08-17 16:58
AppendToLog一个API方式存取日志文件的模块
'**************************************' 模块名称: AppendToLog' 功能描述:一个很不错的日志文件写入模块,不同于'     open/print/...
用户461316 2009-08-17 16:57
(VB自定义函数)去除字符串中的空格
'去除字符串中的空格(方法一)Public Function DelBlank(SearchString As String)   DelBlank = Replace(SearchString, C...
用户461316 2009-08-17 16:56
(VB自定义函数)对任意输入的汉字,可以得到它的拼音的第一个字母
调用方法:Command1.Caption = getHzPy("你")'//函数入口为汉字串,返回值为该汉字的第一个字母Public Function getHzPy(hzStr As String...
用户461316 2009-08-17 16:54
VB_代码执行速度测试
'**************************************'Windows API/Global Declarations for :[ '     A Simple] code ...
我要评论
2
3
关闭 站长推荐上一条 /2 下一条