概述:
xilinx设计的触发器提供了多种配置方式,方便设计最简触发器,同步复位触发器,异步复位触发器,同步时钟使能触发器,异步时钟使能触发器。输出又分为同步复位和置位,异步清零和预置位。
官方提供的原语
FDCPE #(
.INIT(1'b0) // Initial value of register (1'b0 or 1'b1)
) FDCPE_inst (
.Q(Q), // Data output
.C(C), // Clock input
.CE(CE), // Clock enable input
.CLR(CLR), // Asynchronous clear input
.D(D), // Data input
.PRE(PRE) // Asynchronous set input
);
FDCE #(
.INIT(1'b0) // Initial value of register (1'b0 or 1'b1)
) FDCE_inst (
.Q(Q), // Data output
.C(C), // Clock input
.CE(CE), // Clock enable input
.CLR(CLR), // Asynchronous clear input
.D(D) // Data input
);
FDRSE #(
.INIT(1'b0) // Initial value of register (1'b0 or 1'b1)
) FDRSE_inst (
.Q(Q), // Data output
.C(C), // Clock input
.CE(CE), // Clock enable input
.D(D), // Data input
.R(R), // Synchronous reset input
.S(S) // Synchronous set input
);
内容
1.同步复位和置位
2. 同步时钟使能
3. 异步清零和预置位
4. 异步时钟使能
1.同步复位和置位
verilog c代码
module primitive1(
input clk,
input rst_n,
input a,
output reg y,
output reg y1
);
always @ (posedge clk )
if (rst_n==0)
y <= 1'b0;
else
y <= a;
always @ (posedge clk )
if (rst_n==0)
y1 <= 1'b1;
else
y1 <= a;
endmodule
verilog 原语代码,FDR为复位原语,FDS置位原语
module primitive1 (
clk, rst_n, a, y, y1
);
input clk;
input rst_n;
input a;
output y;
output y1;
wire a_IBUF_1;
wire clk_BUFGP_3;
wire rst_n_IBUF_5;
wire rst_n_inv;
wire y1_OBUF_9;
wire y_OBUF_10;
FDR y_1 (
.C(clk_BUFGP_3),
.D(a_IBUF_1),
.R(rst_n_inv),
.Q(y_OBUF_10)
);
FDS y1_2 (
.C(clk_BUFGP_3),
.D(a_IBUF_1),
.S(rst_n_inv),
.Q(y1_OBUF_9)
);
IBUF rst_n_IBUF (
.I(rst_n),
.O(rst_n_IBUF_5)
);
IBUF a_IBUF (
.I(a),
.O(a_IBUF_1)
);
OBUF y_OBUF (
.I(y_OBUF_10),
.O(y)
);
OBUF y1_OBUF (
.I(y1_OBUF_9),
.O(y1)
);
BUFGP clk_BUFGP (
.I(clk),
.O(clk_BUFGP_3)
);
INV rst_n_inv1_INV_0 (
.I(rst_n_IBUF_5),
.O(rst_n_inv)
);
endmodule
RTL结构图
技术原理图
2. 同步时钟使能
verilog c代码
module primitive1(
input clk,
input rst_n,
input a,
input enable_clk,
output reg y
);
always @ (posedge clk )
if (rst_n==0)
y <= 1'b0;
else if (enable_clk)
y <= a;
endmodule
原语代码,使用了FDRE实现同步时钟使能原语
module primitive1 (
enable_clk, clk, rst_n, a, y
);
input enable_clk;
input clk;
input rst_n;
input a;
output y;
wire a_IBUF_1;
wire clk_BUFGP_3;
wire enable_clk_IBUF_5;
wire rst_n_IBUF_7;
wire rst_n_inv;
wire y_OBUF_10;
FDRE y_1 (
.C(clk_BUFGP_3),
.CE(enable_clk_IBUF_5),
.D(a_IBUF_1),
.R(rst_n_inv),
.Q(y_OBUF_10)
);
IBUF enable_clk_IBUF (
.I(enable_clk),
.O(enable_clk_IBUF_5)
);
IBUF rst_n_IBUF (
.I(rst_n),
.O(rst_n_IBUF_7)
);
IBUF a_IBUF (
.I(a),
.O(a_IBUF_1)
);
OBUF y_OBUF (
.I(y_OBUF_10),
.O(y)
);
BUFGP clk_BUFGP (
.I(clk),
.O(clk_BUFGP_3)
);
INV rst_n_inv1_INV_0 (
.I(rst_n_IBUF_7),
.O(rst_n_inv)
);
endmodule
RTL结构图,fdre使用了同步复位端口R,以及时钟使能端口CE。
技术原理图
3. 异步清零和预置位
verilog c代码
module primitive1(
input clk,
input rst_n,
input a,
output reg y,
output reg y1
);
always @ (posedge clk or negedge rst_n)
if (rst_n==0)
y <= 1'b0;
else
y <= a;
always @ (posedge clk or negedge rst_n)
if (rst_n==0)
y1 <= 1'b1;
else
y1 <= a;
endmodule
原语,使用FDC和FDP实现异步清零和预置位
module primitive1 (
clk, rst_n, a, y, y1
);
input clk;
input rst_n;
input a;
output y;
output y1;
wire a_IBUF_1;
wire clk_BUFGP_3;
wire rst_n_IBUF_5;
wire rst_n_inv;
wire y1_OBUF_9;
wire y_OBUF_10;
FDC y_1 (
.C(clk_BUFGP_3),
.CLR(rst_n_inv),
.D(a_IBUF_1),
.Q(y_OBUF_10)
);
FDP y1_2 (
.C(clk_BUFGP_3),
.D(a_IBUF_1),
.PRE(rst_n_inv),
.Q(y1_OBUF_9)
);
IBUF rst_n_IBUF (
.I(rst_n),
.O(rst_n_IBUF_5)
);
IBUF a_IBUF (
.I(a),
.O(a_IBUF_1)
);
OBUF y_OBUF (
.I(y_OBUF_10),
.O(y)
);
OBUF y1_OBUF (
.I(y1_OBUF_9),
.O(y1)
);
BUFGP clk_BUFGP (
.I(clk),
.O(clk_BUFGP_3)
);
INV rst_n_inv1_INV_0 (
.I(rst_n_IBUF_5),
.O(rst_n_inv)
);
endmodule
RTL结构图,异步清零连接到了CLR端口,异步预置位连接到了PRE端口
技术原理图
4. 异步时钟使能
verilog c代码
module primitive1(
input clk,
input rst_n,
input a,
input enable_clk,
output reg y
);
always @ (posedge clk or negedge rst_n)
if (rst_n==0)
y <= 1'b0;
else if (enable_clk)
y <= a;
endmodule
原语,使能端连接到了CE,异步清零连接到了CLR。
module primitive1 (
enable_clk, clk, rst_n, a, y
);
input enable_clk;
input clk;
input rst_n;
input a;
output y;
wire a_IBUF_1;
wire clk_BUFGP_3;
wire enable_clk_IBUF_5;
wire rst_n_IBUF_7;
wire rst_n_inv;
wire y_OBUF_10;
FDCE y_1 (
.C(clk_BUFGP_3),
.CE(enable_clk_IBUF_5),
.CLR(rst_n_inv),
.D(a_IBUF_1),
.Q(y_OBUF_10)
);
IBUF enable_clk_IBUF (
.I(enable_clk),
.O(enable_clk_IBUF_5)
);
IBUF rst_n_IBUF (
.I(rst_n),
.O(rst_n_IBUF_7)
);
IBUF a_IBUF (
.I(a),
.O(a_IBUF_1)
);
OBUF y_OBUF (
.I(y_OBUF_10),
.O(y)
);
BUFGP clk_BUFGP (
.I(clk),
.O(clk_BUFGP_3)
);
INV rst_n_inv1_INV_0 (
.I(rst_n_IBUF_7),
.O(rst_n_inv)
);
endmodule
RTL结构图
技术原理图
5. 总结
1. 触发器是FPGA存储数据的基本单元
2. 触发器作为时序逻辑的基本元件,官方提供了丰富的配置方式,以适应各种可能的应用场景。