FPGA中为什么不能双时钟触发

发布时间:2024年01月20日

always@()的敏感源中为什么不能双边沿触发?

1 双沿触发写法

always@(posedge clk or negedge clk) 
 	begin 
    	A<=1’b0;
	end

这种写法是错误的,因为在FPGA的内部所有的寄存器只支持单沿采样触发,因此在编写RTL级代码时,只能使用单沿采样,如果像上面一样写成双沿采样,则Vivado或QuartusPrime等FPGA开发工具会报语法错误。

2 双沿采样的实现

对于Xilinx的器件,要实现双沿采样必须使用IDDR、ODDR原语实现对信号的双沿采样,但是IDDR、ODDR只能用于输入输出端口处,不能用于内部逻辑。

	ODDR #(
   .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or 		 "SAME_EDGE" 
      .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
   ) ODDR_inst (
      .Q(Q),   // 1-bit DDR output
      .C(C),   // 1-bit clock input
      .CE(CE), // 1-bit clock enable input
      .D1(D1), // 1-bit data input (positive edge)
      .D2(D2), // 1-bit data input (negative edge)
      .R(R),   // 1-bit reset
      .S(S)    // 1-bit set
   );
 IDDR #(
      .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE" 
                                      //    or "SAME_EDGE_PIPELINED" 
      .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
      .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
      .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC" 
   ) IDDR_inst (
      .Q1(Q1), // 1-bit output for positive edge of clock
      .Q2(Q2), // 1-bit output for negative edge of clock
      .C(C),   // 1-bit clock input
      .CE(CE), // 1-bit clock enable input
      .D(D),   // 1-bit DDR data input
      .R(R),   // 1-bit reset
      .S(S)    // 1-bit set
   );
文章来源:https://blog.csdn.net/qq_44385725/article/details/135715567
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。