עבור לתוכן

מודל LCD - VHDL

Featured Replies

פורסם

שלום,

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

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

עכשיו חשבתי לממש את זה ב-2 תוכניות, הראשונה init (הגדרות ושליחת תו תו) והשנייה controller שתיהיה אחרית לקבל את הווקטור הארוך (אמור להיות ווקטור אחד של בערך 190 סיביות ועוד וקטור של 6 סיביות שכנראה אני אשרשר) ואז להוציא ל-init כנראה done או ack ואז הInit תציג על הצג.

בקטע הזה די נתקעתי, השאלה היא שהאם אני נמצא בתוך מצב מסיום בinit שנקרא send (לצורך הדוגמא) אני ארצה להימצא 16*2 * השהיות פעמיים.

חשבתי לעבוד עם ROM שה-quartus יוצר, אבל זה סתם מסבך לי את העניינים (לא כל-כך טוב ב-vhdl).

עריכה:

יש כיוון חדש, לממש את הקונטרלר עם shift reg שיבדוק על הווקטור מתי יש אחד ובהתאם ישלח ל-LCD.

אך עדיין אינני יודע איך לממש זאת ב- VHDL

.

אשמח לכל כיוון.

תודה.

  • 3 שבועות מאוחר יותר...
פורסם
  • מחבר

אין בנאדם אחד בפורום שמתעסק עם זה?

אולי מישהו יכול לפנות אותי למישהו חיצוני?

פורסם

מימוש של SHIFT REGISTER בVHDL זה ממש פשוט

דוגמא:

vector26..0<vector0&vector26..1

סינטקס מלא אתה יכול להיעזר על בגוגל (תוצאות מהאתר של ALTERA הכי טובות)

בעקרון אתה משתמש בפעולה של שירשור ומשרשר את הביט שאתה רוצה "לסובב" וכל CLK של המערכת יתבצע לך סיבוב

אחרי הפעולה של הSHIFT REG תעשה פעולת התניה פשוטה של לדוגמא

if vector0 =='1' then

flag ='1'

אני נתתי דוגמא לFLAG אבל אתה יכול לעשות מונה או מה שבא לך.

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

תנסה לפשט לך את הרעיון של כל מרכיב (COMPONENT) ותממש אותו בנפרד. (כך לפחות אני עובד :))

פורסם
  • מחבר

הפרויקט ממש פשוט.

בודק קצר נתק בחוטים.

בהתחלה אני מגדיר איך אני עובד עם 8255

אח"כ בחור את פורט A ושלוח 8 אחדים

אח"כ השהייה

אח"כ בוחר את פורט C ושולח 4 אחדים (4 הגבוהיים)

אח"כ השהייה

אח"כ קורא מפורט C הנמוך לווקטור מסיום

אח"כ השהייה

אח"כ קורא מפורט B

אח"כ השהייה

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

אח"כ אותו דבר רק שולח אפסים.

בסוף עושה OR בין 2 הווקטורים והתוצאה נשמרת בווקטור שלישי שהולך ל-LCD.

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

פורסם

לפי השעה אתה יכול להבין שאין לי כל כך זמן.

לא קראתי הכל רק שמתי לב שאתה צריך מימוש של אוגר הזזה.

יש פקודות לכך מוכנות.

SLL=shift left logical

SRL=shift right logical

ברגע שאתה מזיז, הערך החדש שנכנס הוא אפס.

יש לך קצת מידע פה:

http://en.wikipedia.org/wiki/Logical_shift

ובעקרון ככה ממשים אותו, זה חלק מתוכנית שהייתה לי בישג יד:

case SW(3) is
when '0' => VAR := VAR sll 1; -- SW(3)=0 SHIFT LEFT LOGICAL
when others => LOADVAR := LOaDVAR srl 1; -- SW(3)=1 SHIFT RIGHT LOGICAL

הSW זה ווקטור הביט הרביעי שלו נבדק אם לעשות הזהה ימינה או שמאלה.

VAR זה ווריאבל שמוגדר בתוך פרוסס.

בשורה 1 אחרי SLL או SRL אומר להזיז ביט 1 ימינה או שמאלה תלוי בפעולה.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים