vivado 多个时钟IP核调用

        做某些电学实验或者参加一些学科竞赛的时候,有时候需要输出多路方波信号(如10路,20路,甚至30路等),而FPGA的一个时钟IP核通常能输出4~7路方波,这个时候我们就需要调用FPGA内部其他的时钟IP核。

        本文的主要内容是介绍如何调用FPGA中的多个时钟IP核。

我使用的vivado版本是2019.2 这个版本。

我使用的FPGA是达芬奇开发板。

首先打开vivado2019.2,创建一个项目。

新建.v文件

定义全局时钟和全局复位

点击“ IP Catalog ”,在搜索栏中输入clock,下面就会出现Clocking Wizard

双击“Clocking Wizard”,出现时钟IP核的设置界面。

Input Clock information选项中的Primary 时钟应根据FPGA板子的外部晶振修改,如达芬奇的外部晶振是50Mhz,所以改为50。

Output Clocks选项可以选择输出几路信号,Output Freq以及Phase选项可以改变输出信号的频率以及相位。

往下拉,如果板子是低电平复位有效,应该选择Active Low

确认好了后,点击“OK”生成IP核

在sources下面的IP Source可以看到生成的IP核。

将.veo文件(例化模板)的这部分代码复制到一开始创建的.v文件中

并修改相应的值。代码如下:

`timescale 1ns / 1ps

module ip_clk_wiz(
//定义时钟和复位
    input  sys_clk,   
    input  sys_rst_n,  
    output clk_out1,
    output clk_out2,
    output clk_out3,
    output clk_out4,
    output clk_out5,
    output clk_out6,
    output locked
    );


clk_wiz_0 instance_name
   (
    // Clock out ports
    .clk_out1(clk_out1),     // output clk_out1
    .clk_out2(clk_out2),     // output clk_out2
    .clk_out3(clk_out3),     // output clk_out3
    .clk_out4(clk_out4),     // output clk_out4
    .clk_out5(clk_out5),     // output clk_out5
    .clk_out6(clk_out6),     // output clk_out6
    // Status and control signals
    .resetn(sys_rst_n ), // input resetn
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(sys_clk));      // input clk_in1
    

    endmodule

——————————————————————————————————————

编写仿真软件

仿真代码如下:

`timescale 1ns / 1ps
module tb_ip_clk_wiz();
    
reg sys_clk;  
reg sys_rst_n;

wire clk_100M; 
wire clk_100M_180de; 
wire clk_50M; 
wire clk_50M_180de; 
wire clk_25M; 
wire clk_25M_180de; 
wire locked  ;  
      
      
initial begin
sys_clk=1'b0;
sys_rst_n=1'b0;
#200
sys_rst_n=1'b1;
end

always #10 sys_clk=~sys_clk;

ip_clk_wiz ip_clk_wiz_u(     
.sys_clk   (sys_clk)   ,
.sys_rst_n (sys_rst_n)   ,
.clk_out1  (clk_100M)   ,
.clk_out2  (clk_100M_180de)   ,
.clk_out3  (clk_50M)   ,
.clk_out4  (clk_50M_180de)   ,
.clk_out5  (clk_25M)   ,
.clk_out6  (clk_25M_180de)   ,
.locked    (locked)    
      
            );
endmodule

输出波形如下图所示:

——————————————————————————————————————

上面只是调用了一个时钟IP核,想要调用多个时钟IP核,

重新点击“ IP Catalog ”,在搜索栏中输入clock,双击Clocking Wizard。重复上面的步骤。

此时.v文件的代码如下:

`timescale 1ns / 1ps

module ip_clk_wiz(
//定义时钟和复位
    input  sys_clk,   
    input  sys_rst_n,  
    output clk_out1,
    output clk_out2,
    output clk_out3,
    output clk_out4,
    output clk_out5,
    output clk_out6,
    output clk_out7,
    output clk_out8,
    output clk_out9,
    output clk_out10,
    output clk_out11,
    output clk_out12,
    output locked
    );


clk_wiz_0 instance_name
   (
    // Clock out ports
    .clk_out1(clk_out1),     // output clk_out1
    .clk_out2(clk_out2),     // output clk_out2
    .clk_out3(clk_out3),     // output clk_out3
    .clk_out4(clk_out4),     // output clk_out4
    .clk_out5(clk_out5),     // output clk_out5
    .clk_out6(clk_out6),     // output clk_out6
    // Status and control signals
    .resetn(sys_rst_n ), // input resetn
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(sys_clk));      // input clk_in1
    
 clk_wiz_1 instance_name_1
   (
    // Clock out ports
    .clk_out1(clk_out7),     // output clk_out1
    .clk_out2(clk_out8),     // output clk_out2
    .clk_out3(clk_out9),     // output clk_out3
    .clk_out4(clk_out10),     // output clk_out4
    .clk_out5(clk_out11),     // output clk_out5
    .clk_out6(clk_out12),     // output clk_out6
    // Status and control signals
    .resetn(sys_rst_n), // input resetn
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(sys_clk));      // input clk_in1

    endmodule

此时仿真文件的代码如下:

`timescale 1ns / 1ps
module tb_ip_clk_wiz();
    
reg sys_clk;  
reg sys_rst_n;

wire clk_100M; 
wire clk_100M_180de; 
wire clk_50M; 
wire clk_50M_180de; 
wire clk_25M; 
wire clk_25M_180de; 
wire locked  ;  

wire clk_100M_1; 
wire clk_100M_180de_1; 
wire clk_50M_1; 
wire clk_50M_180de_1; 
wire clk_25M_1; 
wire clk_25M_180de_1;     
      
initial begin
sys_clk=1'b0;
sys_rst_n=1'b0;
#200
sys_rst_n=1'b1;
end

always #10 sys_clk=~sys_clk;

ip_clk_wiz ip_clk_wiz_u(     
.sys_clk   (sys_clk)   ,
.sys_rst_n (sys_rst_n)   ,
.clk_out1  (clk_100M)   ,
.clk_out2  (clk_100M_180de)   ,
.clk_out3  (clk_50M)   ,
.clk_out4  (clk_50M_180de)   ,
.clk_out5  (clk_25M)   ,
.clk_out6  (clk_25M_180de)   ,
.clk_out7  (clk_100M_1)   ,
.clk_out8  (clk_100M_180de_1)   ,
.clk_out9  (clk_50M_1)   ,
.clk_out10  (clk_50M_180de_1)   ,
.clk_out11  (clk_25M_1)   ,
.clk_out12  (clk_25M_180de_1)   ,
.locked    (locked)    
                  );         
   
endmodule

输出波形如下图所示:

从之前的6路输出到现在12路输出。

———————————————————————————————————————————

本人之前的研究方向中,有一个步骤是需要输出256路PWM信号,走了一些弯路,遇到了困难。困难主要是.v文件和仿真文件代码的编写上面。现在将方法步骤写在上面,希望能给有需要的朋友一些帮助。

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值