יום שלישי, 17 בינואר 2012

כיפת ברזל

כולנו נחשפנו בשנה האחרונה ליכולותיה של מערכת כיפת ברזל, המשמשת ליירוט רקטות קצרות טווח המשוגרות לעבר יישובי הדרום. המערכת המורכבת הזו, המהווה דוגמה ל-System of systems, מסוגלת להתמודד עם כל תנאי מזג האויר, באור ובחושך, ואף עם תרחיש הכולל מספר רב של טילים הנעים בו זמנית במרחב.

החל מגרסת R2010a, שיצאה לפני קרוב לשנתיים, נוספה ל-Simulink פונקציונליות הנקראת For Each Subsystem. הבלוק הזה מאפשר לבצע "סימולצית על" המורכבת מתת סימולציות של מספר מערכות בעלות אופי זהה הפועלות במקביל אך בעלות פרמטרים ותנאי התחלה שונים. ניתן, למשל, להשתמש בו לצורך מידול וסימולציה של תנועת להק מטוסים, קווי ייצור רובוטיים וכן יירוטי טילים.

זה בדיוק מה שעשה אריאל רובננקו, העובד יחד עמי בחברת סיסטמטיקס:

 אריאל, אשר הינו מהנדס אפליקציה לתחום הסימולציות האווירונאוטיות ובקרת טיסה, פיתח את המודל הבא:


המודל מסייע לסמלץ תנועה של מספר גופים במקביל, תוך שימוש בבלוקים מסוג For Each Subsystem, הצבועים באדום וירוק. הבלוק הצבוע באדום מסמלץ את הטילים התוקפים, אשר פרמטרי השיגור שלהם מוגרלים באמצעות שימוש ב-SimEvents, כלי המסייע למידול וסימולציה של מערכות המונעות על ידי אירועים בדידים. טילי האויב המשוגרים מזוהים על ידי מערכת מכ"מ, אשר אף משערכת את פרמטרי הטילים התוקפים (תוך שימוש במסנן קלמן), ודואגת לירי הטילים המגנים והנחייתם הראשונית. ההתבייתות הסופית של הטילים המגנים על המטרות מבוצעת על ידי חיישנים המותקנים בראשם (סימולציית הטילים המגנים ממומשת בבלוק הירוק).

הנה דוגמה להתמודדות של המודל שפיתח אריאל עם תקיפה של מספר טילים אדומים. כפי שתשימו לב, המערכת שלו לא מפספסת אף פעם, וגם הטילים הירוקים שלה זולים במיוחד...

ואם אתם רוצים להריד את הקוד ולהריצו אצלכם, תוכלו למצוא את המודל של אריאל כאן. כדי להריץ את המודל יש צורך ברישיון Simulink ו-SimEvents. אם אין לכם הרשאות לכלים האלה, אשמח לספק לכם גירסת ניסיון.
 
מה דעתכם על המודל של אריאל? האם הכרתם את בלוק ה-For Each Subsystem? מי מכם שמע על כלי ה-SimEvents?  

יום שני, 2 בינואר 2012

האצת ביצועי אלגוריתם לעיבוד וידאו בעזרת FPGA-in-the-Loop

"הרשו לי לפנות את הבמה פעם נוספת לטובת בלוגר אורח – יגאל ירוסלבסקי, אשר התארח בבלוג הזה לפני כחצי שנה. יגאל עובד יחד עמי בחברת סיסטמטיקס. ומתמחה בכלי MathWorks המיועדים לעולם התקשורת, עיבוד אות, יצירה אוטומטית של קוד HDL ואימות (Verification) שלו, וכן בתהליכי פיתוח של אלגוריתמים המתוכננים לפעול על FPGA-ים".
מה קיבלתם לראש השנה האזרחית? אתם לא באמת חייבים לענות, זאת הייתה שאלה רטורית שכל מטרתה היתה להביא אותי לספר על מה שאני קיבלתי. ובכן, אני קיבלתי לוח FPGA חדש, "צעצוע" שצפוי לספק לי שעות של הנאה בחודשים הקרובים. ומה היה הדבר הראשון אותו החלטתי לבדוק אחרי שפתחתי את הקופסא? ובכן, החלטתי לבדוק עד כמה הרצת האלגוריתם על גבי ה- FPGA יכולה להאיץ את ביצועי סימולציות ה-Simulink שלי.

אז הנה לכם, בפינה השמאלית עומד לו מעבד אינטל עם 4 ליבות הנמצא במחשב בעל 4 ג'יגה זכרון ומערכת הפעלה של 64 ביט. ומולו, בפינה הימנית, לוח FPGA של אחת משתי היצרניות הגדולות ביותר לשבבי FPGA. הלוח, אגב, איננו חמוש ב High-End FPGA חדש אלא ב-FPGA "ותיק" ממנו בשני דורות. אז מי לדעתכם ינצח? אם קראתם את הכותרת, אתם כבר יודעים את התשובה.

לטובת בדיקת הביצועים בחרתי במודל לדוגמה (DEMO) המסופק כחלק מה-HELP של MATLAB. הדמו עוסק בחידוד של וידאו על ידי שימוש ב-Computer Vision System Toolbox, והוא נמצא תחת כלי בשם EDA Simulator Link אשר שימש אותי לטובת הורדת קוד ה-HDL (הנוצר אוטומטית מתוך המודל) לתוך שבב ה-FPGA. אלה מכם שירצו לחזור על הפעולות שלי פשוט צריכים לחפש fil_videosharp_fpga ב-HELP בכל גרסת MATLAB החל מ-R2011a.

להלן המודל המיועד לריצה ב-Simulink "בלבד":


כאשר הרצתי חצי שניה של סימולציה ומדדתי זמן ריצה קיבלתי:

>> tic; sim('fil_videosharp_sim'); toc
Elapsed time is 752.932444 seconds.
לא מעט זמן... השאלה היא לאיזו תוצאה אפשר להגיע על ידי שימוש בלוח FPGA.

כדי לענות עליה, יש קודם כל לזהות איזה חלק מהמודל ניתן וכדאי להוריד אל ה-FPGA. ברור כי לא כל חלקי המודל ניתנים למימוש על גבי ה-FPGA, שכן המודל מורכב מלא מעט בלוקים שתפקידם לקרוא או להציג וידאו. אבל לב המודל, מסנן FIR דו-מימדי הצבוע בתמונה למעלה בצבע ורוד, בהחלט ניתן להורדה אל ה-FPGA, וטוב שכך. זהו צרכן זמן ה-CPU הגדול ביותר בסימולציה.

על מנת להוריד אלגוריתם לשבב FPGA, יש להפוך אותו לקוד Hardware Description Language, או בקיצור - HDL. ניתן לממש את האלגוריתם לעיל מחדש בשפת HDL באופן ידני, אך קל יותר פשוט להשתמש ב-Simulink HDL Coder שעושה זאת עבורנו בצורה אוטומטית – מהר יותר, ללא שגיאות קידוד, ופשוט יותר. כל מה שעלינו לעשות הוא להקליק עם הלחצן הימני של העכבר על הבלוק הורוד ולבקש יצירה של קוד HDL:

והתוצאה - קבצי ה-HDL של האלגוריתם (אצלי ברירת המחדל היא קבלת VHDL, אבל ניתן לקבל גם Verilog):

שימו לב כי הקבצים למעלה הינם "רק" קבצי מימוש האלגוריתם. על מנת ליצור את רכיבי השרות, האחראים בין היתר על ניהול התקשורת מול Simulink, יש לפתוח את אשף
ה-
FPGA-in-the-Loop  באמצעות הפקודה filWizard:

העבודה עם האשף די אינטואיטיבית, ובסיומה נוצרים בצורה אוטומטית קבצי השרות:

בנוסף, האשף יוצר גם בלוק Cosimulation אותו יש לשלב במקום הבלוק האלגוריתמי המקורי. שינוי נוסף שיש לבצע במודל המקורי הוא להתאים את הממשק בין המודל לבלוק הסימולציה, וכן יש לתרגם את ה-frames הדו-מימדים של אות הוידאו לוקטורים חד-מימדיים בעלי אותה כמות פיקסלים. המודל הסופי לצורך FPGA Cosimulation נראה כך:

וכעת, כל מה שנותר הוא רק לסתנז את קבצי ה-HDL לקבצים בינאריים הניתנים לטעינה לתוך ה-FPGA ולטעון אותם אל ה-FPGA. נשמע מסובך? אז תשמחו לגלות שגם תהליך זה נעשה בצורה אוטומטית. קליק כפול על בלוק ה-Cosimulation ולחיצה על Load יגרמו לביצוע תהליכי הסינתזה, המיפוי, המיקום, הניתוב וטעינת השבב:
לחיצה על כפתור ה-PLAY במודל ה-Simulink ומדידה של זמן הריצה עבור עיבוד 10 שניות של וידאו (פי 20 ממשך הוידאו שעיבדתי קודם לכן) מניבה את התוצאה הבאה:


>> tic; sim('fil_videosharp_fpga'); toc
Elapsed time is 7.571201 seconds.

סיכום כמותי:

Simulink בלבד:                         חצי שניה של וידאו מעובד = 753 שניות ריצה בפועל
קו-סימולציית Simulink + שבב FPGA: עשר שניות של וידאו מעובד = 7.6 שניות ריצה בפועל

בחישוב גס, שימוש ב- FPGA-in-the-Loop הביא להאצה של כמעט פי 2000 ! ואם הסימולציות שלכם כבדות יותר (כאלה שבהן איטרציה אחת יכולה לקחת שעות או אולי ימים), האצה של פי 2000 יכולה להיות קריטית לעתיד הפרוייקט שבמסגרתו הסימולציות האלה צריכות להתבצע. ואגב, אותם הכלים שהוזכרו לעיל יכולים לשמש לא רק לטובת האצת ביצועים, אלא אף לפיתוח השבב ולאימות קוד HDL ידני או קנוי מחברה חיצונית. אבל על כך אני כבר אכתוב בפעם אחרת.

האם הייתם מודעים ליכולת להאיץ סימולציות על ידי FPGA-in-the-Loop ? האם ידעתם שניתן גם להמיר קוד MATLAB לקוד HDL באופן אוטומטי?