当前位置:   article > 正文

FPGA自学笔记--时钟IP核使用(Verilog&VHDL版本)

时钟ip核

        时钟ip核是一个比较常用的IP核,主要用于对输入的时钟信号进行进行倍频、分频、调整相位。这些功能其实自己去实现也是相对来说比较简单的,但是既然vivado提供了这种封装好的IP核,我们就可以充分的去利用,减少开发者的工作量,而且时钟ip核也有一些比较高级的功能,比如,输出时钟频率和相位的动态调整等等。本篇文章主要记录时钟ip核的基本使用,并附带verilog和vhdl代码及对应的testbench文件,以供同学们相互交流学习。

一、时钟ip简介

        在介绍时钟管理IP之前,可以先了解一下FPGA全局时钟资源的概念。全局时钟资源是指FPGA内部为实现系统时钟到达FPGA内部各CLB,IOB以及BSRAM等基本逻辑单元的延时和抖动最小化,采用全铜层工艺实现的专用缓冲和驱动结构。

        全局时钟资源是一种布线资源,在设计中使用的十分普遍。全局时钟资源有多种形式,可以通过vivado的语言模板查看时钟资源的各种原语。

   

        以下就是使用ip核的过程。

二、VIVADO中IP核的设置

1、在ip catalog 中选择时钟ip核。(左侧)

 2、设置ip核

 

三、例化模板

vivado提供了例化模板,包括verilog和vhdl版本。例化模板在ip_source中获取。

 如果是verilog,点开这个veo文件就可以看见例化模板。

如果是VHDL,需要查看项目的target是不是VHDL,这样例化模板才能出现vhdl的vho文件。

Verilog例化ip核

  1. clk_wiz_0 instance_name
  2. (
  3. // Clock out ports
  4. .clk_out1(clk_out1), // output clk_out1
  5. .clk_out2(clk_out2), // output clk_out2
  6. .clk_out3(clk_out3), // output clk_out3
  7. .clk_out4(clk_out4), // output clk_out4
  8. // Status and control signals
  9. .reset(reset), // input reset
  10. .locked(locked), // output locked
  11. // Clock in ports
  12. .clk_in1(clk_in1)); // input clk_in1

VHDL例化ip核

  1. component clk_wiz_0
  2. port
  3. (-- Clock in ports
  4. -- Clock out ports
  5. clk_out1 : out std_logic;
  6. clk_out2 : out std_logic;
  7. clk_out3 : out std_logic;
  8. clk_out4 : out std_logic;
  9. -- Status and control signals
  10. reset : in std_logic;
  11. locked : out std_logic;
  12. clk_in1 : in std_logic
  13. );
  14. end component;
  15. -- COMP_TAG_END ------ End COMPONENT Declaration ------------
  16. -- The following code must appear in the VHDL architecture
  17. -- body. Substitute your own instance name and net names.
  18. ------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
  19. your_instance_name : clk_wiz_0
  20. port map (
  21. -- Clock out ports
  22. clk_out1 => clk_out1,
  23. clk_out2 => clk_out2,
  24. clk_out3 => clk_out3,
  25. clk_out4 => clk_out4,
  26. -- Status and control signals
  27. reset => reset,
  28. locked => locked,
  29. -- Clock in ports
  30. clk_in1 => clk_in1
  31. );

四、需求分析和代码

需求介绍:

输入50Mhz时钟,产生100M输出,100M输出(180°相位),50M,25M。

verilog 顶层文件

设置好IP核后,verilog工程的顶层文件:

  1. `timescale 1ns / 1ps
  2. module ip_clk_wiz(
  3. input sys_clk,
  4. input sys_rst,
  5. output clk_100m , //100Mhz时钟频率
  6. output clk_100m_180deg, //100Mhz时钟频率,相位偏移180度
  7. output clk_50m , //50Mhz时钟频率
  8. output clk_25m //25Mhz时钟频率
  9. );
  10. wire locked;
  11. clk_wiz_0 clk_wiz_0
  12. (
  13. // Clock out ports
  14. .clk_out1(clk_100m), // output clk_out1
  15. .clk_out2(clk_100m_180deg), // output clk_out2
  16. .clk_out3(clk_50m), // output clk_out3
  17. .clk_out4(clk_25m), // output clk_out4
  18. // Status and control signals
  19. .reset(sys_rst), // input reset
  20. .locked(locked), // output locked
  21. // Clock in ports
  22. .clk_in1(sys_clk)); // input clk_in1
  23. endmodule

verilog testbench文件

  1. `timescale 1ns / 1ps
  2. module ip_clk_wiz_tb(
  3. );
  4. reg sys_clk;
  5. reg sys_rst;
  6. wire clk_100m;
  7. wire clk_100m_180deg;
  8. wire clk_50m;
  9. wire clk_25m;
  10. always #10 sys_clk = ~sys_clk;
  11. initial begin
  12. sys_clk = 1'b0;
  13. sys_rst = 1'b1;
  14. #200//延时200
  15. sys_rst = 1'b0;
  16. end
  17. ip_clk_wiz u_ip_clk_wiz(
  18. .sys_clk (sys_clk ),
  19. .sys_rst (sys_rst ),
  20. .clk_100m (clk_100m ),
  21. .clk_100m_180deg (clk_100m_180deg),
  22. .clk_50m (clk_50m ),
  23. .clk_25m (clk_25m )
  24. );
  25. endmodule

VHDL顶层文件

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. -- Uncomment the following library declaration if using
  4. -- arithmetic functions with Signed or Unsigned values
  5. --use IEEE.NUMERIC_STD.ALL;
  6. -- Uncomment the following library declaration if instantiating
  7. -- any Xilinx leaf cells in this code.
  8. --library UNISIM;
  9. --use UNISIM.VComponents.all;
  10. entity ip_clk_wiz is
  11. Port ( sys_clk: in std_logic;
  12. sys_rst: in std_logic;
  13. clk_100m: out std_logic;
  14. clk_100m_180: out std_logic;
  15. clk_25m: out std_logic;
  16. clk_50m: out std_logic
  17. );
  18. end ip_clk_wiz;
  19. architecture Behavioral of ip_clk_wiz is
  20. signal locked :std_logic;
  21. component clk_wiz_0
  22. port
  23. (-- Clock in ports
  24. -- Clock out ports
  25. clk_out1 : out std_logic;
  26. clk_out2 : out std_logic;
  27. clk_out3 : out std_logic;
  28. clk_out4 : out std_logic;
  29. -- Status and control signals
  30. reset : in std_logic;
  31. locked : out std_logic;
  32. clk_in1 : in std_logic
  33. );
  34. end component;
  35. begin
  36. -- COMP_TAG_END ------ End COMPONENT Declaration ------------
  37. -- The following code must appear in the VHDL architecture
  38. -- body. Substitute your own instance name and net names.
  39. ------------- Begin Cut here for INSTANTIATION Template ----- INST_TAG
  40. i_clk : clk_wiz_0
  41. port map (
  42. -- Clock out ports
  43. clk_out1 => clk_100m,
  44. clk_out2 => clk_100m_180,
  45. clk_out3 => clk_50m,
  46. clk_out4 => clk_25m,
  47. -- Status and control signals
  48. reset => sys_rst,
  49. locked => locked,
  50. -- Clock in ports
  51. clk_in1 => sys_clk
  52. );
  53. end Behavioral;

VHDL-testbench文件

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. -- Uncomment the following library declaration if using
  4. -- arithmetic functions with Signed or Unsigned values
  5. --use IEEE.NUMERIC_STD.ALL;
  6. -- Uncomment the following library declaration if instantiating
  7. -- any Xilinx leaf cells in this code.
  8. --library UNISIM;
  9. --use UNISIM.VComponents.all;
  10. entity ip_clk_wiz_tb is
  11. -- Port ( );
  12. end ip_clk_wiz_tb;
  13. architecture Behavioral of ip_clk_wiz_tb is
  14. signal sys_clk:std_logic;
  15. signal sys_rst:std_logic;
  16. signal clk_100m:std_logic;
  17. signal clk_50m:std_logic;
  18. signal clk_100m_180:std_logic;
  19. signal clk_25m:std_logic;
  20. component ip_clk_wiz
  21. Port ( sys_clk: in std_logic;
  22. sys_rst: in std_logic;
  23. clk_100m: out std_logic;
  24. clk_100m_180: out std_logic;
  25. clk_25m: out std_logic;
  26. clk_50m: out std_logic
  27. );
  28. end component;
  29. begin
  30. i1:ip_clk_wiz
  31. port map(
  32. sys_clk => sys_clk,
  33. sys_rst => sys_rst,
  34. clk_100m => clk_100m,
  35. clk_100m_180 => clk_100m_180,
  36. clk_25m => clk_25m,
  37. clk_50m => clk_50m
  38. );
  39. init : process
  40. begin
  41. wait for 10 ns;
  42. sys_clk<='0';
  43. wait for 10 ns; --- 和ip输入保持一致
  44. sys_clk<='1';
  45. end process init;
  46. always : process
  47. -- optional sensitivity list
  48. -- ( )
  49. -- variable declarations
  50. begin
  51. -- code executes for every event on sensitivity list
  52. --- sys_clk <= '0';
  53. sys_rst <= '1';
  54. wait for 201 ns;
  55. sys_rst <= '0';
  56. wait;
  57. end process always;
  58. end Behavioral;

仿真结果:

        由此图可以看出,完全符合我们的输出要求。

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

闽ICP备14008679号