Tôi có cần thiết lập lại thiết kế FPGA sau khi khởi động không?


7

Tôi thường khởi tạo các thanh ghi trạng thái của các FSM của mình bằng cách chỉ định giá trị ban đầu trong mã VHDL của tôi, do đó, tôi không yêu cầu xung đặt lại sau khi khởi động FPGA được cấu hình. Ví dụ sau đây chứng minh điều này bằng một "bộ đếm vòng" chỉ hợp nhất tất cả các thanh ghi trạng thái lại với nhau:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity counter_init is
  port (
    clock : in  std_logic;
    msb   : out std_logic);
end entity counter_init;

architecture rtl of counter_init is
  -- large counter to detect excessive skew on Global Write Enable (GWE)
  signal counter : unsigned(255 downto 0) :=
    x"55555555_55555555_55555555_55555555_55555555_55555555_55555555_55555555";
begin  -- architecture rtl

  counter <= counter(0) & counter(counter'left downto 1) when rising_edge(clock);

  -- The counter value will be observed by an on-chip logic analyzer.
  -- Output most-significant bit to prevent synthesizing away the above logic.
  msb <= counter(counter'left); 

end architecture rtl;

Kỹ thuật này đã làm việc trong các thiết kế của tôi cho Altera hoặc Xilinx FPGA cho đến nay. Tôi đã kiểm tra rõ ràng bằng cách sử dụng bộ phân tích logic trên chip dành riêng cho nhà cung cấp và bộ kích hoạt khởi động. Đây là một ảnh chụp màn hình của ChipScope, ok một chu kỳ bị bỏ qua rõ ràng:

Ảnh chụp màn hình ChipScope

Nhưng, sau khi đọc các tài liệu, tôi tự hỏi làm thế nào nó hoạt động: Làm thế nào để tất cả các flip-flop (được kết nối với cùng một tín hiệu đồng hồ) bắt đầu chuyển đổi cùng một lúc?

Trình tự khởi động cho một Xilinx FPGA được mô tả trong Hướng dẫn sử dụng cấu hình 7 sê-ri (UG470) chẳng hạn. Sau khi cấu hình của FPGA, một chuỗi khởi động được thực thi để xác nhận "Kích hoạt ghi toàn cầu (GWE)" Bảng 5-12 :

Khi được khẳng định, GWE cho phép các flip-flop CLB và IOB cũng như các yếu tố đồng bộ khác trên FPGA.

và trong phần chú thích:

GWE được khẳng định đồng bộ với đồng hồ cấu hình (CCLK) và có độ lệch đáng kể trên toàn bộ phần. Do đó, các yếu tố tuần tự không được phát hành đồng bộ với đồng hồ hệ thống của người dùng và vi phạm thời gian có thể xảy ra trong quá trình khởi động. Nên đặt lại thiết kế sau khi khởi động và / hoặc áp dụng một số kỹ thuật đồng bộ hóa khác.

Vì vậy, điều này thực sự có nghĩa là: Nếu đồng hồ ở flip-flop đã bật, thì tất cả các flip-flop có thể bắt đầu chuyển đổi ở các thời điểm / cạnh đồng hồ khác nhau . Cho rằng bộ tạo dao động xung nhịp trên bo mạch đồ họa đã chạy và tôi đang sử dụng bộ đệm đồng hồ toàn cầu mà không có đầu vào kích hoạt ( BUFG): Đầu vào đồng hồ ở các flip-flop đã được bật trước khi GWE được xác nhận chưa?

Tôi không tìm thấy bất kỳ thông tin nào trong UG470 về việc và cách kích hoạt bộ đệm đồng hồ. Và Xilinx 7 Series FPGA và Zynq-7000 Tất cả Hướng dẫn về Thư viện SoC có thể lập trình cho Thiết kế HDL (UG768) chỉ nói rằng đầu vào kích hoạt đồng hồ của một đồng hồ BUFGCTRLphải được xác nhận đồng bộ. Nhưng, đây thực sự là một đầu vào hướng đến người dùng.

Đối với Altera Cyclone III FPGA tôi cũng đang sử dụng, tôi không tìm thấy bất kỳ thông tin liên quan nào trong Cẩm nang thiết bị Cyclone III .

Nhắc lại: Tôi đã không quan sát thấy bất kỳ khởi tạo thất bại nào cho đến nay, nhưng điều này dường như không được chỉ định trong các tài liệu.


2
Một quy tắc chung - không được tính vào những thứ mà bạn không kiểm soát. Nếu trạng thái khởi động của bạn là quan trọng, hãy cung cấp thiết lập lại bên ngoài sẽ phát hành sau khi cấu hình hoàn tất.
WhatRoughBeast

1
Austin Lesea là anh chàng từ Xilinx để trả lời câu này, tôi nghĩ, tôi nhớ đã đọc một lưu ý ứng dụng do ông viết hoặc đề nghị giải thích điều này - ah yeah, đây là một: xilinx.com/support/documentation/white_papers/wp272.pdf
Krunal Desai

@KrunalDesai Giấy trắng thực sự tuyên bố rằng không yêu cầu thiết lập lại do người dùng xác định vì flip-flop và vv được đặt lại thành giá trị ban đầu trong quá trình cấu hình. Nhưng điều này mâu thuẫn với chú thích được trích dẫn trong câu hỏi của tôi: Nên đặt lại thiết kế sau khi khởi động và / hoặc áp dụng một số kỹ thuật đồng bộ hóa khác.
Martin Zabel

Câu trả lời:


4

Bạn nên cho rằng đầu vào đồng hồ cho flip-flop của bạn đang bật, trừ khi bạn có thể chứng minh bằng cách khác (bằng cách bật nguồn được bảo đảm hoặc trì hoãn cấu hình bài). Tất cả các flip-flop trên một miền đồng hồ nhất định không được đảm bảo để bắt đầu trên cùng một cạnh đồng hồ dựa trên GWE hoặc GSR. Cả hai hoạt động như một thiết lập lại không đồng bộ và gây ra các vấn đề tiềm ẩn đối với một số logic (bộ đếm, máy trạng thái nóng, v.v.).

Cụ thể là một máy trạng thái nóng, chuyển đổi ngay sau khi cấu hình SILL (cuối cùng) FAIL (chuyển sang trạng thái không hợp lệ). Tần suất thất bại sẽ phụ thuộc vào thời gian đồng hồ so với độ lệch cụ thể của thiết bị (và địa điểm và tuyến đường) cho thiết kế của bạn.

Một thử nghiệm đơn giản khác để xem hành vi này khởi tạo bộ đếm đếm tương đối nhanh với 10000000 và xem xét hành vi của nó ngay sau khi định cấu hình. Một số bit thực hiện quá trình chuyển đổi sang 01111111 và một số bit bỏ lỡ quá trình chuyển đổi đầu tiên nhưng trình tự đếm tiếp theo sẽ chính xác.

Sách trắng được đề cập bởi Krunal Desai nói về chính vấn đề này và là một tài liệu tham khảo tuyệt vời. Bất kỳ GPU dựa trên SRAM rất có thể sẽ có một vấn đề tương tự.

Không cần thiết lập lại các thanh ghi để có được một giá trị đã biết. Nếu bạn có logic nhạy cảm với tất cả bắt đầu trên cùng một cạnh đồng hồ sẽ cần thêm logic đồng bộ hóa (điều này có thể bao gồm thiết lập lại được xác nhận đồng bộ hoặc logic đồng bộ khác). Xilinx AR44174 nói về vấn đề này nhiều hơn một chút. Tôi sẽ thêm một phương pháp giảm thiểu thứ ba để đảm bảo logic xung nhịp không thay đổi / chuyển đổi trong vài chu kỳ xung nhịp đầu tiên sau khi khởi động.


Tôi sẽ kiểm tra ví dụ truy cập của bạn tomorow. Sách trắng thực sự tuyên bố rằng không cần thiết lập lại do người dùng xác định vì flip-flop và vv được đặt lại thành giá trị ban đầu trong quá trình cấu hình. Nhưng điều này mâu thuẫn với chú thích được trích dẫn trong câu hỏi của tôi: Nên đặt lại thiết kế sau khi khởi động và / hoặc áp dụng một số kỹ thuật đồng bộ hóa khác. Vì vậy, lời khuyên của bạn là thiết lập lại (các phần có liên quan của thiết kế) sau khi khởi động?
Martin Zabel

Bạn đang thực hiện một đăng ký thay đổi không phải là một bộ đếm, đúng không? Tôi tin rằng điều này sẽ cho thấy hành vi trục trặc là tốt. Tốc độ đồng hồ bạn đang chạy? Nếu tốc độ không đủ nhanh, bạn có khả năng thấp về độ lệch của cầu nối GWE trong một chu kỳ đồng hồ. Tôi sẽ chạy đồng hồ nhanh nhất có thể, nếu công cụ đặt các thanh ghi (hoặc máy ảnh DSLR) gần nhau, nó cũng có tác dụng giảm thiểu độ lệch của GWE.
davidd

Đó là một bộ đếm ngược đầu tiên, nhưng sau đó tôi nhận ra rằng tôi cần một bộ đếm vòng / bộ dịch chuyển vòng, để tất cả các bit chuyển đổi ở cạnh đồng hồ đầu tiên. Nhân tiện, bộ phân tích logic trên chip chạy cùng một đồng hồ và quan sát duy nhất là chu kỳ xung nhịp đầu tiên được bỏ qua một cách xác định trong dấu vết. Tôi sẽ xem AR từ Xilinx.
Martin Zabel

5

Đối với các Xilinx FPGA, Bản ghi Trả lời AR # 44174 xác nhận rằng:

  • Vi phạm thời gian có thể xảy ra với flip-flop và SRL vì GWE đang phát hành các yếu tố đồng bộ liên quan đến đồng hồ cấu hình thay vì đồng hồ hệ thống của người dùng.

  • Tuyên truyền tín hiệu GWE có nghĩa là các SRL và flip-flop có thể được phát hành tại các thời điểm hơi khác nhau, dẫn đến một số phần của thiết kế bắt đầu trước các phần khác.

Vì vậy, chúng tôi có hai lựa chọn:

  1. Dừng đồng hồ hệ thống của người dùng cho đến khi khởi động hoàn tất.
  2. Tự động áp dụng xung đặt lại sau khi GWE hoặc tương tự được xác nhận.

Nếu không có đầu vào thiết lập lại bên ngoài được yêu cầu khác trong thiết kế, thì giải pháp 1 trong Bản ghi câu trả lời là hữu ích cho Xilinx FPGA.

  • Ban đầu sau khi khởi động, nên dừng đồng hồ.
  • Khi tín hiệu EOS xác nhận từ nguyên thủy STARTUP, đồng hồ có thể được khởi động lại đồng bộ với hệ thống của người dùng.
  • Cách tốt nhất để kiểm soát điều này là sử dụng thiết lập lại BUFGCE, BUFR hoặc BUFHCE.

Tôi đã thử giải pháp này, nhưng Chipscope tiết lộ rằng không phải tất cả các dép tông bắt đầu chuyển đổi cùng một lúc. Dường như sự khẳng định đồng bộ của đồng hồ cho phép pin CEcủa BUFGCEkhông phải là dễ dàng.

Tôi khuyên bạn nên sử dụng kỹ thuật thứ hai (sau) thay thế. Thay vì thiết lập lại bên ngoài ( reset_pinbên dưới), '0' 0 (không thiết lập lại) chỉ cần được đưa vào bộ đồng bộ hóa thiết lập lại.


Nếu vẫn có thiết lập lại bên ngoài , thì bộ đồng bộ hóa thiết lập lại có thể được khởi tạo theo cách đó, rằng thiết lập lại sẽ được xác nhận sau khi GWE hoặc tương tự được xác nhận trong trình tự khởi động. Bộ đồng bộ hóa thiết lập lại sẽ không bắt đầu trình tự phát hành (tức là flip-flop chuyển sang '0') cho đến khi GWE được xác nhận. Thời lượng của chuỗi phát hành phải dài hơn độ lệch trên GWE. Giải pháp này sẽ hoạt động trên Xilinx và Altera FPGA.

Tuyên bố:

signal reset_sync : std_logic_vector(1 downto 0) := (others => '1');
signal reset : std_logic;

Thân kiến ​​trúc (chuỗi đăng ký):

reset_sync <= reset_sync(reset_sync'high-1 downto 0) & reset_pin when rising_edge(clock);
reset <= reset_sync(reset_sync'high); -- active-high

Tất nhiên, logic truy cập bây giờ yêu cầu thiết lập lại:

  process(clock)
  begin
    if rising_edge(clock) then
      if reset = '1' then
        counter <= x"55555555_55555555_55555555_55555555_55555555_55555555_55555555_55555555";
      else
        counter <= counter(0) & counter(counter'left downto 1);
      end if;
    end if;
  end process;

Ảnh chụp màn hình bên dưới hiển thị lỗi do xác nhận không đồng bộ của GWE. Để kích thích những điều này, tôi đã bỏ qua việc khởi tạo tín hiệu, do đó, tất cả các flip-flop được khởi tạo thành '0' trong khi cấu hình. Như đã resetđược khẳng định ngay từ đầu, người ta sẽ mong đợi rằng tất cả các flip-flop thay đổi thành giá trị đặt lại được yêu cầu với cạnh xung nhịp tăng đầu tiên sau khi GWE được xác nhận. Nhưng, tại thời điểm 0 (điểm đánh dấu T), giá trị bộ đếm không phải là một chuỗi x "5". Do chuỗi đặt lại, giá trị đặt lại dự kiến ​​sẽ được khôi phục. Thiết lập lại được phát hành trong chu kỳ 2 (dấu X), để tất cả các flip-flop chuyển đổi trong các chu kỳ phụ liên tiếp. Tần số xung nhịp ở đây là 200 MHz.

Ảnh chụp màn hình ChipScope với khởi tạo thất bại

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.