当前位置:文档之家› Verilog分频器设计

Verilog分频器设计

Verilog分频器设计module adder(clk,z);output z;reg q;reg z;always@(posedge clk)beginif(q%9==0)z<=q;elseq=q+1;endendmodulemodule counter9(clk,datein,z); output z;input clk;input datein;reg z;reg[3:0] q;always@(posedge clk)beginq<=q+1;if (q==4'b1001)beginq<=4'b0000;z<=datein;endendendmodule2008-11-04 19:58分频器是FPGA设计中使用频率非常高的基本单元之一。

尽管目前在大部分设计中还广泛使用集成锁相环(如altera的PLL,Xilinx的DLL)来进行时钟的分频、倍频以及相移设计,但是,对于时钟要求不太严格的设计,通过自主设计进行时钟分频的实现方法仍然非常流行。

首先这种方法可以节省锁相环资源,再者,这种方式只消耗不多的逻辑单元就可以达到对时钟操作的目的。

偶数倍分频:偶数倍分频应该是大家都比较熟悉的分频,通过计数器计数是完全可以实现的。

如进行N倍偶数分频,那么可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。

以此循环下去。

这种方法可以实现任意的偶数分频。

module odd_division(clk,rst,count,clk_odd); /*count没必要放在端口中,这里只是为了仿真时观察*/input clk,rst;output clk_odd;output[3:0] count;reg clk_odd;reg[3:0] count;parameter N = 6; /*6分频* /always @ (posedge clk)if(! rst)begincount <= 1'b0;clk_odd <= 1'b0;endelseif ( count < N/2-1)begincount <= count + 1'b1;endelsebegincount <= 1'b0;clk_odd <= ~clk_odd;endendmodule奇数倍分频:归类为一般的方法为:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发进行模N计数,计数从零开始,到N-1)/2进行输出时钟翻转,然后经过(N+1)/2再次进行翻转得到一个占空比非50%奇数n分频时钟。

再者同时进行下降沿触发的模N计数,到和上升沿过(N-1)/2时,输出时钟再次翻转生成占空比非50%的奇数n分频时钟。

两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数n分频时钟。

module even_division(clk,rst,count1,count2,clk_even); /*count1,count2没必要放在端口中,这里只是为了仿真时观察*/input clk,rst;output[3:0] count1,count2;output clk_even;reg[3:0] count1,count2;reg clkA,clkB;wire clk_even,clk_re;parameter N = 5; /*5分频*/assign clk_re = ~clk;assign clk_even = clkA | clkB;always @(posedge clk)if(! rst)begincount1 <= 1'b0;clkA <= 1'b0;endelseif(count1 < (N - 1))begincount1 <= count1 + 1'b1; /*这里是非阻塞赋值是先执行了下面的IF判断,最后才赋的值。

最初看这程序时没注意,想了好半天*/if(count1 == (N - 1)/2)beginclkA <= ~clkA;endendelsebeginclkA <= ~clkA;count1 <= 1'b0;endalways @ (posedge clk_re)if(! rst)begincount2 <= 1'b0;clkB <= 1'b0;endelseif(count2 < (N - 1))begincount2 <= count2 + 1'b1;if(count2 == (N - 1)/2)beginclkB <= ~clkB;endendelsebeginclkB <= ~clkB;count2 <= 1'b0;endendmoduleVerilog HDL的分频器设计2009-12-03 10:22用D触发器实现2倍分频的Verilog描述?module divide2( clk , clk_o, reset);input clk , reset;output clk_o;wire in;reg out ;always @ ( posedge clk or posedge reset)if ( reset)out <= 0;elseout <= in;assign in = ~out;assign clk_o = out;endmodule用verilog实现分频的一点心得2007-08-04 22:40在用verilog编写程序的过程中,将时钟进行11分频,花了好多的心思才将其搞定。

通常实现偶数的分频比较容易,以十分频为例:always @( posedge clk or posedge reset)if(reset)begink<=0;clk_10<=0;endelseif(k==4)begink<=0;clk_10<=~clk_10;endelsek<=k+1;二分频最简单了,一句话就可以了:always @ (negedge clk)clk_2<=clk_2;若进行奇数分频,则稍微麻烦点,以11分频为例:always @( posedge clk)if(!reset)begini<=0;clk11<=0;endelseif(i==5)beginclk11<=~clk11;i<=i+1;endelseif(i==10)begini<=0;clk11<=~clk11;endelsei<=i+1;以上语句虽然可以实现,但是逻辑有点繁,弄不好就出错了,建议使用两个always语句来实现:always @( posedge clk)if(!reset)i<=0;elsebeginif(i==10)i<=0;elsei<=i+1;endalways @( posedge clk)if(!reset)clk11<=0;elseif((i==5)|(i==10))clk11<=~clk11;两个always,一个用来计数,一个用来置数。

另外,这个样子好像也可以,在时钟的上升沿和下降沿都计数,但是不被综合器综合,会提示敏感信号太复杂:always @( posedge clk or negedge clk)if(reset)begink<=0;clk_11<=0;endelseif(k==10)begink<=0;clk_11<=~clk_11;endelsek<=k+1;三分频的Verilog实现rickywu 发表于2005-12-12 11:14:00//很实用也是笔试面试时常考的,已经经过仿真占空比要求50%和不要求占空比差别会很大,先看一个占空比50%的描述module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;//internal counter signalsreg[1:0] count_a;reg[1:0] count_b;reg CLKOUT;always @(negedge RESETn or posedge CLKIN)beginif (RESETn==1'b0)count_a<=2'b00;elseif (count_a==2'b10)count_a<=2'b00;elsecount_a<=count_a+1;endalways @(negedge RESETn or negedge CLKIN)beginif (RESETn==1'b0)count_b<=2'b0;elseif (count_b==2'b10)count_b<=2'b00;elsecount_b<=count_b+1;endalways @(count_a or count_b or RESETn)beginif (RESETn==1'b0)CLKOUT=1'b0;else if((count_a+count_b==4)||(count_a+ count_b==1)) CLKOUT=~CLKOUT;endendmodule0 1 2 0 1 2\ / / \ \ / / \0 1 2 0 1 2下面是一个非50%的描述,只用了上升沿module div3(CLKIN,CLKOUT,RESETn);input CLKIN,RESETn;output CLKOUT;wire d;reg q1,q2;wire CLKOUT;always @(negedge RESETn or posedge CLKIN) beginif (RESETn==1'b0)q1<=1'b0;elseq1<=d;endalways @(negedge RESETn or posedge CLKIN)beginif (RESETn==1'b0)q2<=1'b0;elseq2<=q1;endassign d=~q1 & ~q2;assign CLKOUT=q2;endmodule占空比不是50%,只用了单沿触发器,寄存器输出。

至于其他奇数要求50%的或者不要求的占空比的,都可以参照上面两个例子做出。

相关主题