01signal.com

Source-synchronous outputs

소개

이 페이지에서는 source-synchronous data outputs에 대해 설명합니다. 이 기술은 data outputs가 FPGA가 이러한 outputs와 병렬로 생성하는 clock 와 동기화됨을 의미합니다.

Source synchronous clocking with outputs only

이 접근 방식은 외부 구성 요소와의 인터페이스가 FPGA에서 output ports 로만 구성된 경우 확실한 선택입니다. 이 페이지 하단에 설명된 대로 I/O가 양방향인 경우에도 적합합니다. 일반적으로 clock 와 data 사이의 관계를 설명하는 별도의 페이지 도 있습니다.

기본 애플리케이션

이 Verilog 예를 고려하십시오.

module top (
   input clk,
   output reg [7:0] data_out,
   output reg sync_clk_out
);

   always @(posedge clk)
     begin
	sync_clk_out <= !sync_clk_out;
	if (sync_clk_out)
	  data_out <= data_out + 1;
     end
endmodule

@data_out는 @sync_clk_out의 falling edge와 동시에 값을 변경합니다. @sync_clk_out가 낮을 때 @data_out는 변경되지 않습니다. @sync_clk_out가 높을 때 @data_out는 @clk의 rising edge에 대응하여 새로운 값으로 변경됩니다.

IOB registers가 @data_out 와 @sync_clk_out모두에 사용되는 경우 이러한 모든 output signals는 거의 동시에 값을 변경합니다. 따라서 이러한 signals를 수신하는 외부 구성 요소는 @sync_clk_out를 clock로 사용할 수 있습니다. 일반적으로 이러한 방식으로 외부 구성 요소의 timing 요구 사항을 쉽게 충족할 수 있습니다( @data_out 의 샘플링이 @sync_clk_out의 rising edge와 동기화된다고 가정).

DDR registers사용

위의 예에는 중요한 단점이 있습니다. @sync_clk_out 의 주파수는 @clk주파수의 절반입니다. 따라서 @data_out 의 data rate 도 @clk 주파수의 절반으로 제한됩니다. 유일한 예외는 외부 구성 요소가 @sync_clk_out의 clock edges 모두에 민감한 경우입니다(즉, DDR input이 있는 경우). 일반적으로 그렇지 않습니다.

data outputs와 정렬된 output clock을 생성하기 위해 output DDR register를 사용할 수 있습니다. 아이디어는 clock edges모두에서 값을 변경하는 flip-flop을 사용하는 것입니다. 따라서 이러한 flip-flop은 다음과 같이 작동합니다.

always @(posedge clk or negedge clk)
     if (clk)
       sync_clk_out <= 0;
     else
       sync_clk_out <= 1;

@clk의 rising edge 에 대한 응답으로@sync_clk_out가 로우로 변경됩니다. falling edge로 인해 그 반대가 발생합니다. 결과는 동일한 주파수를 가진 output clock 입니다.

그러나 이 Verilog 코드는 대부분의 synthesizers에서 작동하지 않습니다. 왜냐하면 logic fabric 의 flip-flops는 일반적으로 두 clock edges모두에 민감할 수 없기 때문입니다. IOB registers 만이 이 기능을 가지고 있으며 synthesizer는 이 가능성을 이해할 만큼 영리하지 않습니다.

따라서 logic primitive 의 instantiation이 필요합니다. primitive는 사용되는 FPGA 에만 해당됩니다. 이 예는 Kintex Ultrascale에서 이 작업을 수행하는 방법을 보여줍니다.

ODDRE1 ODDR_ins
     (.C(clk), .Q(sync_clk_out),
      .D1(1'b0), .D2(1'b1),
      .SR(1'b0));

그러나 이제 clock은 output DDR register 로 생성되고 data signals는 일반 IOB registers로 생성됩니다. data 와 clock 사이의 정렬은 이전만큼 명확하지 않습니다. 따라서 모든 outputs에 대한 timing reports를 읽고 delays 간의 차이가 충분히 작은지 확인하는 것이 중요합니다.

data 에도 output DDR registers를 사용할 수 있습니다. D1 와 D2에 동일한 값이 주어지면 output은 각 clock cycle에 대해 한 번만 변경됩니다.

module top (
   input clk,
   output [7:0] data_out,
   output sync_clk_out
);

   reg [7:0]  data;

   ODDRE1 ODDR_ins
     (.C(clk), .Q(sync_clk_out),
      .D1(1'b0), .D2(1'b1),
      .SR(1'b0));

   ODDRE1 ODDR_data_ins [7:0]
     (.C(clk), .Q(data_out),
      .D1(data), .D2(data),
      .SR(1'b0));

   always @(posedge clk)
     data <= data + 1;
endmodule

이 방법을 사용하면 data 와 clock이 정렬됩니다. output DDR registers 의 명시적 instantiation은 IOB registers가 사용되도록 보장합니다. 이 방법의 유일한 단점은 각 FPGA에 따라 다르다는 것입니다.

output DDR registers 의 동작은 예기치 않고 혼란스러울 수 있습니다. 예를 들어 @data는 @clk의 positive edge 와 동기화됩니다. 그러나 ODDRE1은 두 clock edges모두에서 활성화됩니다. 두 개의 data inputs를 샘플링하는 방법과 시기에 대해서는 FPGA 설명서를 읽어보십시오.

또한 이 예에서는 reset이 사용되지 않습니다. 이는 특히 정교한 FPGAs에서 안전하지 않을 수 있습니다. output DDR register는 IOB내부의 보다 복잡한 logic element 의 일부일 수 있습니다. 이러한 logic element는 reset없이는 올바르게 작동하지 않을 수 있습니다.

Timing constraints

이 방법에 timing constraints가 필요합니까? IOB registers덕분에 clock output 와 data outputs가 거의 완벽하게 정렬된다면 그것으로 충분하지 않을까요?

대답은 이 방법이 timing constraints없이도 완벽하게 잘 작동할 수 있다는 것입니다. 그러나 그럼에도 불구하고 timing constraints를 활용하는 것은 좋은 생각입니다. 그 이유는 IOB registers에 관한 페이지 의 동일한 주제와 동일합니다.

기타 고려 사항

그러나 IOB registers를 사용하는 것이 유일한 보장은 아닙니다. 또한 output ports사이의 물리적 근접성에 주의하십시오. output ports가 서로 멀리 떨어져 있는 경우 이 물리적 거리는 FPGA의 clock skew 에 나쁜 영향을 미칠 수 있습니다. PCB 의 와이어(traces) 길이 차이도 부정적인 영향을 미칠 수 있습니다. 또한 전기적 매개변수(voltage, I/O standard, slew rate, drive current 등)는 모든 outputs에서 동일해야 합니다.

FPGA 에 IOB registers가 없으면 timing constraints가 중요합니다. source-synchronous outputs를 사용하기 위한 기본은 모든 관련 output ports사이에 낮은 skew를 보장하는 기능입니다. 일반적으로 flip-flop 와 I/O pin 사이에서 delay을 제어하는 것으로 충분합니다. 이 delay이 관련 FPGA에 가능한 최소값에 가깝다면 outputs 간의 차이는 대부분의 목적에 충분히 작을 것입니다.

양방향 I/O

source-synchronous outputs 의 주요 특징은 관련 clock이 FPGA에서 생성된다는 것입니다. 이는 모든 data signals가 외부 구성 요소를 향할 때 분명히 적합합니다. 그러나 양방향에 data signals가 있는 경우에도 FPGA에서 생성된 clock 에 의존하는 것이 합리적일 수 있습니다.

그러나 data inputs는 FPGA내부의 clock이 아니라 PCB의 clock 와 동기화됩니다. 물론 이 두 clocks 의 주파수는 정확히 동일합니다. 하지만 output ports의 clock-to-output delay 에 따라 달라지는 timing 차이가 있습니다. 이것은 몇 나노초가 될 수 있습니다.

따라서 PCB에서 loopback을 만드는 것이 좋습니다. FPGA의 clock output을 input port에 연결합니다. 이 input port는 system synchronous clock 인 것처럼 취급할 수 있습니다. 외부 구성 요소는 clock이 FPGA가 아닌 전용 oscillator에서 온 것처럼 작동합니다. FPGA 와 외부 구성 요소가 모두 PCB의 동일한 물리적 signal 에 의존하기 때문에 이는system synchronous clock와 유사합니다.

Source synchronous bidirectional data with loopback of clock

data inputs를 source-synchronous inputs 로 취급하는 것도 가능할 수 있습니다. 특히 phase shifting 기술을 사용하면 clock loopback이 필요 없다. 이것은 실제로 DDR SDRAM memories와 인터페이스하는 일반적인 방법입니다.

중요한 결론은 PCB를 제조하기 전에 input signals 의 timing을 신중하게 계획하고 필요한 경우 clock loopback 추가를 고려하는 것입니다.

이 페이지는 영어에서 자동으로 번역됩니다. 불분명한 사항이 있으면 원본 페이지를 참조하십시오.
Copyright © 2021-2024. All rights reserved. (6f913017)