VHDL how to check bit_vector odd\even - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

VHDL how to check bit_vector odd\even


CRT

Recommended Posts

שלום חבר'ה.

אני מתכנת רכיב UART בVHDL.

ואני צריך לעשות בדיקת PARITY האם היא זוגית או אי-זוגית לINPUT שלי.

ורציתי לשאול איזו דרכים יש לבדוק האם מספר האחדים '1' הוא זוגי או אי-זוגי.

לדוגמא יש לי:

INPUT: IN BIT_VECTOR (7 downto 0).

אני בדקתי את זה מחוץ לפרוסס ע"י קסורים בצורה הבאה:

parity <= '0' xor INPUT(0) xor INPUT(1) xor INPUT(2) xor INPUT(3) xor INPUT(4) xor INPUT(5) xor INPUT(6) xor INPUT(7).

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

אני זוכר שיש עוד דרכים רק לא מצליח להיזכר בהם.

קישור לתוכן
שתף באתרים אחרים

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

דרך נווספת זה להכניס את כל הכניסות לשער xnor (שזה בדיוק מה שעשית רק שלא צריך להוסיף את האפס).

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

קישור לתוכן
שתף באתרים אחרים

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

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

אני חשבתי אולי יש אפשרות פשוט לעשות משהו בסגנון

Xor input (7 downto 0);

במקום לרשום קסור על כל סיבית. כי גם מה שאתה אומר צריך לכתוב חיבור עבור כל סיבית .

קישור לתוכן
שתף באתרים אחרים

בשביל לבדוק אם מספר זוגי או אי זוגי לא צריך לחלק, אפשר פשוט לבדוק האם הLSB שווה ל1.

לא בטוח איך עושים את זה בדיוק בVHDL. אבל בגדול אם תעשה shift right לכל הווקטור הcarry יהיה הLSB.

או אם תעשה לווקטור AND עם 1 התוצאה היא בעצם הLSB.

קישור לתוכן
שתף באתרים אחרים

לא יודע אם זה יעזור לך אבל הינה קוד ++C שמחשב parity מהר:


bool pairaty(unsigned int a) {
a = (a & 0xffff) ^ (a>>16);
a = (a & 0xff) ^ (a>>8);
a = (a & 0xf) ^ (a>>4);
a = (a & 0x3) ^ (a>>2);
a = (a & 0x1) ^ (a>>1);
return a;
}

אפשר גם להרחיב את זה למשתנה של 64 ביט ע"י הוספה של שורה אחת.

ואז יוצא 24 פעולות עבור 64 ביטים (או 20 פעולות עבור 32 ביטים).

בכל מקרה עדיף מאשר לעבור ביט ביט.

קישור לתוכן
שתף באתרים אחרים

לא ממש הבנתי את ההסבר שלך.

לבדוק את הlsb כל פעם ולעשות לה and עם '1'.

אז אם אני עושה את זה ל ווקטור "1000" שזה אי זוגי.

או ל "1111" שזה זוגי הוא נותן לי אותה תוצאה 1.

אני רוצה לבדוק האם מספר האחדים בווקטור זוגי או אי זוגי

קישור לתוכן
שתף באתרים אחרים

אני אשמח להסבר לסינטקס של C++ בקוד לפחות על שורה אחת.

רצית קיצור דרך לכל הקסורים האלה, נתנו לך קיצור דרך...

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

לגבי קיצור השאלה שלי עדיין תקפה האם אם אני עושה

0 xor input( 7 downto 0)

תקף כמו לעשות קסור ביט ביט.

'0' xor INPUT(0) xor INPUT(1) xor INPUT(2) xor INPUT(3) xor INPUT(4) xor INPUT(5) xor INPUT(6) xor INPUT(7).

קישור לתוכן
שתף באתרים אחרים

קודם כל, אתה ניגש לזה מהכיוון הלא נכון.

ממילא אתה מממש UART אז הביטים מגיעים אחד-אחד. אין כל סיבה לעבוד במקביל.

כל מה שאתה צריך לעשות זה לאתחל את ה-PARITY BIT ל-'0' ולעשות XOR בינו לבין הביט שנכנס וכך לכל ביט עם התוצאה הקודמת.

לאחר שנכנסו כל ביטי המידע + ביט ה-PARITY התוצאה תהיה '0' אם המידע תקין.

לדוגמה: נניח שכל ביט in_bit מגיע עם אינדיקציה bit_stb=1 אז אפשר לרשום


Parity_bit<=0;
elsif rising_edge(clk) then
if bit_stb=1 then
Parity_bit <= Parity_bit xor in_bit;
end if;
end if;
if (reset='0') then

כך אין תלות בין אורך הוקטור הנכנס לבדיקה - אתה רק צריך לדעת מתי לבדוק את הערך של Parity_bit - בסוף כל מילה.

עוד אפשרות היא באופן מקבילי - נאמר שאורך הוקטור הוא N, אפשר לכתוב:


variable p_bit : std_logic;
if (reset='0') then
Parity_bit<=0;
elsif rising_edge(clk) then
if it_is_time_to_test_parity_bit then
p_bit:='0';
for i in 0 to N-1 loop
p_bit := p_bit xor input(i);
end loop;
Parity_bit <= p_bit;
end if;
end if;

את ה-LOOP הזה אפשר כמובן לרשום בפונקציה שמקבלת N ואת הוקטור INPUT ומחזירה את ערך ה-PARITY. יותר אלגנטי.

קישור לתוכן
שתף באתרים אחרים

קודם כל, אתה ניגש לזה מהכיוון הלא נכון.

ממילא אתה מממש UART אז הביטים מגיעים אחד-אחד. אין כל סיבה לעבוד במקביל.

אני צריך לעשות מימוש לשני הצדדים.

transmitter שמקבל מסויצ'ים את הביטים. והביטים באים במקביל.

מה שאתה אומר כשאני מקבל ביט ביט זה כשאני יכתוב את הreceiver ושם באמת אני אוכל לקלוט ביט ביט.

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

חברים ממש תודה על העזרה וזה ממש מחמם את הלב שהקהילה בפורום איכותית ואופקיה רחבים.

קישור לתוכן
שתף באתרים אחרים

אני צריך לעשות מימוש לשני הצדדים.

transmitter שמקבל מסויצ'ים את הביטים. והביטים באים במקביל.

מה שאתה אומר כשאני מקבל ביט ביט זה כשאני יכתוב את הreceiver ושם באמת אני אוכל לקלוט ביט ביט.

גם במשדר אתה יכול לחשב את ה-Parity_bit בזמן אמת (תןך כדי שידור הביטים) אחד-אחד כפי שהדגמתי.

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

כתיבה עם FOR LOOP מרמזת על מימוש טורי שיש לו הרבה רמות לוגיות של XOR בודד.

מימוש מקבילי כמו שכתבת מייצר השוואה FLAT עם פחות רמות לוגיות אבל מורכבת יותר.

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

יש לי מודול כזה אם אתה רוצה - משהו מהעולם האמיתי מצ'יפ שעשיתי בעבודה.

UART זה תרגיל שאני כמעט תמיד נותן למנהדסים שמתחילים אצלנו, אבל במתכונת רחבה ומעשית יותר.

קישור לתוכן
שתף באתרים אחרים

גם במשדר אתה יכול לחשב את ה-Parity_bit בזמן אמת (תןך כדי שידור הביטים) אחד-אחד כפי שהדגמתי.

הרי אני צריך להתחיל לשלוח מסיביט START לאחר מכן את הINPUT ואז PARITY וSTOP.

לעשות את החישוב בזמן אמת אני צריך לעשות עם FOR LOOP ורק ע"י VARIABLE עד כמה שאני מבין. תקן אותי אם אני טועה.

כתיבה עם FOR LOOP מרמזת על מימוש טורי שיש לו הרבה רמות לוגיות של XOR בודד.

מימוש מקבילי כמו שכתבת מייצר השוואה FLAT עם פחות רמות לוגיות אבל מורכבת יותר.

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

והסבר קטן על FLAT, אם אני מבין אותך נכון זה RTL שטוח של קסורים?

יש לי מודול כזה אם אתה רוצה - משהו מהעולם האמיתי מצ'יפ שעשיתי בעבודה.

UART זה תרגיל שאני כמעט תמיד נותן למנהדסים שמתחילים אצלנו, אבל במתכונת רחבה ומעשית יותר.

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

מבחינת לוח יש לי במעבדה לוח DE2, כנראה אתה מכיר. והשבוע אני אבדוק עליו כמה תוכניות כולל הUART.

כתיבה של רכיב UART באמת מעניינת. סוף סוף אני עושה משהו יחסית גדול שאפשר לחבר למחשב עם RS232.

תודה על העזרה אתם תותחים. כל פעם אני מתאהב בפורום יותר חזק :xyxthumbs:

קישור לתוכן
שתף באתרים אחרים

הרי אני צריך להתחיל לשלוח מסיביט START לאחר מכן את הINPUT ואז PARITY וSTOP.

לעשות את החישוב בזמן אמת אני צריך לעשות עם FOR LOOP ורק ע"י VARIABLE עד כמה שאני מבין. תקן אותי אם אני טועה.

תזכור שהביטים "יוצאים" לקו אחד אחד וכיוון שזו חומרה ולא תוכנה, אתה יכול במקביל לחשב את ה-PARITY. אין כל צורך לחשב אותו מראש...

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

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

והסבר קטן על FLAT, אם אני מבין אותך נכון זה RTL שטוח של קסורים?

במימוש FLAT יהיה לך רכיב XOR בודד (או "ענן" לוגי) ברמה אחת עם N כניסות ויציאה אחת. הגודל שלו בשערים והמימוש שלו תלוי הטכנולוגיה ובכלים שתשתמש בהם לכן לא תמיד זהה. במימוש עץ בינארי יהיו N/2 רמות של XORים עם שתי כניסות כלומר מספר/סוג הרכיבים זהה למימוש טורי אבל עם הרבה פחות רמות לוגיות, במיוחד עבור N גדול. זה תכנון מהיר ואלגנטי יותר אבל כפי שציינתי - עם מגבלות מסויימות.

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

יש 1000 קורסים ברשת ואת תוכנית ההכשרה הפנימית שלנו אני כמובן לא יכול לשלוח לך... :nixweiss: חשוב להבין שכתיבת חומרה למטרות לימודיות/סימולציה שונה מאוד מכתיבה לרכיב ולייצור. יש המון נושאים כמו התמודדות עם SPIKE על קווי כניסה, -stability, דגימת קווים מהירים מתדר שעון, עמידה ב-setup/hold של רכיבים, סוגיות מימוש ויעילות קוד, תכנון CLK/RESET ועוד.

בהצלחה.

קישור לתוכן
שתף באתרים אחרים

^

עכשיו הבנתי אותך, טוב לדעת את מה שאתה אומר.

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

ואולי תוכל להמליץ על רכישת לוח ללמוד עליו, כרגע אני חושב לקנות את הDE2 כי הוא נראה לי ממש עם הרבה אפשרויות ושלל יציאות\כניסות.

ותודה, תודה רבה לך, ולכל חברי הפורום.

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...