תוכן עניינים:

ארדואינו כ- FPGA זן קרש זול: 5 שלבים (עם תמונות)
ארדואינו כ- FPGA זן קרש זול: 5 שלבים (עם תמונות)

וִידֵאוֹ: ארדואינו כ- FPGA זן קרש זול: 5 שלבים (עם תמונות)

וִידֵאוֹ: ארדואינו כ- FPGA זן קרש זול: 5 שלבים (עם תמונות)
וִידֵאוֹ: Arduino with built in FPGA: MKR Vidor 4000 Unboxing and initial setup 2024, נוֹבֶמבֶּר
Anonim
ארדואינו כ- FPGA זול ללוח לחם
ארדואינו כ- FPGA זול ללוח לחם

עיצוב מעגלי לוגיקה של חומרה יכול להיות כיף. הדרך הישנה של בית הספר לעשות זאת הייתה עם שערי NAND, על לוח לחם, מחוברים בחוטי מגשר. זה עדיין אפשרי, אך לא נדרש הרבה לפני שמספר השערים יוצא מכלל שליטה. אפשרות חדשה יותר היא להשתמש ב- FPGA (מערך שער לתכנות שדות). שבבים אלה יכולים לחבר את עצמם מחדש להפוך לכל מעגל לוגיקה דיגיטלית שתוכל לעצב, אך אינם זולים וזמינים. אני אראה כיצד ניתן להחליף את ה- FPGA הזה בשבב אטמגה זול מ- Arduino UNO, ולהכניס למעשה את המעגל הדיגיטלי לחבילת DIP, שהיא מאוד ידידותית ללוח.

שלב 1: תכנן את המעגל ש" FPGA "ייצג

עיצוב המעגל ש
עיצוב המעגל ש
עיצוב המעגל ש
עיצוב המעגל ש
עיצוב המעגל ש
עיצוב המעגל ש

אני אבנה אפרדר של 2 ביט + 2 סיביות. זה לוקח שני זוגות של סיכות קלט לוגיות, ויוצא שלישייה אחת של סיכות פלט.

כדי לעשות זאת עם שערי NAND, עיין בסכימה שבתמונה. הוא צריך 14 שערי NAND. השתמשתי בארבעה שבבי TTL שער NAND שער וחיברתי אותם על לוח הלחם.

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

מעגל זה פועל, אך הוא כבר תופס 4 שבבי TTL, והוא קן חוטים של חולדות. אם היו צריכים יותר פיסות, היו יותר לוחות לחם, ועוד קופצים. מהר מאוד גודל המעגל יצא מכלל שליטה.

הערה צדדית, כאשר עובדים עם שערים TTL, הם אינם מפלטים בדיוק 0V או 5V כפי שניתן היה לצפות. לעתים קרובות הם פלט סביב 3V עבור "גבוה", אבל המתח המדויק הוא בטווח רחב מאוד. אותו מעגל באמצעות השבבים המקבילים ל- CMOS יהיה טוב יותר בדיוק 0V עד 5V נדנדות בדיוק.

שלב 2: הזן את ה- FPGA

היכנס ל- FPGA
היכנס ל- FPGA
היכנס ל- FPGA
היכנס ל- FPGA

FPGA הוא שבב פנטסטי, שיכול ממש להפוך לכל שילוב של שערי היגיון, המחוברים יחד בכל שילוב. אחד מתכנן את "המעגל" בשפת עיצוב חומרה (HDL). ישנן מספר שפות כאלה שאחת מהן נקראת Verilog. קובץ ה-.v שבתמונה הוא המקבילה של Verilog לאפיית שני הסיביות. יש צורך גם בקובץ.pch שמתחתיו כדי להקצות את סיכות הקלט והפלט בשם בקובץ ה- verilog לפיני חומרה אמיתיים בשבב.

במקרה זה אני משתמש בלוח פיתוח iCEstick של Lattice Semiconductors (https://www.latticesemi.com/icestick). שבב ה- FPGA בפועל הוא iCE40HX-1k, עם קצת יותר מ -1000 שערים, שכל אחד מהם יכול להפוך לכל שער לוגי. כלומר כל שער יכול להיות שער NAND, או שער OR, NOT שער, NOR, XOR וכו '. בנוסף כל שער יכול להתמודד עם יותר משתי תשומות. זה ספציפי לכל יצרן, אך ב- iCE40 כל שער יכול להתמודד עם 4 כניסות. כך שכל שער מסוגל בהרבה משני שערי NAND הקלטים.

הייתי צריך להקצות את 4 אורן הכניסה ואת 3 סיכות הפלט לפינים הפיזיים 91, 90, 88, 87, 81, 80 ו- 79 בהתאמה. זה ספציפי לשבב ה- fpga ולוח הפריצה עליו הוא נמצא, וכיצד הסיכות האלה מחוברות ליציאת PMOD. זה זמין בגיליונות הנתונים של לוח FPGA זה.

Lattice מספקת שרשרת כלים משלהם לסינתזת (המקבילה ל- FPGA לאוסף עבור מעבדים) מ- Verilog, אך השתמשתי ב icestorm של שרשרת הכלים הפתוחים (https://www.clifford.at/icestorm/). הוראות ההתקנה זמינות באתר זה. עם התקנת סופת הקרח וקובץ ה- verilog ו- pcf, הפקודות לטעון מעגל זה על ה- FPGA הן:

yosys -p "synth_ice40 -blif twoBitAdder.v" twoBitAdder.blif

arachne -pnr -d 1k -p iCEstick.pcf twoBitAdder.blif -o twoBitAdder.asc

icepack twoBitAdder.asc twoBitAdder.bin

iceprog twoBitAdder.bin

זה עובד מצוין, אבל כולל משלוח iCEstick זה יעלה כ -30 $. זו לא הדרך הזולה ביותר לבנות מעגל דיגיטלי, אך היא עוצמתית. יש לו יותר מ -1000 שערים ובמעגל הזעיר הזה הוא משתמש רק בשלושה מהם. המקבילה לשער NAND השתמשה ב -14 שערים. זאת בשל העובדה שכל שער יכול להפוך לכל סוג של שער, וכל שער הוא למעשה שער קלט 4. כל שער יכול לעשות יותר. אם אתה צריך יותר שערים, ל- iCEstick יש אח גדול יותר עם 8000 שערים, זה עולה בערך כפול. ליצרנים אחרים יש הצעות אחרות אבל המחיר יכול להיות די תלול.

שלב 3: מ- FPGA ל- Arduino

מ- FPGA ועד Arduino
מ- FPGA ועד Arduino

FPGAs נהדרים, אך יכולים להיות יקרים, קשים להשגה ואינם ידידותיים ללוח לחם. שבב ידידותי וזול ללוח הלחם הוא ה- Atmega 328 P, המגיע באריזה DIP מסודרת, מושלמת ללוח לחם. ניתן להשיג אותו גם בסביבות 4 $. זהו ליבו של ה- UNO Arduino. אתה כמובן יכול להשתמש ב- UNO כולו, אבל תהיה זול, אנחנו יכולים למשוך את ה- Atmega 328 P מה- UNO ולהשתמש בו לבד. בכל זאת השתמשתי בלוח UNO כמתכנת עבור Atmega.

בשלב זה תצטרך

1. UNO Arduino, עם מעבד Atmega 328P הנשלף.

2. עוד אטמגה 328P עם מטען האתחול Arduino שנשרף מראש, להחליף את זה שאנו עומדים להוציא מה- UNO. (אופציונלי בהנחה שאתה עדיין רוצה לקבל UNO שמיש).

המטרה היא להמיר את קובץ ה- verilog לפרויקט ארדואינו שניתן לטעון אותו ב- 328P. Arduino מבוסס על C ++. באופן נוח יש מתרגם מ- Verilog ל- C ++, הנקרא Verilator (https://www.veripool.org/wiki/verilator). Verilator מיועדת לשימוש על ידי מעצבי חומרה שצריכים לדמות את העיצובים שלהם לפני שהם מעבירים את העיצובים האלה לחומרה יקרה. Cross Verilator אוסף את ה- verilog ל- C ++, ואז המשתמש מספק רתמת בדיקה כדי לספק אותות קלט מדומים ולהקליט את אותות הפלט. אנו הולכים להשתמש בו כדי לדחוס את עיצוב verilog לתוך Atmega 328P באמצעות שרשרת הכלים Arduino.

התקן תחילה את Verilator. עקוב אחר ההוראות בכתובת

התקן גם את ה- Arduino IDE ובדוק שהוא יכול להתחבר ל- Arduino UNO באמצעות USB.

אנו נשתמש באותו קובץ verilog כמו ל- FPGA, אלא שצריך לשנות את שמות הפינים. הוספתי קו תחתון (_) לתחילת כל אחד. זה נחוץ מכיוון שספריות הארדואינו כוללות קובץ כותרת שמתרגם דברים כמו B0, B001 וכו 'למספרים בינאריים. שמות סיכות הקלט האחרים היו תקינים כפי שהם, אך B0 ו- B1 היו גורמים לבנייה להיכשל.

בספרייה המכילה twoBitAdder.v ו- iCEstick.pcf, הפעל את הפעולות הבאות:

verilator -Wall --cc twoBitAdder.v

פעולה זו תיצור ספריית משנה בשם obj_dir המכילה מספר קבצים חדשים. אנו זקוקים רק לקבצי הכותרות וה- cpp, VtwoBitAdder.h, VtwoBitAdder.cpp, VtwoBitAdder_Syms.h ו- VtwoBitAdder_Syms.cpp.

ב- IDE של Arduino, צור סקיצה חדשה בשם twoBitAdder.ino. פעולה זו תיצור את קובץ ה- ino בספרייה חדשה הנקראת גם twoBitAdder, בתוך ספריית ספרי הסקיצות של Arduino. העתק את קבצי VtwoBitAdder.h ו- VtwoBitAdder.cpp שלך לתיקיית twoBitAdder הזו בתיקיית Arduino שלך.

כעת העתק את קבצי הכותרת מהתקנת המאמת.

cp/usr/local/share/verilator/include/verilated*.

סוף סוף העתק בספריית std c ++ מתוך https://github.com/maniacbug/StandardCplusplus. לפי הוראות ההתקנה שלהם זה מותקן בדיוק כמו ספריית ארדואינו רגילה. פרק את תכולת ההפצה לתיקיית 'הספריות' מתחת לספר הסקיצות שלך. לדוגמה, ספר הרישומים שלי נמצא ב-/home/maniacbug/Source/Arduino, כך שהספרייה הזו נמצא ב-/home/maniacbug/Source/Arduino/libraries/StandardCplusplus.

הקפד לאפס את Arduino IDE לאחר התקנתו."

כעת החלף את התוכן של twoBitAdder.ino בתוכן המופיע בשלב זה. זוהי רתמת בדיקה שהמכשיר מצפה לה, אשר מגדירה את סיכות הכניסה/הפלט, ואז בלולאה, קוראת את סיכות הקלט, מזינה אותן ל- VtwoBitAdder (הגרסה המתורגמת של המעגל שלנו), ואז קוראת את הפלט מ- VtwoBitAdder ומחילה אותם לסיכות הפלט.

תוכנית זו צריכה לאסוף ולבצע על UNO Arduino.

שלב 4: מארדואינו ועד שבב DIP על לוח לחם

מארדואינו ועד שבב DIP על לוח לחם
מארדואינו ועד שבב DIP על לוח לחם

כעת, כשהתוכנית פועלת ב- Arduino, איננו זקוקים עוד ללוח Arduino עצמו. כל מה שאנחנו צריכים זה המעבד.

הסר את ה- Atmega 328P בזהירות משקע ה- Arduino UNO, והכנס אותו להחלפה.

שים את ה- Atmega 328P על לוח הלחם. שים את הקצה כשהדיבו מצביע כלפי מעלה על לוח הלחם. סיכה 1 היא הסיכה השמאלית העליונה. סיכה 2 היא הבאה למטה, וכך הלאה לסיכה 14 שנמצאת בפינה השמאלית התחתונה. ואז סיכה 15 הימנית התחתונה, והסיכות 16 עד 28 סופרות בחזרה בצד ימין של השבב.

חבר את סיכות 8 ו -22 לקרקע.

חבר את סיכה 7 ל- VCC (+5V).

חבר קריסטל קוורץ 16 מגה -הרץ בין הסיכות 9 ל -10. כמו כן קבל קטן (22pF) בין סיכה 9 לקרקע, ובין סיכה 10 לקרקע. זה נותן ל- Atmega 328P את מהירות השעון של 16Mhz. יש הוראות במקומות אחרים ללמד את 328P להשתמש במקום זאת בשעון הפנימי של 8Mhz שיחסוך כמה חלקים, אבל זה יאט את המעבד.

יציאות ה- GPIO Arduino 5, 6, 7 ו- 8, בהן השתמשנו עבור סיכות הכניסה הן למעשה הפינים הפיזיים 11, 12, 13, 14 ב- Atmega 328P. אלה יהיו ארבעת הסיכות התחתונות בצד שמאל.

יציאות ה- Arduino GPIO 11, 10 ו- 9, בהן השתמשנו עבור סיכות הפלט הן למעשה הסיכות הפיזיות 17, 16, 15 ב- Atmega 328P. אלה יהיו שלושת הסיכות התחתונות מימין.

חיברתי את נוריות הלדים לסיכות האלה כמו קודם.

שלב 5: מסקנה

סיכום
סיכום

שבבי TTL עובדים, אבל צריך הרבה מהם כדי לבנות משהו. FPGAs עובדים ממש טוב, אבל הם לא זולים. אם אתה יכול לחיות עם פחות סיכות IO ומהירות נמוכה יותר, אז Atmega 328P עשוי להיות השבב עבורך.

כמה דברים שכדאי לזכור:

FPGA:

מִקצוֹעָן

- יכול להתמודד עם אותות במהירות גבוהה. מכיוון שאין מעבד לעיבוד צוואר בקבוק עד להוראה אחת בכל פעם, הגורם המגביל הוא עיכוב התפשטות דרך השערים במעגל הנתון. במקרים רבים זה עשוי להיות מהיר בהרבה מהשעון המסופק עם השבב. עבור העיצוב שלי, העיכוב המחושב היה מאפשר ל- twoBitAdder להגיב לכ -100 מיליון שינויים בערכי הקלט לשנייה (100Mhz) למרות שהשעון המובנה הוא קריסטל של 12Mhz בלבד.

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

- בהתאם ל- FPGA, מספר סיכות ה- IO הזמינות יכול להיות גבוה מאוד, והן בדרך כלל אינן ננעלות למטרה מסוימת.

Con

- יכול להיות יקר ו/או קשה להשגה.

- בדרך כלל מגיע בחבילת BGA הדורשת לוח פריצה כלשהו לעבודה עם השבב בכל פרויקט חובבני. אם אתה בונה אותו לעיצוב עם PCB SMT רב שכבתי מותאם אישית, זו לא בעיה.

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

ארדואינו כ- FPGA:

מִקצוֹעָן

- זול וקל להשגה. פשוט חפש atmega328p-pu באמזון. הם אמורים להיות בערך 4 $ ליחידה. מספר מוכרים מוכרים אותם בהרבה 3 או 4.

- זוהי חבילת DIP, כלומר מתאימה בצורה מושלמת על קרש לחם עם הסיכות החיצוניות שלו.

- זהו מכשיר 5V, שיכול להפוך את הממשק למכשירי 5V אחרים לקלים.

Con

- ל- ATMEGA328P יש מספר מוגבל של סיכות IO (23), וכמה מהן שמורות למשימות ספציפיות.

- ככל שמורכבות המעגל עולה, כמות קוד ההפעלה בשיטת לולאת Arduino עולה, כלומר משך כל מחזור ארוך יותר.

- גם אם מורכבות המעגל נמוכה, כל מחזור דורש הוראות מעבד רבות כדי להביא את ערכי סיכת הקלט ולכתוב ערכי סיכת פלט ולחזור לראש הלולאה. עם קריסטל של 16 מגה -הרץ, אפילו בהנחיה אחת לכל מחזור שעון, הלולאה לא תפעל יותר ממיליון פעמים בשנייה (1 מגה -הרץ). עבור רוב הפרויקטים האלקטרוניים החובבים זה הרבה יותר מהר ממה שצריך.

מוּמלָץ: