当前位置:   article > 正文

【FPGA学习】时钟分频_fpga时钟分频

fpga时钟分频

概况:

用一个频率块的时钟产生一个频率小的时钟

实验目的:

掌握任意就分频的写法

原理:

一般来说 开发板上面只有一个晶振,即只有一种时钟频率,但是我们有时候需要用到不同频率的时钟,若想要更慢的时钟,则可以将该固定的是何种进行分频,若想要更快的时钟,则可以在这个固定的时钟上进行倍频。无论是分频还是倍频,我们都有两种方法,一种你是使用pll核,另外一种是手动用verilog hdl描述。(适用于整数比的分频),只有调用pll核才能进行倍频,一般在进行非整数比的分频或者倍频的情况下都使用pll核pll为专用电路他生成的时钟到每一级寄存器时间延迟是固定的,称这个时钟网络的时钟偏斜比较小

     假如我们要做一个四分频(当前时钟周期的四倍)的时钟,首先我们需要确定是否有四个周期的,然后用一个计数器来记时钟的周期的个数,将连续的一般固定时钟周几设置为高(1),另外连续的一半设置为低(0)。、

四分频

  1. module div_clk_4(
  2. input wire clk,
  3. input wire rst,//高电平有效,XILINX器件提倡高电平有效
  4. output reg clk_4
  5. );
  6. reg [1:0] div_cnt;
  7. always @(posedge clk )begin
  8. if(rst == 1'b1)begin
  9. div_cnt <= 'd0;
  10. end
  11. else if(div_cnt == 2'd3) begin
  12. div_cnt <= 'd0;
  13. end
  14. else begin
  15. div_cnt <= div_cnt + 1'b1;
  16. end
  17. end
  18. always @(posedge clk )begin
  19. if(rst == 1'b1)begin
  20. clk_4 <= 1'b0;
  21. end
  22. else if (div_cnt == 2'd1)begin
  23. clk_4 <= 1'b1;
  24. end
  25. else if (div_cnt == 2'd3)begin
  26. clk_4 <= 1'b0;
  27. end
  28. end
  29. endmodule

tesbench

  1. `timescale 1ns/1ns
  2. module tb_div_clk_4();
  3. reg clk;
  4. reg rst;
  5. wire clk_4;
  6. div_clk_4 u_div_clk_4(
  7. .clk (clk),
  8. .rst (rst),
  9. .clk_4 (clk_4)
  10. );
  11. always #10 clk = ~clk;
  12. initial begin
  13. clk = 0;
  14. rst = 1;
  15. #100
  16. rst = 0;//退出复位
  17. end
  18. endmodule

 

 十六分频

  1. /* */
  2. module div_clk_16(
  3. input wire clk,
  4. input wire rst,
  5. output reg [1:0] po_cnt = 'd0
  6. );
  7. reg [1:0] div_cnt;
  8. reg clk_4;
  9. always @(posedge clk )begin
  10. if(rst == 1'b1)begin
  11. div_cnt <= 'd0;
  12. end
  13. else if(div_cnt == 2'd3) begin
  14. div_cnt <= 'd0;
  15. end
  16. else begin
  17. div_cnt <= div_cnt + 1'b1;
  18. end
  19. end
  20. always @(posedge clk )begin
  21. if(rst == 1'b1)begin
  22. clk_4 <= 1'b0;
  23. end
  24. else if (div_cnt == 2'd1)begin
  25. clk_4 <= 1'b1;
  26. end
  27. else if (div_cnt == 2'd3)begin
  28. clk_4 <= 1'b0;
  29. end
  30. end
  31. always @(posedge clk_4 )begin
  32. if(rst == 1'b1)begin
  33. po_cnt <= 1'b0;
  34. end
  35. else if (po_cnt == 2'd3)begin
  36. po_cnt <= 'd0;
  37. end
  38. else begin
  39. po_cnt <= po_cnt + 1'b1;
  40. end
  41. end
  42. endmodule

 tesbench

  1. `timescale 1ns/1ns
  2. module tb_div_clk_16();
  3. reg clk;
  4. reg rst;
  5. wire [1:0] po_cnt;
  6. div_clk_16 u_div_clk_16(
  7. .clk (clk),
  8. .rst (rst),
  9. .po_cnt (po_cnt)
  10. );
  11. always #10 clk = ~clk;
  12. initial begin
  13. clk = 0;
  14. rst = 1;
  15. #100
  16. rst = 0;
  17. end
  18. endmodule

可见po_cnt信号出现异常,这是由于同步复位所导致的,如果将复位信号“后推”能否解决,答案是不能的因为一旦rst复位信号后延那么div_cnt也随之后延,最后仍然检测不到rst == 1的状态。

 故给po_cnt赋值一个初始值即可解决问题

xilinx建议的复位准则(原文连接xilinx建议的复位准则_leave_her_johnny的博客-CSDN博客_xilinx 复位

1.尽量少用复位 

FPGA提供专用的全局复位置位信号GSR,在配置结束后,寄存器状态初始化到设定值或者默认逻辑零状态

控制路径可能需要复位,数据路径通常不需要复位

使用功能仿真可判断是否需要复位

少用复位整体上改善性能,减小面积和功耗

 2.必须复位时采用同步复位

同步复位可直接映射到FPGA架构中的更多功能器件

DSP48、块RAM只提供同步复位

3.确保使用高电平有效复位 

  1. 因为XILINX内SLICE和内部逻辑等为高电平复位有效,用低电平需要反相器

 4.避免异步复位

如果使用异步复位,则异步复位同步释放 

关于时钟域的一些笔记

        上图可见有两个时钟域,时钟域一是由晶振输入的它所走的是全局时钟网络(这个网络在设计芯片的时候已经布局好了,在未来使用过程中到达每一级寄存器的时间是几乎相等的

对于clk_4的时钟网络,是由我们自己分频出来的,在设计初期没办法设计走线,所以由自己设计出来的分频时钟走的是普通数据线,(到达每一级寄存器的时间延迟是不一样的),延时一旦不一样就会导致时钟的偏斜(Clock Skew))偏大。这种延误会导致时钟的错误。

所以这种自分频的时钟最好不要使用。

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

闽ICP备14008679号