您的位置:技术中心首页 > 硬件语言 >> Verilog HDL >> N奇数分频方法总结

N奇数分频方法总结

作者:未知   时间:2007-09-29 12:47:26  来自:网上转载  浏览次数:0  文字大小:【】【】【

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

责任编辑:5life

更多相关 分频 的文章

本文共有0条评论,现在显示最新的5条。

栏目导航

电路基础
硬件语言
逻辑验证
电路综合
后端设计
可测设计
基本逻辑
制造工艺
书籍精选
说文解字
工具学习
数字滤波
趣闻逸事
数字锁相
设计杂项
低耗设计

站点最新

更多相关链接

  N奇数分频方法总结
  verilog HDL 的阻塞和非...
  Verilog 非阻塞赋值的仿...
  Verilog的键盘源码keypa...
  Verilog 脉冲发生器程序
  Verilog 电梯控制器设计
  Verilog学习心得
  Verilog交通灯控制器程序
  一种基于移位寄存器的CA...
  SPI串行总线接口的Veril...

栏目最新

更多相关链接

  N奇数分频方法总结
  verilog HDL 的阻塞和非...
  Verilog 非阻塞赋值的仿...
  Verilog的键盘源码keypa...
  Verilog 脉冲发生器程序
  Verilog 电梯控制器设计
  Verilog学习心得
  Verilog交通灯控制器程序
  一种基于移位寄存器的CA...
  SPI串行总线接口的Veril...

热点文章

更多相关链接

  中文版Verilog HDL简明教程
  Verilog HDL的基础知识
  Verilog学习笔记(More)
  Verilog 的些许经验
  verilog HDL笔记
  Verilog设计经验点滴
  阻塞式赋值与非阻塞式赋值
  硬件描述语言(HDL)的基础知识...
  SDRAM控制器软核的Verilog设计
  一种基于移位寄存器的CAM的V...