verilog进阶语法-触发器原语

2023-12-16 10:32:34

概述:

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. 触发器作为时序逻辑的基本元件,官方提供了丰富的配置方式,以适应各种可能的应用场景。

文章来源:https://blog.csdn.net/q511951451/article/details/135028969
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。