做某些电学实验或者参加一些学科竞赛的时候,有时候需要输出多路方波信号(如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文件和仿真文件代码的编写上面。现在将方法步骤写在上面,希望能给有需要的朋友一些帮助。