供给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。