原创 FPGA学习笔记1——分频电路设计

2015-10-30 23:29 2852 12 15 分类: FPGA/CPLD

    分频就是用一个时钟信号通过一定的电路结构变成不同频率的时钟信号,这里介绍一下整数分频电路的设计方法。整数分频电路有偶数分频和奇数分频两种,我们以实现占空比为50%的分频电路为例子来解释一下分频电路设计的基本原理。假设时钟周期为T,则二分频后输出的时钟周期为2T,三分频后输出的时钟周期为3T,N分频后输出的时钟周期为NT,这是设计分析的基本思路。

1.偶数分频实现

二分频电路设计

二分频电路的实现是最为简单的,只需要用一个D触发器便能实现,因为D触发的输出值每隔一个输入时钟周期T才更新一次值,所以我们只要每次D触发器寄存值的时候把它的输出值取反就可以了,这样它的高电平持续时间为T,低电平持续时间也为T,则为二分频。具体的代码如下所示。
  1. module clkdiv(clk,rst_n,clk_2);
  2. input clk,rst_n;
  3. output clk_2;
  4. reg q;
  5.  
  6. always @(posedge clk or negedge rst_n)
  7. if(!rst_n)
  8. q<=1'b0;
  9. else 
  10. q<=~q;
  11.  
  12. assign clk_2=q;
  13. endmodule
这个设计非常简单,不作过多解释。
 
 
 

六分频电路设计

按照设计的思路,六分频总的时钟周期应该为6T,高电平持续时间为3T,低电平持续时间为3T,我们只需要用一个0-5的计数器,计数从0到5一直循环,当计数器为0,1,2时,输出高电平,计数器为3,4,5时,输出低电平。
 
具体代码实现如下
  1. module clkdiv6(clk,rst_n,clk_2);
  2. input clk,rst_n;
  3. output clk_2;
  4. reg [2:0] q; //因为用到0-5的计数器,一共要3位D触发器
  5. reg clk_2;
  6. always @(posedge clk or negedge rst_n)
  7.   if (!rst_n)
  8. q<=3'd0;
  9. else if(q==3'd5)
  10. q<=3'd0;
  11. else
  12. q<=q+1'b1;
  13.  
  14. always @(posedge clk or negedge rst_n)
  15. if(!rst_n)
  16. clk_2<=1'b0;
  17. else if(q<3'd3)
  18. clk_2<=1'b1;
  19. else
  20. clk_2<=1'b0;
  21. endmodule
20151029232305248.jpg
 
经过仿真,符合六分频的设计思路,占空比也为50%,3T的时间为高电平,3T的时间为低电平。
 
 
 

2N分频电路设计思路

偶数分频电路的基本实现思路就是利用计数器,利用0-(2N-1)的计数器,当计数器计数在0-(N-1)的时候输出高电平,其余时间输出低电平就可以完成占空比50%的2N分频电路了
 
 
 
 
 

2.奇数分频实现

三分频电路实现

三分频的电路如果按照偶数分频的思想来设计就会遇到一个难题,因为是奇数,不能做到计数器计数到一半的时候输出取反,也就是说按照偶数分频的思路做不到占空比50%,在这里要换一个思路来设计。我们仍然分析一下三分频电路的特点,三分频电路的周期为3T,高电平持续时间为1.5T,低电平持续时间也为1.5T。假设用上面的思路,用1个计数器来分频,则也可以得到三分频,但是占空比为66.7%,即高电平持续时间为2T,低电平持续时间为1T。以下为占空比50%的三分频电路实现,用2个三进制计数器,第1个为时钟上升沿触发,第2个为时钟下降沿触发。对第1个计数器而言,小于2取高电平则,0-2T为高电平,2T-3T为低电平,对第2个计数器而言,小于2取高电平,则0.5T-2.5T为高电平,2.5T-3.5T为低电平,实质上第2个的波形延时了0.5T,他们公共的取高电平的时间为0.5T-2T,刚好是1.5T,正式三分频占空比为50%高电平所持续的时间。下面为具体代码实现。
 
  1. module clkdiv3(clk,rst_n,clk_2);
  2. input clk,rst_n;
  3. output clk_2;
  4. reg [1:0]count1;//上升沿触发的3进制计数器1
  5. reg [1:0]count2;//下降沿触发的3进制计数器2
  6. reg clk_p,clk_n;
  7. always @(posedge clk or negedge rst_n)//上升沿触发的3进制计数器1
  8. if(!rst_n)
  9. count1<=2'd0;
  10. else if(count1==2'd2)
  11. count1<=1'b0;
  12. else 
  13. count1<=count1+1'b1;
  14. always  @(posedge clk or negedge rst_n)
  15. if(!rst_n)
  16. clk_p<=1'b0;
  17. else if(count1<2'd2)
  18. clk_p<=1'b1;
  19. else 
  20. clk_p<=1'b0;
  21. always @(negedge clk or negedge rst_n)//下降沿触发的3进制计数器2
  22. if(!rst_n)
  23. count2<=2'd0;
  24. else if(count2==2'd2)
  25. count2<=2'd0;
  26. else 
  27. count2<=count2+1'b1;
  28. always @(negedge clk or negedge rst_n)
  29. if(!rst_n)
  30. clk_n<=1'b0;
  31. else if (count2<2'd2)
  32. clk_n<=1'b1;
  33. else 
  34. clk_n<=1'b0;
  35. assign clk_2=clk_p&clk_n;
  36. endmodule
 
仿真的波形图如下20151030190155771.jpg
 
 
可见,实现了三分频占空比为50%的功能,但是仍然有不足的地方就是相位不是和原始时钟同相,延迟了0.5T。

 

 

五分频电路设计

按照三分频的分频思路,五分频的代码如下
  1. module clkdiv5(clk,rst_n,clk_2);
  2. input clk,rst_n;
  3. output clk_2;
  4. reg [2:0]count1;//上升沿触发的5进制计数器1
  5. reg [2:0]count2;//下降沿触发的5进制计数器2
  6. reg clk_p,clk_n;
  7. always @(posedge clk or negedge rst_n)//上升沿触发的5进制计数器1
  8. if(!rst_n)
  9. count1<=3'd0;
  10. else if(count1==3'd4)
  11. count1<=1'b0;
  12. else 
  13. count1<=count1+1'b1;
  14. always  @(posedge clk or negedge rst_n)
  15. if(!rst_n)
  16. clk_p<=1'b0;
  17. else if(count1<5'd4)
  18. clk_p<=1'b1;
  19. else 
  20. clk_p<=1'b0;
  21. always @(negedge clk or negedge rst_n)//下降沿触发的5进制计数器2
  22. if(!rst_n)
  23. count2<=3'd0;
  24. else if(count2==3'd4)
  25. count2<=3'd0;
  26. else 
  27. count2<=count2+1'b1;
  28. always @(negedge clk or negedge rst_n)
  29. if(!rst_n)
  30. clk_n<=1'b0;
  31. else if (count2<3'd4)
  32. clk_n<=1'b1;
  33. else 
  34. clk_n<=1'b0;
  35. assign clk_2=clk_p&clk_n;
  36. endmodule
20151030222128690.jpg
 
 
设计的思路和三分频一样,只是把计数器的进制改动了,并且把翻转时的判断逻辑改动了。
 
 

总结

按照以上偶数分频和奇数分频的方法,可以设计任意的N分频电路,以获得占空比为50%的时钟,不足之处是奇数分频不能获得与时钟同相的波形。
 

文章评论3条评论)

登录后参与讨论

用户1722105 2015-12-31 14:53

奇数分频有问题。

用户1847540 2015-12-21 10:42

谢谢作者分享

用户402158 2015-11-4 16:22

谢谢分享~
相关推荐阅读
广州老伯 2015-11-18 21:40
FPGA学习笔记6——VGA显示图片
VGA显示图片 在上一个笔记熟悉了VGA的时序后,显示了一个翡翠台彩条的图片,采用的思想是在vga_output模块上,根据x,y坐标的不同,把图片分成了三个800*200的区域,分别在三个区域上显示...
广州老伯 2015-11-07 23:51
FPGA学习笔记5——VGA驱动
VGA驱动     VGA接口是一个常用到的接口,今天笔者带大家来探讨下怎么样编写VGA驱动。从数据手册上我们可以看到VGA接口一共有15个引脚,但其实真正需要我们去操作的只有5个引脚,他们分...
广州老伯 2015-11-05 21:24
FPGA学习笔记4——PLL的IP核使用
PLL的IP核使用    PLL锁相环的IP核应该是在FPGA开发中用得最多的一个模块了,下面介绍如何使用PLL的IP核。首先,我们新建一个工程,新建一个verilog文件,保存。    然后选择to...
广州老伯 2015-11-05 13:18
FPGA学习笔记3——booth乘法器设计
Booth乘法器设计booth乘法器是一种可以计算带符号数的乘法器,他的实现思维较为简单,具体的重要逻辑是设乘数分别为a[3:0]和b[3:0],积为y[8:1],在这里y其实是一个9位的寄存器,只不...
广州老伯 2015-11-03 17:24
FPGA学习笔记2——传统乘法器设计
传统乘法器设计传统乘法器我们以传统的乘法竖式计算为例说明一下。以10*9为例,即二进制1010*1001有  1 0 1 0                   X    1 0 0 1     ...
我要评论
3
12
关闭 站长推荐上一条 /2 下一条