Xilinx ISE的PLL锁相环IP核的使用(ISE与Quartus PLL锁相环使用的区别)
ISE PLL IP核的使用
这次使用的目的是产生25MHz,50MHz,75MHz,100MHz的时钟频率,输入时钟频率为50MHz
IP核的设置
PLL 所在的IP核位置为 FPGA Features and Deaign->Clocking->Clocking Wizard
这个就是PLL IP核的位置
关于IBGFG等Xilinx原语的使用与介绍见链接
链接: [link] (https://www.cnblogs.com/mouou/p/6548898.html).
链接:link.
根据自己的需要去设置输出频率和占空比
第四页一直默认就好
第五页根据自己的需要去修改输入输出端口的名字
代码
module pll_test(
input wire clk,
input wire rst_n,
output wire clkout1,
output wire clkout2,
output wire clkout3,
output wire clkout4
);
wire locked;
IBUFG IBUFG_INST
(
.O(clk_bufg),
.I(clk)
);
pll pll_inst
(// Clock in ports
.clk_in(clk_bufg), // IN
// Clock out ports
.clk_out1(clkout1), // OUT
.clk_out2(clkout2), // OUT
.clk_out3(clkout3), // OUT
.clk_out4(clkout4), // OUT
// Status and control signals
.reset(~rst_n),// IN
.locked(locked)); // OUT
endmodule
测试文件
module tb_pll;
// Inputs
reg clk;
reg rst_n;
// Outputs
wire clkout1;
wire clkout2;
wire clkout3;
wire clkout4;
// Instantiate the Unit Under Test (UUT)
pll_test uut (
.clk(clk),
.rst_n(rst_n),
.clkout1(clkout1),
.clkout2(clkout2),
.clkout3(clkout3),
.clkout4(clkout4)
);
initial begin
// Initialize Inputs
clk = 0;
rst_n = 1;
// Wait 100 ns for global reset to finish
#100;
rst_n=0;
// Add stimulus here
end
always #10 clk = ~clk;
endmodule
ucf文件的书写
##
NET clk LOC = T8 |TNM_NET = sys_clk_pin | IOSTANDARD = "LVCMOS33";
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;
##
##
NET rst_n LOC = L3 | IOSTANDARD = "LVCMOS33";
##
NET clkout1 LOC = K16 | IOSTANDARD = "LVCMOS33";
NET clkout2 LOC = J16 | IOSTANDARD = "LVCMOS33";
NET clkout3 LOC = L16 | IOSTANDARD = "LVCMOS33";
NET clkout4 LOC = k15 | IOSTANDARD = "LVCMOS33";
PIN "pll_inst/clkout1_buf.O" CLOCK_DEDICATED_ROUTE = FALSE ;
PIN "pll_inst/clkout2_buf.O" CLOCK_DEDICATED_ROUTE = FALSE ;
PIN "pll_inst/clkout3_buf.O" CLOCK_DEDICATED_ROUTE = FALSE ;
PIN "pll_inst/clkout4_buf.O" CLOCK_DEDICATED_ROUTE = FALSE ;
代码分析
- 可以看到在程序设计的时候使用了IBUFG的原语
IBUFG即输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过IBUFG 单元,否则在布局布线时会报错。
使用IBUFG的时候就是例化这个模块。它包含一个输出一个输入,输入其实就是指最开始的系统时钟,输出是我们后面输入到锁相环的时钟信号。
使用ISE的锁相环与Quartus的锁相环的区别就是 ise使用了IBUFG原语而Quartus没有
2.复位信号的设置
对于PLL的锁相环其复位信号是高电平有效,但对于开发板上的复位按键是低电平有效,所以这里在使用的时候还加上了一个了取反。
使用 ISE 倍频时遇到的问题
当时,将信号倍频以后对信号进行仿真,发现locked这个信号一直无法拉高,且显示的一直都是红色高阻态,这显然是错误的,因为locked信号表征的信号是否可以稳定输出。后来检查发现应该是测试文件的问题,在测试文件中的复位信号以前一直用的是20ns之后拉低,后来发现就出现了如上的错误。后来将复位信号变为100ns之后拉低输出的信号就是正确的,locked信号也就拉高了。