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

LED שניתן לעמעם באמצעות לוח Basys 3: 5 שלבים
LED שניתן לעמעם באמצעות לוח Basys 3: 5 שלבים

וִידֵאוֹ: LED שניתן לעמעם באמצעות לוח Basys 3: 5 שלבים

וִידֵאוֹ: LED שניתן לעמעם באמצעות לוח Basys 3: 5 שלבים
וִידֵאוֹ: גוף תאורה על נוריות לד ניתנות להתייחסות, לתאורה אחורית, התראות ותאורת חירום. ESP32 ו-WLED 2024, יולי
Anonim
LED שניתן לעמעם באמצעות לוח Basys 3
LED שניתן לעמעם באמצעות לוח Basys 3

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

שלב 1: צור מונה קלט

עבור שלב זה אנו יוצרים את הרכיב הקובע את רמת הבהירות (באמצעות שעון) באמצעות שני מתגים: אחד להגדיל ואחד לירידה. באמצעות VHDL, ייצרנו את הדלפק באמצעות כפכפי D. לחיצה על כפתור "למעלה" מעבירה את המצב הבא למצב הנוכחי, ומוציאה לתצוגת שבעה המגזרים ולנורת ה- LED.

ישות updown_counter היא

יציאה (הווה_מצב: החוצה STD_LOGIC_VECTOR (3 למטה עד 0); הקודם_מדינה: ב- STD_LOGIC_VECTOR (3 למטה ל -0); הבא_מדינה: ב- STD_LOGIC_VECTOR (3 למטה ל -0); clk: ב- STD_LOGIC; down_enable: ב- STD_LOGIC; up_enable: ב-; סוף updown_counter; ארכיטקטורה ההתנהגות של updown_counter מתחילה בפלופ: תהליך (next_state, clk, up_enable, down_enable, previous_state) מתחיל אם (rising_edge (clk)) ואז אם (up_enable = '1' ולא (next_state = "0000")) ואז present_state <= הבא_מדינה; elsif (down_enable = '1' ולא (previous_state = "1111")) ואז present_state <= previous_state; סוף אם; סוף אם; סיום פלופ התהליך; סוף התנהגותי;

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

ישות counter_clkDiv היא

Port (clk: in std_logic; sclk: out std_logic); סוף counter_clkDiv; האדריכלות my_clk_div של counter_clkDiv היא קבועה max_count: integer: = (10000000); אות tmp_clk: std_logic: = '0'; התחל my_div: process (clk, tmp_clk) משתנה div_cnt: מספר שלם: = 0; התחל אם (rising_edge (clk)) ואז אם (div_cnt> = MAX_COUNT) אז tmp_clk <= not tmp_clk; div_cnt: = 0; אחרת div_cnt: = div_cnt + 1; סוף אם; סוף אם; sclk <= tmp_clk; סיום תהליך my_div; סיים את my_clk_div;

שלב 2: צור מחלק שעון LED

עבור שלב זה אנו יוצרים מחלק שעון לנורת הלד לקביעת 16 רמות עוצמה שונות. כאשר 0 כבוי ל -15 מציג בהירות מרבית, מחלק השעון מגדיל כל לחיצה על כפתור לפי מה שהגדרנו להיות רמות הבהירות. כל עלייה ברמה פירושה עלייה בשעון הנורה LED. נזכור כי הבהירות אינה גדלה באופן לינארי, הפעלנו את השעון לגבוה ביותר שהוא יכול ללכת והורדנו את השעונים בהתאם.

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

ישות led_clkDiv היא Port (present_state: ב- STD_LOGIC_VECTOR (3 עד 0); clk: ב- STD_LOGIC; led_clk: out STD_LOGIC); סוף led_clkDiv; ארכיטקטורה ההתנהגות של led_clkDiv היא אות tmp_clk: std_logic: = '0'; משתנה משותף max_count: integer; begin count_stuff: process (present_state) begin case present_state הוא כאשר "0000" => max_count: = 0; כאשר "0001" => max_count: = 2; כאשר "0010" => max_count: = 4; כאשר "0011" => max_count: = 6; כאשר "0100" => max_count: = 8; כאשר "0101" => max_count: = 10; כאשר "0110" => max_count: = 12; כאשר "0111" => max_count: = 14; כאשר "1000" => max_count: = 16; כאשר "1001" => max_count: = 25; כאשר "1010" => max_count: = 50; כאשר "1011" => max_count: = 100; כאשר "1100" => max_count: = 150; כאשר "1101" => max_count: = 200; כאשר "1110" => max_count: = 250; כאשר "1111" => max_count: = 300; מקרה סיום; סיום תהליך count_stuff; my_div: process (clk, tmp_clk, present_state) משתנה div_cnt: מספר שלם: = 0; התחל אם (rising_edge (clk)) ואז אם (div_cnt> = max_count) אז tmp_clk <= not tmp_clk; div_cnt: = 0; אחרת div_cnt: = div_cnt + 1; סוף אם; סוף אם; led_clk <= tmp_clk; סיום תהליך my_div; סוף התנהגותי;

שלב 3: יצירת בקר ה- LED

כעת, לאחר שהגענו עד כאן, הגיע הזמן לשלב סוף סוף את כל הרכיבים שיצרנו עד כה לקובץ בקר ה- LED.

לסיכום, הרכיבים בהם נעשה שימוש הם כדלקמן:

  • מונה קלט (updown_counter)
  • מחלק שעון (counter_clkDiv)
  • מחלק שעון LED (led_clkDiv)
  • מנהל התצוגה של שבעה קטעים (sseg_dec) (קובץ מצורף)

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

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

מונה הישות הוא Port (clk: ב- STD_LOGIC; up_enable: ב- STD_LOGIC; down_enable: ב- STD_LOGIC; קטעים: החוצה STD_LOGIC_VECTOR (7 עד 0); DISP_EN: החוצה STD_LOGIC_VECTOR (3 למטה 0); led_clk: החוצה STD_LOGIC); מונה קצה; ארכיטקטורה התנהגות המונה היא רכיב updown_counter הוא יציאה (present_state: out STD_LOGIC_VECTOR (3 downto 0); state_state: in STD_LOGIC_VECTOR (3 downto 0); next_state: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; down_enable: in_ENOG: up_enable: ב- STD_LOGIC); רכיב סוף updown_counter; רכיב counter_clkDiv הוא Port (clk: in std_logic; sclk: out std_logic); רכיב קצה counter_clkDiv; רכיב sseg_dec הוא Port (ALU_VAL: ב- std_logic_vector (7 למטה ל -0); SIGN: ב- std_logic; VALID: ב- std_logic; CLK: ב- std_logic; DISP_EN: out std_logic_vector (3 למטה 0); מגזרים 0); רכיב סוף sseg_dec; רכיב led_clkDiv הוא Port (present_state: ב- STD_LOGIC_VECTOR (3 עד 0); clk: ב- STD_LOGIC; led_clk: out STD_LOGIC); רכיב סוף led_clkDiv; signal present_state: STD_LOGIC_VECTOR (3 downto 0): = "0000"; האות next_state: STD_LOGIC_VECTOR (3 עד 0): = "0000"; אות הקודם_מדינה: STD_LOGIC_VECTOR (3 עד 0): = "0000"; אות Alu_Val: STD_LOGIC_VECTOR (7 עד 0); אות sclk: STD_LOGIC; התחל Alu_Val (7 downto 4) <= "0000"; Alu_Val (3 עד 0) <= present_state; next_state (0) <= not (present_state (0)); next_state (1) <= present_state (0) xor present_state (1); next_state (2) <= (present_state (0) ו- present_state (1)) xor present_state (2); next_state (3) <= (present_state (0) ו- present_state (1) ו- present_state (2)) xor present_state (3); הקודם_מדינה (0) <= not (present_state (0)); הקודם_מדינה (1) <= present_state (0) xnor present_state (1); קודמת_מדינה (2) <= (נוכח_מצב (0) ולא_הווה_מצב (1)) או_הווה_מצב (2); previous_state (3) sclk, next_state => next_state, previous_state => previous_state, up_enable => up_enable, down_enable => down_enable, present_state => present_state); תצוגה: מפת יציאת sseg_dec (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: מפת יציאת led_clkDiv (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: מפת יציאת counter_clkDiv (clk => clk, sclk => sclk); סוף התנהגותי;

שלב 4: קביעת אילוצים והרכבה

אילוצים

כדי להתקין ולתכנן את לוח Basys 3 כראוי, עלינו קודם כל להתקין את קובץ האילוצים שלנו המצורף לשלב זה. ההגדרות הבאות הותאמו:

כפתורים

  • שונה T18 ל- "up_enable" (הגדל את הבהירות)
  • שונה U17 ל- "down_enable" (הפחת את הבהירות)

תצוגת 7 פלחים

  • W7, W6, U8, V8, U5, V5, U7, V7 מייצגים כל קטע של תצוגה אחת
  • U2, U4, V4, W4 מייצגים כל אנודה המוצגת (רק 2 פעילים מכיוון שהמספר הגבוה ביותר שלנו הוא 15)

כותרת PMOD JC

JC7 הוא המקום בו אנו מחברים את אחד החוטים של נורת ה- LED, והחוט השני מוביל ל- GROUND

לאחר שהגדרת את כל זה, כל שעליך לעשות הוא ליצור את bitstream שלך (עם כל תוכנה שבה אתה משתמש, כלומר Vivado), לתכנת את הלוח שלך ובום! קיבלת לעצמך לוח עבודה.

הערה: מיפוי הסיכות ניתן למצוא בגיליון הנתונים של Basys 3 כאן.

הַרכָּבָה

שלב 5: שימוש במתג העמעם שלך

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

מוּמלָץ: