概述:
内容
1. 时钟缓冲
2. 输入时钟缓冲
3. ODDR2作为输出时钟缓冲
1. 输入时钟缓冲 BUFGP
verilog c代码,clk作为触发器的边沿触发,会自动将clk综合成时钟信号。
module primitive1(input clk,input a,output reg y);
always @ (posedge clk)y <= a;endmodule
verilog原语代码
module primitive1 (clk, a, y
);input clk;input a;output y;wire a_IBUF_1;wire clk_BUFGP_3;wire y_OBUF_5;FD y_1 (.C(clk_BUFGP_3),.D(a_IBUF_1),.Q(y_OBUF_5));IBUF a_IBUF (.I(a),.O(a_IBUF_1));OBUF y_OBUF (.I(y_OBUF_5),.O(y));BUFGP clk_BUFGP (.I(clk),.O(clk_BUFGP_3));
endmodule
时钟信号可以去驱动触发器,时钟信号需要走时钟线路,通过一个BUFGP或者IBUFG进入时钟线路。通过时钟缓冲后,就可以去驱动触发器FD的时钟.C端口了。
RTL结构图,这是一个简单的时钟驱动触发器fd的示例
技术原理图
2. 输入时钟缓冲 IBUFG
原语代码
module primitive1 (clk, a, y
);input clk;input a;output y;wire a_IBUF_1;wire clk_BUFGP_3;wire y_OBUF_5;FD y_1 (.C(clk_BUFGP_3),.D(a_IBUF_1),.Q(y_OBUF_5));IBUF a_IBUF (.I(a),.O(a_IBUF_1));OBUF y_OBUF (.I(y_OBUF_5),.O(y));IBUFG clk_BUFGP (.I(clk),.O(clk_BUFGP_3));
endmodule
技术原理图,在输入端口除了可以用BUFGP外,还可以使用IBUFG
3. 输出时钟缓冲 ODDR2
ODDR2的工作原理
代码
module primitive1(input clk,output clk_o);ODDR2 #(.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1" .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1.SRTYPE("SYNC") // Specifies "SYNC" or "ASYNC" set/reset) ODDR2_inst (.Q(clk_o), // 1-bit DDR output data.C0(clk), // 1-bit clock input.C1(~clk), // 1-bit clock input.CE(1'b1), // 1-bit clock enable input.D0(1'b1), // 1-bit data input (associated with C0).D1(1'b0), // 1-bit data input (associated with C1).R(1'b0), // 1-bit reset input.S(1'b0) // 1-bit set input);endmodule
原语代码,使用GND原语产生一个地线,使用VCC原语产生一个电源线,用于绑定固定点位输入端口。ODDR2有两个输入数据端口,两个时钟端口,时钟端口有180度相位差。时钟同时作为选择器输入端口,分别将两个触发器的输出选择输出出去。在输出端口就可以看到双速率输出的数据,这里把双速率输出的数据作为方波时钟使用。
module primitive1 (clk, clk_o
);input clk;output clk_o;wire N0;wire N1;wire ODDR2_inst_not0000;wire clk_BUFGP_4;wire clk_o_OBUF_6;GND XST_GND (.G(N0));VCC XST_VCC (.P(N1));ODDR2 #(.DDR_ALIGNMENT ( "NONE" ),.SRTYPE ( "SYNC" ),.INIT ( 1'b0 ))ODDR2_inst (.D0(N1),.D1(N0),.C0(clk_BUFGP_4),.C1(ODDR2_inst_not0000),.CE(N1),.R(N0),.S(N0),.Q(clk_o_OBUF_6));OBUF clk_o_OBUF (.I(clk_o_OBUF_6),.O(clk_o));BUFGP clk_BUFGP (.I(clk),.O(clk_BUFGP_4));INV ODDR2_inst_not00001_INV_0 (.I(clk_BUFGP_4),.O(ODDR2_inst_not0000));
endmodule
RTL结构图,使用了一个ODDR2原语模块。
技术原理图
4. 总结
1. 时钟原语包含输入时钟原语与输出时钟原语,其中输出时钟原语使用ODDR2作为输出,官方说这个性能更加优越
2. 时钟用于驱动触发器的时钟,他需要走专门的时钟线,通过时钟缓冲输入到时钟线中。