供给FPGA的时钟有单端时钟,也有差分时钟,当输入是差分时钟时,需要将差分时钟转换为单端时钟输出来作为FPGA的系统工作时钟。
本次使用锁相环来实现差分到单端时钟的转换。
FPGA代码实现如下:
TOP层
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/08/31 09:09:58
// Design Name:
// Module Name: led_top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module led_top(
input sys_clk_i_clk_n,
input sys_clk_i_clk_p,
output [1:0] led
);
//单端系统时钟
wire sys_clk;
wire locked;
wire sys_rst;
//差分时钟输入转单端
clk_wiz_0 clk_wiz_0_u0
(
// Clock out ports
.clk_out1(sys_clk), // output clk_out1
// Status and control signals
.locked(locked), // output locked
// Clock in ports
.clk_in1_p(sys_clk_i_clk_p), // input clk_in1_p
.clk_in1_n(sys_clk_i_clk_n)); // input clk_in1_n
//VIO给出复位信号
vio_0 vio_0_u0 (
.clk(sys_clk), // input wire clk
.probe_out0(sys_rst) // output wire [0 : 0] probe_out0
);
//计数器,实现led灯1秒翻转一次
//100M时钟,计数10^8次,需27位计数器
reg [27:0] cnt;
always@(posedge sys_clk)
if(sys_rst)
cnt <= 28'd0;
else if(cnt<28'd100_000_000)
cnt <= cnt + 28'd1;
else
cnt <= 28'd0;
//signal
reg signal;
always@(posedge sys_clk)
if(sys_rst)
signal <= 'd0;
else if(cnt==28'd100)
signal <= ~signal ;
else
signal <= signal;
ila_0 ila_0_u0 (
.clk(sys_clk), // input wire clk
.probe0(led[0]), // input wire [0:0] probe0
.probe1(led[1]) // input wire [0:0] probe1
);
assign led[0] = signal;
assign led[1] = ~signal;
endmodule
XDC引脚约束
#系统时钟管脚约束
set_property -dict {PACKAGE_PIN E16 IOSTANDARD LVDS} [get_ports sys_clk_i_clk_p]
set_property -dict {PACKAGE_PIN E15 IOSTANDARD LVDS} [get_ports sys_clk_i_clk_n]
#led引脚约束
set_property PACKAGE_PIN E12 [get_ports {led[0]}]
set_property PACKAGE_PIN F13 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS18 [get_ports {led[*]}]
本次验证差分时钟转单端采用的开发板为米联客M7Z100FA,核心板型号为xc7z100ffg900-2。