verilog仿真产生差分时钟

verilog仿真产生差分时钟

最近在啃pcie,pcie的一些基础知识,过段时间会发出来。在做pcie仿真的时候,看到xilinx官方的的这种产生差分时钟的方法觉得很好,在此做个笔记,同时分享给大家。

差分时钟

以前在做仿真时候通常都是用的单端时钟信号,这种单端时钟信号,很好产生,通过,always forever都可以产生。差分原理也很简单,n信号跟p信号取反就行了,但是xilinx的这个写法个人觉得很好,通用性很强以此分享出来。

top module

   parameter  REF_CLK_FREQ       = 0;//0 - 100MHZ,1 - 125MHZ ,2 - 250MHZ
   localparam REF_CLK_HALF_CYCLE = (REF_CLK_FREQ == 0) ? 5000 :
   								   (REF_CLK_FREQ == 1) ? 4000:
   								   (REF_CLK_FREQ == 2) ? 4000: 0;
   `ifdef LINKWIDTH
   localparam    [3:0] LINK_WIDTH =  4'h`LINKWIDTH;
   `else
   localparam    [3:0] LINK_WIDTH = 4'h1;
   `endif
   wire           ep_sys_clk_p;
   wire           ep_sys_clk_n;
   wire           rp_sys_clk_p; 
   wire           rp_sys_clk_n; 
   sys_clk_gen_ds # (
   	.halfcycle(REF_CLK_HALF_CYCLE),                         //cycle
   	.offset(0)                                              //phase
   	)
   	CLK_GEN_RP(
   		.sys_clk_p(rp_sys_clk_p)
   		.sys_clk_n(rp_sys_clk_n)
   	);
   	sys_clk_gen_ds # (
   	.halfcycle(REF_CLK_HALF_CYCLE),                         //cycle
   	.offset(0)                                              //phase
   	)
   	CLK_GEN_EP(
   		.sys_clk_p(ep_sys_clk_p)
   		.sys_clk_n(ep_sys_clk_n)
   	);

sys_clk_gen_ds

`timescale 1ps/1ps
module sys_clk_gen_ds (sys_clk_p,sys_clk_n);
output           sys_clk_p;
output           sys_clk_n;
parameter    offset    = 0;
parameter    halfcycle = 500;
sys_clk_gen   #(
							.offset(    offset   ),
							.halfcycle( halfcycle)
)
clk_gen (
							.sys_clk(sys_clk_p)
);
assign sys_clk_n = !sys_clk_p;
endmodule   //sys_clk_gen_ds				

sys_clk_gen

`timescale 1ps/1ps
module sys_clk_gen(sys_clk);
output             sys_clk;
reg                sys_clk;
parameter     offset     = 0;
parameter      halfcycle = 500;
initial begin
	sys_clk  = 0;
	#(offset);
	forever #(halfcycle) sys_clk = ~sys_clk;
end

endmodule // sys_clk_gen

总结

top 部分只写了时钟部分,以上就是xilinx的官方写法。仅供参考。谢谢

你可能感兴趣的:(FPGA,仿真)