项目中解决问题还是需要许多骚操作。。。
进入正题:
别的本事不太会,解决问题的骚操作还是有的。。。
原来系统是一个125M时钟,想要发出不足一个时钟周期的脉冲信号而且需要同步,这时候就想到使用PLL在生成一个125M时钟,使这两个时钟有相位差。。。然后在进行组合逻辑判断。。。完美!!!解决问题!!!
然而在实践的过程中发现,相位需要来回调试,并且还需要来回修改还PLL IP 核,麻烦。。。
有没有可以动态改变PLL的输出时钟的相位???
还真有!!!
就是它!!!动态调相!!!勾选它!!!
接着勾选下图。
完整的配置如下几个图所示:
配置完之后,开始仿真吧。
`timescale 1ns / 1ps
module ld_test();
reg clk_100m ;
reg [3:0] cnt_r1 ;
reg [3:0] cnt_r2 ;
reg ld_dis_r1 ;
reg ld_dis_r2 ;
reg psen ;
reg psincdec ;
reg [3:0] cnt_r ;
wire locked ;
wire clk_125m_w1 ;
wire clk_125m_w2 ;
wire ld_dis ;
wire psdone ;
assign ld_dis = (clk_125m_w1 == 1'b1) && (ld_dis_r1 == 1'b1) && (clk_125m_w2 == 1'b0) ;
initial
begin
clk_100m = 1'b0 ;
cnt_r1 = 4'd0 ;
cnt_r2 = 4'd0 ;
ld_dis_r1 = 1'b0 ;
ld_dis_r2 = 1'b0 ;
psen = 1'b0 ;
psincdec = 1'b0 ;
cnt_r = 4'd0 ;
end
always #5 clk_100m = ~clk_100m ;
//always @ (posedge clk_125m_w1 or negedge locked)
//begin
// if(locked == 1'b0)
// begin
// cnt_r1 <= 4'd0 ;
// end
// else if(cnt_r1 == 4'd10)
// begin
// cnt_r1 <= 4'd0 ;
// end
// else
// begin
// cnt_r1 <= cnt_r1 + 1'b1 ;
// end
//end
//
//
//always @ (posedge clk_125m_w2 or negedge locked)
//begin
// if(locked == 1'b0)
// begin
// cnt_r2 <= 4'd0 ;
// end
// else if(cnt_r2 == 4'd10)
// begin
// cnt_r2 <= 4'd0 ;
// end
// else
// begin
// cnt_r2 <= cnt_r2 + 1'b1 ;
// end
//end
//
//always @ (posedge clk_125m_w1 or negedge locked)
//begin
// if(locked == 1'b0)
// begin
// ld_dis_r1 <= 1'b0 ;
// end
// else if(cnt_r1 == 4'd5)
// begin
// ld_dis_r1 <= 1'b1 ;
// end
// else
// begin
// ld_dis_r1 <= 1'b0 ;
// end
//end
//
//
//always @ (posedge clk_125m_w2 or negedge locked)
//begin
// if(locked == 1'b0)
// begin
// ld_dis_r2 <= 1'b0 ;
// end
// //else if(cnt_r2 == 4'd5)
// //begin
// // ld_dis_r2 <= 1'b1 ;
// //end
// //else
// begin
// ld_dis_r2 <= ~ld_dis_r2 ;
// end
//end
always @ (posedge clk_100m or negedge locked)
begin
if(locked == 1'b0)
begin
cnt_r <= 1'b0 ;
end
else if(cnt_r == 4'd10)
begin
cnt_r <= cnt_r ;
end
else
begin
cnt_r <= cnt_r + 1'b1 ;
end
end
always @ (posedge clk_100m)
begin
if(cnt_r == 4'd9)
begin
psen <= 1'b1 ;
end
else
begin
psen <= 1'b0 ;
end
end
pll_test pll_test_ins
(
.clk_out1 (clk_125m_w1 ),
.clk_out2 (clk_125m_w2 ),
.psclk (clk_100m ), // input psclk
.psen (psen ), // input psen
.psincdec (0 ), // input psincdec
.psdone (psdone ), // output psdone.locked (locked ),
.locked (locked ), // output locked
.clk_in1 (clk_100m )
);
endmodule
在psen有效之前的两个时钟,都是对齐的
在psdone有效前后,两个时钟以及出现了相位延时
因为仿真文件只给了 一个psen,一个psen只能实现14ps的延时。
为什么是14ps???手册写的
手册:7 Series FPGAs Clocking Resources User Guide (UG472)
项目中解决问题还是需要许多骚操作。。。