Verilog分频器设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Verilog分频器设计

module adder(clk,z);

output z;

reg q;

reg z;

always@(posedge clk)

begin

if(q%9==0)

z<=q;

else

q=q+1;

end

endmodule

module counter9(clk,datein,z); output z;

input clk;

input datein;

reg z;

reg[3:0] q;

always@(posedge clk)

begin

q<=q+1;

if (q==4'b1001)

begin

q<=4'b0000;

z<=datein;

end

end

endmodule

2008-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)

begin

count <= 1'b0;

clk_odd <= 1'b0;

end

else

if ( count < N/2-1)

begin

count <= count + 1'b1;

end

else

begin

count <= 1'b0;

clk_odd <= ~clk_odd;

end

endmodule

奇数倍分频:归类为一般的方法为:对于实现占空比为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)

begin

count1 <= 1'b0;

clkA <= 1'b0;

end

else

if(count1 < (N - 1))

begin

count1 <= count1 + 1'b1; /*这里是非阻塞赋值是先执行了下面的IF判断,最后才赋的值。最初看这程序时没注意,想了好半天*/

if(count1 == (N - 1)/2)

begin

clkA <= ~clkA;

end

end

else

begin

clkA <= ~clkA;

count1 <= 1'b0;

end

always @ (posedge clk_re)

if(! rst)

begin

count2 <= 1'b0;

clkB <= 1'b0;

end

else

if(count2 < (N - 1))

begin

count2 <= count2 + 1'b1;

if(count2 == (N - 1)/2)

begin

clkB <= ~clkB;

end

end

else

begin

clkB <= ~clkB;

count2 <= 1'b0;

end

相关文档
最新文档