Table of Contents
רכישת נתונים מהירה גבוהה היא דרישה בסיסית בתחומים החל מטלמטארי אווירוקל לדמיית רפואית ומכשור מדעי.פתרונות מסורתיים כמו ASICs ייעודי או רשומות מונעות תוכנה לעתים קרובות נכשלים כדי לעמוד בשילוב של זמן אמיתי באמצעות לוח, גמישות, וגמישות נמוכה לקליטת נתונים על ידי מערכות ניהול נתונים אינטנסיביות של VHD (FPGAs) גשר זה על ידי מתן פערים אדריכליים סטנדרטיים של מערכת ניהול נתונים יעילה על ידי פיתוח גבוהה של מערכת אבטחה VLC (R) עם פונקציות אבטחה גבוהה של מערכת אבטחה גבוהה של אבטחה VLCD.
למה FPGAs עבור High-Speed Data Recording
שקיפות ושקיפות מוחלטת
בניגוד מיקרומעבדים או DSPs המבצעים הוראות באופן משמעותי, FPGAs מעבד נתונים בחומרה מקבילה אמיתית. עבור מקליט נתונים, זה אומר שאתה יכול ללכוד נתונים מערוצי מהירות מרובים, לבצע עיבוד (מסנן, decimation או פורמט), לטבול את התוצאות, ולייעל אותם לאחסון - בחומרה ללא CPUhead כל פעולה פועל ב-PTST, לוגיקה ייעודית להקלטות סגורות או ל-TPTSDTPTSTECTS.
תזמון
רשומות נתונים מהירות גבוהה חייבות ממשק עם מגוון מקורות: ממירים אנלוגיים-ל-דיגיטליים (ADCs) באמצעות LVDS או JESD204B, ממשקי מולטימדיה (HDMI), קישורים מצלמה או אוטובוסים חיישנים מותאמים אישית.FPGAss תמיכה מיידית טווח רחב של I / O סטנדרטים (LVDS, HSTL, SSTL, זוגות שונים) ו- IPGIX (GD) , Ix-LGIX) , Ix-LGIX-T) לוגיקה מיידית, IGIX , Ix , IGTP , , , IGLGLGIX לוגיקה , לוגיקה , I/GL , , , , , , Ix לוגיקה , , לוגיקה לוגיקה , , , , , לוגיקה מיידית , , , , I/GTP , , לוגיקה מיידית לוגיקה של I/GTP , I/GTP , , , I/GTP לוגיקה לוגיקה של ® , I/GTP , I/GTP
In-Flight Reconfigurability
יישומים רבים להקליט דורשים את המערכת להתאים לשיעורי נתונים שונים, ספירת ערוצים, או תוכניות קידוד ללא שינויים בחומרה. FPGAs יכול להיות באופן חלקי או מלא מחדש על קישור PCIe, Ethernet, או ממשק תצורה ייעודי.יכולות אלה מאפשרות לוח רישום יחיד לשרת משימות מרובות - למשל, מעבר בין תצורה של 12 סיביות 1 GSPS וממשק תצורה של 2 ערוצים 500-MS-DRS מוגדר)
שיקולים מרכזיים ומסחר
אדריכלות זיכרון וזיכרון
נתונים באמצעות חישוב בפנקס מוגבל על ידי שלושה גורמים: שיעור לכידת קלט, יכולת השחיקה הפנימית, והפלט כותב רוחב פס למדיום האחסון (למשל, מערך SSD, DRAM או הזרמת קישורים) את התפוקה הגרועה ביותר הנמשכת דרך לוח חייב לעלות על שיעור הנתונים הממוצע כדי להימנע מאובדן נתונים.
- (FLT:0)-chip חוסם RAM (BRAM): אנדרל 1 מהיר, דואל-פורט, אך מוגבל ביכולת (בדרך כלל כמה עשרות Mbits ב FPGAs המודרנית).
- (FLT:0)External DRAM (DDR3/DDR4/LPDDR4): קיבולת גבוהה 1 (multiple GB) אך עם מגבלות רוחב פס.בקר DDR מעוצב היטב (לעיתים קרובות מוכר IP) בשילוב עם חיבור AXI רב ערוצים יכול לספק עשרות ג'יגה-בתים/מצטברות רוחב פס.
- (FLT:0)External SRAM:FLT:1ir 1Lower latency מאשר DRAM, אך צפיפות נמוכה יותר; שימושית עבור פיסקים עמוקים שבהם נדרש זמן גישה רדיניסטי.
- (FLT:0) אחסון סדרתי מהיר: FLT:1 Direct Writing to NVMe SSDs over NVMe over PCIe או באמצעות גשר ייעודי (למשל, Xilinx QDMA IP) זה מטביע נתונים גדולים לזיכרון לא-וולטאי, אך דורש שליטה על זרימה זהירה למניעת buffer overflow.
ב VHDL, אתה מדגמן את הזיכרונות האלה כערכים או פרימיטיביים של ספק מיידי.לדוגמה, קרן גנרית באמצעות BRAM עשויה להיות פרמטר עומק שנקבע בזמן הרכיב, בעוד ש-DDR-backed buffer יממשק באמצעות מנוע AXI4 ממפה זיכרון.
המונחים: מטבוליזם ומטבוליזם
שיאי נתונים מהירים מאוד משתרעים על מספר רב של תחומי שעון: שעון מדגם ADC (בהחלט > 1 GHz), שעון הבד FPGA (לעתים קרובות חלוקת ההתייחסות הטרנסצרצטיבית), שעון הבקר זיכרון, ושעון ממשק המערכת.מעבר תחומים אלה דורש בבטחה סינתזה נאותה טכניקות.השיטה החזקה ביותר היא להשתמש ב- כפול-שעון (עם קריאה עצמאית וכתוב כפול, ניתן ליישם את המהנדסים אלה עם ספקיתנים אפורים, אך ניתן לבחור ב-DSD-DS.
ניתן להפחית את המטבוליזם של צפיפות המשמשות למעבר שעון-דומיין באמצעות שימוש בשניים או יותר synSyncizing רישומים.תבנית VHDL נפוצה היא:
signal async_sig, sync1, sync2 : std_logic;
begin
process(clk) begin
if rising_edge(clk) then
sync1 <= async_sig;
sync2 <= sync1;
end if;
end process;
עבור אוטובוסים נתונים, זה בטוח יותר להשתמש פרוטוקול לחיצת יד או FIFO ולא מספר סינכרונים של סיביות.
תזמון קלוביט ב-High Frequencies
עיצובים FPGA מכוונים לנתוני ה-UHDL מעל כמה מאות MHz חייבים לעמוד בהגדרות מחמירות ולקיים מגבלות זמן. VHDL בנויות בצורה גרועה - כגון לוגיקה משולבת עמוקה, מספרים רחבים, או לחסום משימות בתוך בלוקים של תהליכים - יכול להוביל להפרות תזמון.
- (FLT:0)Pipe Stages:FLT:1 הכנס רישומים (שלבי פילין) במסלולי נתונים גבוהים או ארוכים.לדוגמה, סולם 64 סיביות בתוך לולאה accumulator צריך להיות רשום על קלט ופלט.
- (FLT:0)lock Gating and clock Enable:031) השתמש בסיגות שעון במקום לגוון את השעון כדי לעבור לוגיקה; שעונים שערים יוצרים סכנות תזמון ולתרום לשקוע.
- (ב) ⁇ :0) , ⁇ ⁇ (בדוגמא, סינתזה ⁇ , ו-max fanout) כדי להנחות את הכלים.ב VHDL אלה הם לעתים קרובות הוספה כהערות: FLT:1.
- (FLT:0) Floorplanning: FLT:1 Group במהירות גבוהה לוגיקה לאזורים ייעודיים של FPGA כדי להפחית את העיכובים בין-קישורים.
אדריכלות מערכת של מקליט מהיר טיפוסי
המונחים: front-End
המודול הראשון במסלול הנתונים לוכד נתונים ממקור חיצוני.עבור JESD204B ADCs, זה כרוך ב- JESD204B Transceiver IP (בדרך כלל מסופק על ידי ספק FPGA) המטפל בסינכרון נתיב, חתירה וזיהוי שגיאות. עבור LVDS ADCs מקבילים, אתה משתמש ב- deserializer (RDES ב- Xilinx, ALT plation לעתים קרובות ל-Crei) לתוך שעון מקבילהשעון.
עיבוד נתונים ועיבוד
נתונים שנלכדו עשויים לדרוש פעולות בזמן אמת לפני האחסון:
- (FLT:0) הפחתה / חסימה: ההרחבה 1 (הפחתת שיעור הנתונים על ידי גורמים integer באמצעות מסננים integrator-comb (CIC) או מסננים FIR המיושמים כ-concumulateulate (MAC) בלוקים.
- (FLT:0)Conversion to Standard Format:FLT:1 ו-Wrapping נתונים למסגרות עם תזמון, מזהה ערוצים ומילים של בדיקת שגיאות (למשל, CRC) זה מפשט את עיבוד הזרם או ניתוח הרשמה לאחר ההרשמה.
- (ב) [15] ,(א) , ⁇ ⁇ : ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
כל מודולי העיבוד צריכים להיות ממוצבים כדי לשמור על שקיפות נמוכה.לדוגמה, מסנן פוליפאוזה decimation ניתן לבנות כמערך סינתי של פרוסות DSP המחוברות על ידי נתיבי נתונים רשומים.
בקרה וזרימה
buffer גמיש (FIFO) מפוצץ את מתחם השעון ללכוד מתחום השעון אחסון.העומק FIFO חייב להיות בגודל על בסיס אורך קלט הגרוע ביותר התפוצצות ואת הזמן שלוקח עבור ממשק האחסון כדי להתחיל לכתוב. גישה נפוצה היא להשתמש ב-FIFO עם פרמטרים כמעט מלא וכמעט אמפרטי כדי ליצור אותות אחוריים.
אחסון Interface
השלב האחרון כותב את הנתונים החשופים לאמצעי ביניים מתמשך.אפשרויות כוללות:
- (FLT:0)PCIe DMA כדי לארח RAM או SSD:03:03: 1 השתמש במנוע DMA (למשל, Xilinx QDMA או Intel P-Tile DMA) כדי להעביר נתונים ישירות לזיכרון המערכת או כונן NVMe. FPGA פועל כנקודת קצה PCIe ונהגים לנהל טבעות buffer.
- (FLT:0)המדריך הישיר של זיכרון פלאש: 10.10.1 עבור מקליטים עומדים, אתה יכול ממשק עם פלאש NAND או eMMC באמצעות בקר המיושם ב VHDL. זה מורכב יותר אבל מספק פתרון מוטבע במלואו.
- (ב) קישורים מהירים (למשל, אורורה, GDS): ⁇ 1 עבור הזרמת בשר מרוחק או כרטיס FPGA אחר.
לכל ממשק יש פרוטוקול משלו ומנגנון בקרת זרימה.לדוגמה, מקליט מבוסס PCIe ישתמש בשרשרת מבוססת זיכרון או מבוססת זרם DMA; ה- VHDL חייב לנהל בקשות עסקה, טיפול בהשלמה ובקרת זרימה מבוססת אשראי.
הוראות VHDL
Define the Top-Level Entity and Ports
התחל על ידי רישום כל ממשק חיצוני: קלטי שעונים (שעון הסימון ושעון הבד מ- PLL), קלטי נתונים מ- ADCs, אותות תצורה וממשק אחסון (למשל, PCIe זוגות שונים).
entity high_speed_recorder is
generic (
ADC_CHANNELS : integer := 2;
DATA_WIDTH : integer := 16;
FIFO_DEPTH : integer := 1024
);
port (
ref_clk_p, ref_clk_n : in std_logic; -- differential reference
adc_data : in std_logic_vector(ADC_CHANNELS * DATA_WIDTH - 1 downto 0);
adc_clk : in std_logic; -- sample clock
pcie_tx_p, pcie_tx_n : out std_logic_vector(3 downto 0);
pcie_rx_p, pcie_rx_n : in std_logic_vector(3 downto 0);
-- more ports...
);
end entity;
שעון מיידי ו-I/O Primitives
השתמש פרימיטיביים ספציפיים של הספק עבור שעונים (למשל, Xilinx MMCM / PLL) ו- Speed-Speed I / O (ISERDES, OSERDES, או Transceive עוטפים) ב VHDL, אלה נקראים לעתים קרובות כ-Micro Momentiations.לדוגמה, כדי למתן שיlinx MM עם שלב דינמי, אתה יכול לכתוב:
mmcm_inst : entity work.mmcm_wrapper
generic map (
MULT => 8.0,
DIV => 1
)
port map (
clkin1 => ref_clk,
clkout0 => fabric_clk,
clkout1 => transceiver_clk,
locked => pll_locked
);
בניית נתיב הנתונים
לכתוב את ההיגיון השולט שמעבד נתונים מהתבוא deserializer לפלט FIFO. השתמש בעיצוב היררכי: כל בלוק פונקציונלי (deserializer, FIFO, פורמט נתונים) הוא ישות נפרדת VHDL.חבר אותם באמצעות אוטובוסים אותות (מערךי vectors vectors) אשר עוקבים אחר פרוטוקול עקבי, כגון פשוט / מכנה יד טיפוסית:
-- Producer side
if rising_edge(clk) then
if ready = '1' and valid = '1' then
-- data transferred
end if;
end if;
-- Consumer side
if rising_edge(clk) then
if valid = '1' and ready = '1' then
-- consume data
end if;
end if;
פרוטוקול זה הוא הבסיס של AXI4-Stream, אשר נתמך על ידי ספריות המוכרות.
פרטים על FIFO
להלן גרסה משופרת של פיסק דו-צדדי עם פרמטרים גנריים כמעט מלא / כמעט מלא / כמעט-על דגלים.בניגוד למלכוד המקורי, גרסה זו משתמשת בקידוד integer עבור ניהול נגד וצביע, ומשתמש קוד אפור עבור הכתובת מעבר את התחום השעון כדי למנוע שגיאות סינכרון מרובות סיביות. עיצוב אמיתי ישתמש בספקי פרימיטיביים (למשל, Xilinx FI) עבור ייצור VHD: יישום שגיאות סינכרורינג לוגיקה.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity dual_clock_fifo is
generic (
DATA_WIDTH : integer := 64;
ADDR_WIDTH : integer := 10 -- depth = 2^ADDR_WIDTH
);
port (
wr_clk : in std_logic;
wr_rst : in std_logic;
wr_en : in std_logic;
wr_data : in std_logic_vector(DATA_WIDTH-1 downto 0);
full : out std_logic;
almost_full : out std_logic;
rd_clk : in std_logic;
rd_rst : in std_logic;
rd_en : in std_logic;
rd_data : out std_logic_vector(DATA_WIDTH-1 downto 0);
empty : out std_logic;
almost_empty: out std_logic
);
end entity;
architecture rtl of dual_clock_fifo is
type memory_t is array (0 to (2**ADDR_WIDTH)-1) of std_logic_vector(DATA_WIDTH-1 downto 0);
signal mem : memory_t;
signal wr_ptr, rd_ptr : unsigned(ADDR_WIDTH-1 downto 0);
signal wr_gray, rd_gray : unsigned(ADDR_WIDTH-1 downto 0);
signal wr_count, rd_count : unsigned(ADDR_WIDTH downto 0); -- include overflow bit
signal sync_wr_ptr, sync_rd_ptr : unsigned(ADDR_WIDTH-1 downto 0);
signal sync_wr_count, sync_rd_count : unsigned(ADDR_WIDTH downto 0);
begin
-- Write pointer and memory write
process(wr_clk) begin
if rising_edge(wr_clk) then
if wr_rst = '1' then
wr_ptr <= (others => '0');
wr_count <= (others => '0');
elsif wr_en = '1' and full = '0' then
mem(to_integer(wr_ptr)) <= wr_data;
wr_ptr <= wr_ptr + 1;
wr_count <= wr_count + 1;
end if;
wr_gray <= (wr_ptr srl 1) xor wr_ptr; -- binary to gray
end if;
end process;
-- Read pointer and memory read
process(rd_clk) begin
if rising_edge(rd_clk) then
if rd_rst = '1' then
rd_ptr <= (others => '0');
rd_count <= (others => '0');
elsif rd_en = '1' and empty = '0' then
rd_count <= rd_count + 1;
rd_ptr <= rd_ptr + 1;
end if;
rd_gray <= (rd_ptr srl 1) xor rd_ptr;
end if;
end process;
-- Synchronize write pointer to read clock domain
process(rd_clk) begin
if rising_edge(rd_clk) then
sync_wr_ptr <= wr_gray;
end if;
end process;
-- Synchronize read pointer to write clock domain
process(wr_clk) begin
if rising_edge(wr_clk) then
sync_rd_ptr <= rd_gray;
end if;
end process;
-- Full and empty detection using gray-code pointers (simplified)
-- Full when (wr_gray ~ sync_rd_ptr) and top two bits differ
full <= '1' when (wr_gray(ADDR_WIDTH-1) /= sync_rd_ptr(ADDR_WIDTH-1) and
wr_gray(ADDR_WIDTH-2 downto 0) = sync_rd_ptr(ADDR_WIDTH-2 downto 0)) else '0';
empty <= '1' when (rd_gray = sync_wr_ptr) else '0';
-- Almost flags (threshold defined by constants)
almost_full <= '1' when wr_count >= 2**ADDR_WIDTH - 8 else '0';
almost_empty <= '1' when rd_count <= 8 else '0';
rd_data <= mem(to_integer(rd_ptr));
end rtl;
אינטגרציה ו- Top-Level Wiring
באדריכלות ברמה העליונה, אתה מידת את PLL, deserializer, FIFO וממשק אחסון, ולאחר מכן לחבר אותם באמצעות משימות אותות. לשים לב זהיר כדי לאפס את קוטביות ושעון לאפשר propagation. A התרגול הטוב ביותר הוא להשתמש איפוס סינכרוני המונע על ידי שעונים התחום בהתאמה, נטען באופן מסונכרן אך מרתיע, כדי למנוע metastability.
אסטרטגיות ואימות
סימולציה עם Testbenches
(הופנה מהדף באופן עצמאי: לאמת את ה-FIFO עבור רצף קריאה / כתיבה נכון, בתנאים של זרימה / זרימה, ו מעקב אחר קוד אפור-קוד-קוד (DFO) של בדיקת מידע עצמי שיוצר נתונים אקראיים ומשווה את הפלט לאחר עיכוב.עבור המערכת המלאה, ליצור בדיקת מבחן אשר מחקה את ממשק ADC עם תבנית ממוחשבת ומודל לאחסון עבור כלי ה-DVLT2F:
תזמון Closure ופוסט-Placement Verification
לאחר סינתזה ומימוש, להפעיל ניתוח תזמון סטטי בכל תחומי השעון.לקדיש תשומת לב מיוחדת לנתיבים רבי מחזור (למשל, זיכרון קורא פעולות כי להשלים לאחר יותר ממחזור שעון אחד) ונתיבים מזויפים (למשל, מעבר לשעון synSyncizers) השתמש בדיווחים כדי לזהות התקנה כושלת או להחזיק lacks, ולאחר מכן להוסיף שלבים או להתאים למגבלות מהירות גבוהה כגון DLTFexice, אם ILTxers, לדוגמה, IFerstextials: IFertexertexerationeration או IFer.
המונחים:
Prototype על לוח פיתוח FPGA עם משאבים דומים (למשל, Xilinx Kintex-7, Virtex-7, או AMD Zynq UltraScale+) מזרקת דפוסי בדיקה ידועים (כמו רזול חוזר או רצף PRBS) ב- ADC קלט ולוודא את הנתונים שנתפסו תואם את התבנית הצפויה לאחר אחסון או קריאה.
דוגמאות ל- Real-World
- (FLT:0)Radar ו- Lidar Systems:FLT:1 רשומות נתוני I/Q מערוצים מרובים במספר GHz של GHz sampling עבור גילוי מטרה ו סיווג לאחר עיבוד. FPGAs מטפל ב-Time דיגיטלית ירידה למטה לוכדת ו-bu the data to SSDs over SATA או PCIe.
- (FLT:0) Software-Defined Radio (SDR): FLT:1 שיאים מהירים ללכוד ספקטרום פס רחב (למשל, 400 MHz רוחב פס מיידי) לניתוח מאוחר יותר של דפוסי התערבות או אינטליגנציה אותות.הרשם כולל לעתים קרובות מסננים decimation המאפשרים מבחר דינמי של רוחב פס במהלך לכידתו.
- (FLT:0) פיזיקה גבוהה-אנרגיה:FLT:1 בניסויים ב CERN או מתקנים דומים, יש לרשום נתונים מאלפי ערוצי גלאי עבור התפרצויות קצרות. FPGAs מצטבר הנתונים, להוסיף דגימות, ולכתוב DRAM לפני קריאה איטית לשרתי אחסון.
- (FLT:0Medical Ultrasound:FLT:1 בזמן אמת היווצרות תמונה ברזולוציה גבוהה דורש לכידת ערוצי טרנספורמטיביים מרובים בעשרות מ"ר לערוץ. FPGA מאוחסנים נתוני ערוץ גולמי עבור אלגוריתמים שיקום לא מקוון.
מסקנה
תכנון מסד נתונים מבוסס FPGA הוא משימה הנדסית מתוחכמת הדורשת הבנה מעמיקה של עיצוב דיגיטלי, ניהול שעון, היררכיות זיכרון ופרוטוקולים ממשק. VHDL מספק את הדיוק והשליטה הדרושים כדי ליישם נתיבי נתונים מותאמים אישית הפועלים בגבולות החומרה.על ידי טיפול שיטתי באמצעות חישוב, עוט, מעברי השקעות, ותזמון, מהנדסים יכולים לבנות תיעוד כי דרישות מהירות לעמוד ביישומים מתקדמים של אותה יישום יעיל של מערכת ההפעלה.
(ב) לקריאה נוספת, מומלץ להתייעץ עם מדריך משאבי זיכרון (FLT:0) של BRAM מפורט ופרימיטיבי FIFO או FLT:2 Intel FPGA גבוה במהירות I / O Design GuideveFLT 3: עבור שימוש טרנסצנטרי.