1. 偶数分频比较简单,如果分频系数是N(如果N是偶数,那么N/2是整数),那么在输入时钟的每隔N/2个周期时(计数器从0到N/2-1),改变输出时钟的电平即可得到50%固定占空比的时钟。需要的代码如下

  1. module even(clk_in,clk_out,rst_n);
  2. input clk_in;
  3. input rst_n;
  4. output clk_out;
  5.  
  6. parameter N=;
  7.  
  8. reg [:] cnt;
  9. reg clk_out;
  10.  
  11. always @(posedge clk_in or negedge rst_n) begin
  12. if(!rst_n) begin
  13. cnt<='b0000;
  14. clk_out<=;
  15. end
  16. else if(cnt==(N/-)) begin
  17. clk_out<=~clk_out;
  18. cnt<='b0000;
  19. end else cnt<=cnt+;
  20. end
  21. endmodule

2. 如果N是奇数,那么N/2非整数,使用2个寄存器,分别用上升沿寄存器计数到(N-1)/2-1电平翻转信号A,再计数到N-1电平翻转信号A,再用下降沿寄存器计数到(N-1)/2-1电平翻转信号B,再计数到N-1电平翻转信号B,,得到两个波形A和B,然后A和B相或即可,代码如下:

  1. module div3(clk,clk_out,rst_n);
  2. input clk,rst_n;
  3. output clk_out;
  4.  
  5. reg [:] cnt_p,cnt_n;
  6. reg clk_p,clk_n;
  7. parameter N=;
  8.  
  9. always @(posedge clk or negedge rst_n) begin
  10. if(!rst_n)
  11. cnt_p<='h0;
  12. else if(cnt_p==N-)
  13. cnt_p<=;
  14. else cnt_p<=cnt_p+;
  15. end
  16.  
  17. always @(negedge clk or negedge rst_n) begin
  18. if(!rst_n)
  19. cnt_n<='h0;
  20. else if(cnt_n==N-)
  21. cnt_n<=;
  22. else cnt_n<=cnt_n+;
  23. end
  24.  
  25. always @(posedge clk or negedge rst_n) begin
  26. if(!rst_n)
  27. clk_p<=;
  28. else if(cnt_p==(N-)/-)
  29. clk_p<=~clk_p;
  30. else if(cnt_p==(N-))
  31. clk_p<=~clk_p;
  32. end
  33.  
  34. always @(negedge clk or negedge rst_n) begin
  35. if(!rst_n)
  36. clk_n<=;
  37. else if(cnt_n==(N-)/-)
  38. clk_n<=~clk_n;
  39. else if(cnt_n==(N-))
  40. clk_n<=~clk_n;
  41. end
  42. assign clk_out=clk_n|clk_p;
  43. endmodule

仿真截图如下

3. 半整数分频,本次以2.5分频为例子

  1. //===========================================================
  2. // Author: seuchenrui@126.com
  3. //
  4. // Description:
  5. // This is a simple verilog code for clock frequency division
  6. // this code can be used to get
  7. // 1. divided by 2.5
  8. //===========================================================
  9. module iCLK_div_shift_register_25
  10. (
  11. input iCLK,
  12. input iRESET,
  13. output oCLK
  14. );
  15.  
  16. wire [:] tmp_shift;
  17.  
  18. reg tmp_0_;
  19. reg tmp_2_;
  20. reg tmp_3_;
  21.  
  22. reg [:] tmp;
  23. assign tmp_shift = 'b0_0001;
  24.  
  25. always@(posedge iCLK or negedge iRESET)
  26. begin
  27. if(!iRESET)
  28. tmp<=tmp_shift;
  29. else
  30. tmp<={tmp[:], tmp[]};
  31. end
  32.  
  33. always@(negedge iCLK or negedge iRESET)
  34. begin
  35. if(!iRESET)
  36. tmp_0_<='b0;
  37. else
  38. tmp_0_<=tmp[];
  39. end
  40.  
  41. always@(negedge iCLK or negedge iRESET)
  42. begin
  43. if(!iRESET)
  44. tmp_2_<='b0;
  45. else
  46. tmp_2_<=tmp[];
  47. end
  48.  
  49. always@(negedge iCLK or negedge iRESET)
  50. begin
  51. if(!iRESET)
  52. tmp_3_<='b0;
  53. else
  54. tmp_3_<=tmp[];
  55. end
  56.  
  57. assign oCLK = tmp[]|tmp[]|tmp_0_|tmp_2_|tmp_3_|tmp[];
  58.  
  59. endmodule

3. 半整数分频,这个主要是利用时钟的上升沿和下降沿进行计数。不过分出来的占空比不是50%。问题在于如果被分的时钟不是50%占空比,那么按照下面出来的时钟频率还对吗?不对。

  1. //2.5分频
  2.  
  3. module div_5(clk,clk_div, rst, temp_out1, temp_out2);//N+0.5
  4. input clk;
  5. input rst;
  6. output clk_div;
  7. reg [:] cnt1,cnt2;
  8. //output reg temp1,temp2;
  9. reg temp1,temp2;
  10. output temp_out1, temp_out2;
  11. parameter N = ; //设定分频系数为N+0.5
  12. reg start_negedge;
  13. //inital语句不可被综合
  14. //initial
  15. //begin
  16. // temp1=0;temp2=1;
  17. //end //首先进行初始化,temp1=0;temp2=1
  18.  
  19. //所有的判断信号都要写入
  20.  
  21. always @(posedge clk or negedge rst) //temp1上升沿跳变
  22. begin
  23.  
  24. if(!rst)
  25. begin
  26. cnt1<='b0;
  27. temp1<=;
  28. start_negedge <= ;
  29. end
  30.  
  31. else begin
  32.  
  33. if(cnt1 == *N)
  34. begin cnt1<='b0;end
  35.  
  36. else begin cnt1 <= cnt1 + 'b1;end
  37.  
  38. if(cnt1=='b0) begin temp1<=1; start_negedge <= 1;end //高电平时间为N+1;
  39. else if(cnt1==N+) begin temp1<=;end //低电平时间为N;
  40. end
  41.  
  42. end
  43.  
  44. always@(negedge clk or negedge rst) //temp2下降沿跳变
  45. begin
  46. if(!rst)
  47. begin
  48. cnt2<='b0;
  49. temp2<=; end
  50. else if(start_negedge == )
  51. begin
  52. cnt2<='b0;
  53. temp2<=; end
  54. else begin
  55.  
  56. if(cnt2==*N) //2*N
  57. begin cnt2<='d0;end
  58. else begin cnt2<=cnt2+'d1;end
  59. if(cnt2=='d0) begin temp2<=0;end //低电平时间为N;
  60. else if(cnt2==N) begin temp2<=;end //高电平时间为N+1;
  61. end
  62.  
  63. end
  64.  
  65. assign clk_div=temp1&temp2; //逻辑与
  66. assign temp_out1 = temp1;
  67. assign temp_out2 = temp2;
  68. endmodule

仿真截图如下

FPGA等占空比奇偶分频和半整数分频的更多相关文章

  1. 基于Verilog的偶数、奇数、半整数分频以及任意分频器设计

    在FPGA的学习过程中,最简单最基本的实验应该就是分频器了.由于FPGA的晶振频率都是固定值,只能产生固定频率的时序信号,但是实际工程中我们需要各种各样不同频率的信号,这时候就需要对晶振产生的频率进行 ...

  2. 基于verilog的分频器设计(半整数分频,小数分频:下)

    第二种方法:对进行奇数倍n分频时钟,首先进行n/2分频(带小数,即等于(n-1)/2+0.5),然后再进行二分频得到.得到占空比为50%的奇数倍分频.下面讲讲进行小数分频的设计方法. 小数分频:首先讲 ...

  3. 基于verilog的分频器设计(奇偶分频原理及其电路实现:上)

    在一个数字系统中往往需要多种频率的时钟脉冲作为驱动源,这样就需要对FPGA的系统时钟(频率太高)进行分频.分频器主要分为奇数分频,偶数分频,半整数分频和小数分频,在对时钟要求不是很严格的FPGA系统中 ...

  4. 关于分频器的FPGA实现整理思路

    分频器是用的最广的一种FPGA电路了,我最初使用的是crazybingo的一个任意分频器,可以实现高精度任意分频的一个通用模块,他的思想在于首先指定计数器的位宽比如32位,那么这个计数器的最大值就是2 ...

  5. FPGA数字鉴相鉴频器的开发记录

    1. 对于电机的锁相控制,需要对相差进行PI性质的环路滤波,但现有的锁相环中鉴频鉴相器输出为相差脉冲而非数字量,难以直接进行PI特性的环路滤波. 通过对晶振的非整数分频获取准确的参考时钟,基于触发器机 ...

  6. FPGA奇数分频

    在FPGA设计中,分频是很常用的一个基本功能,一般来说,如果需要偶数分频即2次幂的整数倍,这个就很简单了,如2.4.8.16.32.64等这些以2的整数倍的. 这里说的是奇数倍分频,如时钟是100MH ...

  7. FPGA三分频,五分频,奇数分频

    我们在做FPGA设计时,有时会用到时钟频率奇数分频的频率,例如笔者FPGA的晶振为50M,当我们需要10M的时钟时,一种方式可以使用DCM或PLL获取,系统会内部分频到10M,但其实VERILOG内部 ...

  8. FPGA分频与倍频的简单总结(涉及自己设计,调用时钟IP核,调用MMCM原语模块)

    原理介绍 1.分频 FPGA设计中时钟分频是重要的基础知识,对于分频通常是利用计数器来实现想要的时钟频率,由此可知分频后的频率周期更大.一般而言实现偶数系数的分频在程序设计上较为容易,而奇数分频则相对 ...

  9. [原创][FPGA]时钟分频之奇分频(5分频)

    0. 简介 有时在基本模块的设计中常常会使用到时钟分频,时钟的偶分频相对与奇分频比较简单,但是奇分频的理念想透彻后也是十分简单的,这里就把奇分频做一个记录. 1. 奇分频 其实现很简单,主要为使用两个 ...

随机推荐

  1. Java Android 32位16位 MD5加密

    // md5加密 32位小写 private String Md5(String sourceStr) { String result = ""; try { MessageDig ...

  2. IOS 应用管理(九宫格) 总结笔记

    1. 开发前的思路 ========================================1> 从mainBundle中加载Plist2> 按照plist中的数据数量先确定各个a ...

  3. Android(java)学习笔记27:TextView属性大全

    TextView属性大全: android:autoLink       设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/ph ...

  4. 前端HTML5几种存储方式

    h5之前,存储主要是用cookies.cookies缺点有在请求头上带着数据,大小是4k之内.主Domain污染. 主要应用:购物车.客户登录 对于IE浏览器有UserData,大小是64k,只有IE ...

  5. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊 【分块】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 ...

  6. 使用ParseExact方法将字符串转换为日期格式

    实现效果: 知识运用: DateTime结构的ParseExact方法 public static DateTime ParseExact(string s,string format,IFormat ...

  7. 2018.11.22 mac中"允许所有安装来源"的命令 & Mac窗口标题显示文件的路径

    当Mac遇到软件无法安装或者此文件已经损坏之类的时候 原因是软件为破解版,地址来源已改变,被系统拦截了,解决办法就是直接在终端中输入"sudo spctl --master-disable ...

  8. js时间日期格式

    Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, //month &quo ...

  9. java常见验证邮箱、电话号码、日期等格式

    package besttone.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 90%的验证 ...

  10. 1..net转java背景介绍

    注册博客2年了.从注册就开始接触.net.以前也有想过转java.只是没想过会这么快. .net语法这么优美好用.可惜了生态环境. .net还没有学成大神.就要离开了. 公司有个项目要用java.在加 ...