当前位置:   article > 正文

Lesson02:分频计数器设计(含特权同学课后题答案)_verilog分频计数器作用

verilog分频计数器作用

特权同学《Verilog边码边学》,B站教学视频链接:101 组合逻辑与时序逻辑_哔哩哔哩_bilibili

目录

Lesson02:分频计数器设计

一、分频时钟的工程应用

二、Verilog实现分频计数器

三、课后题


一、分频时钟的工程应用

1、对FPGA系统时钟(频率较高)进行分频,产生分频时钟(频率较低)

2、分频时钟可以作为FPGA低速外设的同步时钟

  • IIC总线的时钟(≤400KHz)

  • 低速SPI总线的时钟(≤1MHz)

3、对于频率较高的分频时钟,不能直接作为外设时钟或FPGA内部时钟使用,这类时钟应该由FPGA内部的PLL邓时钟管理单元产生

二、Verilog实现分频计数器

  • 功能需求:输入时钟100MHz,产生一个1MHz的低频时钟

分析:

① 100MHz / 1MHz = 100,翻译一下就是每100个输入时钟周期是1个输出时钟周期

② 需要对100MHz时钟做100分频

③ 计数器循环计数周期为0-99,那么前50个输入时钟就是输出时钟的高电平,后50个时钟是输出时钟的低电平

  • 代码实现:当计数器为0-49时输出高电平,计数器为50-99时输出低电平

  1. `timescale 1ns/1ps
  2. module vlg_design(
  3. input clk,
  4. input rst_n,
  5. output reg clk_1mhz
  6.    );
  7. //`define CNT_MAX 100
  8. //`define CNT_MAX_DIV2 `CNT_MAX/2
  9. localparam CNT_MAX = 8'd100; //时钟为高电平
  10. localparam CNT_MAX_DIV2 = 8'd50; //时钟为高电平的一半
  11. reg[7:0] cnt; // 8bit计数器
  12. always @(posedge clk)
  13. //同步复位,当rst_n为低电平时复位
  14. if(!rst_n) cnt <= 8'd0;
  15. else if(cnt < (CNT_MAX-1)) cnt <= cnt+1'b1;
  16. else cnt <= 8'd0;
  17. always @(posedge clk)
  18. if(!rst_n) clk_1mhz <= 8'd0;
  19. else if(cnt < CNT_MAX_DIV2) clk_1mhz <= 1'b1;
  20. else clk_1mhz <= 1'b0;
  21. endmodule
  • 结果展示

三、课后题

  • 功能需求:输入时钟25MHz,产生一个400KHz的低频时钟

由于25MHz/400KHz=62.5,是小数分频,由于只能在上升沿或下降沿触发,所以只能等效为输入时钟的625个周期是输出时钟的10个周期,需要满足以下公式:

 先做5次62分频,再做5次63分频,得到625个输入时钟周期,之后令分频时钟在625个分频时钟内跳变20次共10个周期。

可以取公约数,最终就是先做1次62分频(前31个输入时钟周期为高电平,后31个输入时钟周期为低电平),再做1次63分频(前31个输入时钟周期为高电平,后32个输入时钟周期为低电平),得到125个输入时钟周期,之后令分频时钟在125个分频时钟内跳变4次共2个周期。

这个方法被称作”双模前置小数分频“,其最重要的核心是M分频(62)和M+1分频(63)这个相近频率。

  • 代码实现

  1. `timescale 1ns/1ps
  2. module vlg_design(
  3. input clk,
  4. input rst_n,
  5. output reg clk_400khz
  6.    );
  7. //`define CNT_MAX 100
  8. //`define CNT_MAX_DIV2 `CNT_MAX/2
  9. localparam div_e = 8'd62; //62分频周期数,1个输出周期
  10. localparam div_o = 8'd63; //63分频周期数,1个输出周期
  11. localparam change = 8'd62; //电平转换
  12. reg[8:0] cnt; // 8bit计数器
  13. reg[8:0] cnt62; // 8bit计数器
  14. reg[8:0] cnt63; // 8bit计数器
  15. always @(posedge clk) begin
  16. //同步复位,当rst_n为低电平时复位
  17. if(!rst_n) begin
  18. cnt <= 8'd0;
  19. cnt62 <= 8'd0;
  20. cnt63 <= 8'd0;
  21. end
  22. else begin
  23. if(cnt < change) begin
  24. cnt62 <= cnt62 + 1'b1; //当cnt<62时,cnt62从0增加至61
  25. cnt <= cnt + 1'b1;
  26. end
  27. else begin
  28. if(cnt63 == div_o - 1) cnt63 <= 8'd0;
  29. else cnt63 <= cnt63 + 1'b1; //当cnt≥62时,cnt63从0增加至62
  30. end
  31. end
  32. end
  33. always @(posedge clk) begin
  34. if(!rst_n) begin
  35. clk_400khz <= 1'b0;
  36. end
  37. else begin
  38. if(cnt < change) begin
  39. if(cnt62 < 8'd31)
  40. clk_400khz <= 1'b1;
  41. else
  42. clk_400khz <= 1'b0;
  43. end
  44. else begin
  45. if(cnt63 < 8'd31)
  46. clk_400khz <= 1'b1;
  47. else
  48. clk_400khz <= 1'b0;
  49. end
  50. end
  51. end
  52. endmodule
  • 结果展示

 这里取了两个周期,2T=5us,400KHz的分频时钟周期为2.5us,可以得到仿真结果是正确的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/411171
推荐阅读
相关标签
  

闽ICP备14008679号