当前位置:   article > 正文

FPGA_学习_10_IP核_PLL_fpga配置ip核

fpga配置ip核

 

片上资源的使用,或者说IP核的使用,是FPGA编程要学习的分量很重的一部分内容。 其中最常见的就要属PLL了,时钟是一切程序的基础。 PLL的时钟倍频功能是用户自己手撕代码无法实现的,但使用PLL IP核,几步简单的图像界面的操作就能个实现。本文的内容就是配置一个PLL IP核,并在我们的FPGA代码中调用。

 

目录

1 PLL IP核配置步骤

2 测试代码

3 约束文件

4 运行结果


1 PLL IP核配置步骤

(Vivado 赛灵思)

 

 

我看的教程里面,那个兄弟是选的下面这个。 看来还是比较注重开发效率。

下面按照截图路径打开这个veo文件,学习如何在FPGA程序中例化IP核(有点像C++你创建了一个类,然后你实例化一个)。

2 测试代码

现在咱们有3个不同频率的时钟了,我们用这三个时钟计数到同样的值,然后点灯。 就能看出时钟频率的区别。由于灯只有两个,所以实验分成了两次,一次是50MHz时钟和100MHz时钟的对比,一次是50MHz时钟和25MHz时钟的对比。

  1. `timescale 1ns / 1ps
  2. module pll(
  3. input wire clk ,
  4. input wire rst_n ,
  5. output wire [1:0] led
  6. );
  7. //==================================================================
  8. // Parameter define
  9. //==================================================================
  10. localparam CNT_MAX = 50_000_000 - 1;
  11. //==================================================================
  12. // Internal Signals
  13. //==================================================================
  14. // IP_PLL 输出信号引出
  15. wire clk_out1 ; // 注意,这里用的wire类型
  16. wire clk_out2 ;
  17. wire clk_out3 ;
  18. wire locked ;
  19. reg [31:0] timer1cnt ;
  20. reg [31:0] timer2cnt ;
  21. reg [31:0] timer3cnt ;
  22. reg [1:0] led_r ;
  23. assign led = ~led_r;
  24. IP_PLL inst_pll
  25. (
  26. .clk_out1(clk_out1), // output clk_out1 50MHz 0
  27. .clk_out2(clk_out2), // output clk_out2 100MHz 90
  28. .clk_out3(clk_out3), // output clk_out3 25MHz 0
  29. .reset(~rst_n), // input reset 默认高有效,我们的复位信号是低有效,遂取反
  30. .locked(locked), // output locked
  31. .clk_in1(clk) // input clk_in1 我们的输入时钟信号是clk
  32. );
  33. //----------------------------- clk_out1 and timer1cnt and locked -----------------------------
  34. always @(posedge clk_out1 or negedge rst_n) begin
  35. if (rst_n == 1'b0) begin
  36. timer1cnt <= 'd0;
  37. end
  38. else if (locked == 1'b1) begin
  39. if (timer1cnt == CNT_MAX) begin
  40. timer1cnt <= 'd0;
  41. end
  42. else begin
  43. timer1cnt <= timer1cnt + 1'b1;
  44. end
  45. end
  46. else begin
  47. timer1cnt <= 'd0;
  48. end
  49. end
  50. //----------------------------- clk_out2 and timer2cnt and locked -----------------------------
  51. always @(posedge clk_out2 or negedge rst_n) begin
  52. if (rst_n == 1'b0) begin
  53. timer2cnt <= 'd0;
  54. end
  55. else if (locked == 1'b1) begin
  56. if (timer2cnt == CNT_MAX) begin
  57. timer2cnt <= 'd0;
  58. end
  59. else begin
  60. timer2cnt <= timer2cnt + 1'b1;
  61. end
  62. end
  63. else begin
  64. timer2cnt <= 'd0;
  65. end
  66. end
  67. //----------------------------- clk_out3 and timer3cnt and locked -----------------------------
  68. always @(posedge clk_out3 or negedge rst_n) begin
  69. if (rst_n == 1'b0) begin
  70. timer3cnt <= 'd0;
  71. end
  72. else if (locked == 1'b1) begin
  73. if (timer3cnt == CNT_MAX) begin
  74. timer3cnt <= 'd0;
  75. end
  76. else begin
  77. timer3cnt <= timer3cnt + 1'b1;
  78. end
  79. end
  80. else begin
  81. timer3cnt <= 'd0;
  82. end
  83. end
  84. //----------------------------- clk_out1 led -----------------------------
  85. always @(posedge clk_out1 or negedge rst_n) begin
  86. if (rst_n == 1'b0) begin
  87. led_r[0] <= 1'b0;
  88. end
  89. else if (timer1cnt == CNT_MAX) begin
  90. led_r[0] <= ~led_r[0];
  91. end
  92. else begin
  93. led_r[0] <= led_r[0];
  94. end
  95. end
  96. // //----------------------------- clk_out2 led -----------------------------
  97. // always @(posedge clk_out2 or negedge rst_n) begin
  98. // if (rst_n == 1'b0) begin
  99. // led_r[1] <= 1'b0;
  100. // end
  101. // else if (timer2cnt == CNT_MAX) begin
  102. // led_r[1] <= ~led_r[1];
  103. // end
  104. // else begin
  105. // led_r[1] <= led_r[1];
  106. // end
  107. // end
  108. //----------------------------- clk_out3 led -----------------------------
  109. always @(posedge clk_out3 or negedge rst_n) begin
  110. if (rst_n == 1'b0) begin
  111. led_r[1] <= 1'b0;
  112. end
  113. else if (timer3cnt == CNT_MAX) begin
  114. led_r[1] <= ~led_r[1];
  115. end
  116. else begin
  117. led_r[1] <= led_r[1];
  118. end
  119. end
  120. endmodule

在代码中,应该重点关注IP核是如何被调用(例化)的,同时注意例化时,填写的输入输出。 另外,在使用IP核输出的时钟信号计数时,我们同时使用了locked信号,这一点请不要忽略。

3 约束文件

  1. create_clock -period 20.000 [ get_ports clk ]
  2. set_property PACKAGE_PIN N18 [ get_ports clk ]
  3. set_property PACKAGE_PIN P15 [ get_ports {led[0]} ]
  4. set_property PACKAGE_PIN U12 [ get_ports {led[1]} ]
  5. set_property PACKAGE_PIN T12 [ get_ports rst_n ]
  6. set_property IOSTANDARD LVCMOS33 [ get_ports clk ]
  7. set_property IOSTANDARD LVCMOS33 [ get_ports {led[*]} ]
  8. set_property IOSTANDARD LVCMOS33 [ get_ports rst_n ]

4 运行结果

PLL_RUN1

左边的灯闪1次,右边的灯闪2次。  左边灯用的是50MHz时钟,右边灯用的100MHz时钟

PLL_RUN2

左边的灯闪2次,右边的灯闪1次。  左边灯用的是50MHz时钟,右边灯用的25MHz时钟

相似内容,参考:IP核简介及PLL_IP核的调用-CSDN博客

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

闽ICP备14008679号