สารบัญ:

LED หรี่แสงได้โดยใช้บอร์ด Basy 3: 5 ขั้นตอน
LED หรี่แสงได้โดยใช้บอร์ด Basy 3: 5 ขั้นตอน

วีดีโอ: LED หรี่แสงได้โดยใช้บอร์ด Basy 3: 5 ขั้นตอน

วีดีโอ: LED หรี่แสงได้โดยใช้บอร์ด Basy 3: 5 ขั้นตอน
วีดีโอ: การต่อวงจรไฟฉาย ไฟคาดหัว DIY LED Head light 2024, กรกฎาคม
Anonim
LED หรี่แสงได้โดยใช้บอร์ด Basy 3
LED หรี่แสงได้โดยใช้บอร์ด Basy 3

ในคู่มือนี้ เราจะสร้างและควบคุมระบบหรี่ไฟ LED ภายนอก ด้วยปุ่มที่มีอยู่ ผู้ใช้สามารถหรี่หลอดไฟ LED ให้เป็นความสว่างที่ต้องการได้ ระบบใช้บอร์ด Basys 3 และเชื่อมต่อกับเขียงหั่นขนมที่มีตัวต้านทานและหลอดไฟ LED การกดปุ่ม "ขึ้น" ที่กำหนดจะเพิ่มความสว่าง และการกดปุ่ม "ลง" จะทำให้ความสว่างลดลงจนเหลือศูนย์ วิธีนี้ไม่เพียงแต่ป้องกันไม่ให้ผู้ใช้ตาบอดจากหลอดไฟที่สว่างราวกับแสงแดด แต่ยังช่วยประหยัดพลังงานอีกด้วย!

ขั้นตอนที่ 1: สร้างตัวนับอินพุต

สำหรับขั้นตอนนี้ เราสร้างส่วนประกอบที่กำหนดระดับความสว่าง (ผ่านนาฬิกา) โดยใช้สวิตช์สองตัว: ตัวหนึ่งสำหรับเพิ่มและอีกตัวหนึ่งสำหรับลด โดยใช้ VHDL เราสร้างเคาน์เตอร์โดยใช้รองเท้าแตะ D การกดปุ่ม "ขึ้น" จะเป็นการผลักสถานะถัดไปไปยังสถานะปัจจุบัน การส่งออกไปยังจอแสดงผลเจ็ดส่วนและหลอดไฟ LED

เอนทิตี updown_counter is

พอร์ต (present_state: ออก STD_LOGIC_VECTOR (3 ลดลงเป็น 0); Previous_state: ใน STD_LOGIC_VECTOR (3 เหลือ 0); next_state: ใน STD_LOGIC_VECTOR (3 ลดลงเป็น 0); clk: ใน STD_LOGIC; down_enable: ใน STD_LOGIC; up_enable: ใน STD_LOGIC); สิ้นสุด updown_counter; สถาปัตยกรรม พฤติกรรมของ updown_counter เริ่มต้น flop: กระบวนการ (next_state, clk, up_enable, down_enable, Previous_state) เริ่มต้นถ้า (rising_edge(clk)) แล้วถ้า (up_enable = '1' และไม่ใช่ (next_state="0000")) แล้ว present_state <= next_state; elsif (down_enable = '1' และไม่ใช่ (previous_state= "1111")) จากนั้น present_state <= Previous_state; สิ้นสุดถ้า; สิ้นสุดถ้า; สิ้นสุดกระบวนการล้มเหลว สิ้นสุดพฤติกรรม;

นอกจากนี้เรายังต้องการนาฬิกาสำหรับอินพุตแต่ละรายการเพื่อล็อคไว้ (เมื่อเพิ่มขึ้น) ดังนั้นเราจึงสร้างตัวแบ่งนาฬิกาที่กำหนดว่าจะสามารถกดปุ่มระหว่างความสว่างแต่ละระดับได้เร็วเพียงใด ตัวแบ่งนาฬิกานี้ช่วยให้เราแสดงระดับที่ถูกต้องบนจอแสดงผลเจ็ดส่วนได้อย่างเหมาะสม และสร้างระดับความเข้มที่เหมาะสมสำหรับแต่ละระดับ

เอนทิตี counter_clkDiv คือ

พอร์ต (clk: ใน std_logic; sclk: ออก std_logic); สิ้นสุด counter_clkDiv; สถาปัตยกรรม my_clk_div ของ counter_clkDiv เป็นค่าคงที่ max_count: integer:= (10000000); สัญญาณ tmp_clk: std_logic:= '0'; เริ่ม my_div: กระบวนการ (clk, tmp_clk) ตัวแปร div_cnt: จำนวนเต็ม:= 0; เริ่มต้น if (rising_edge(clk)) แล้ว if (div_cnt >= MAX_COUNT) แล้ว tmp_clk <= ไม่ใช่ tmp_clk; div_cnt:= 0; อื่น div_cnt:= div_cnt + 1; สิ้นสุดถ้า; สิ้นสุดถ้า; sclk <= tmp_clk; สิ้นสุดกระบวนการ my_div; สิ้นสุด my_clk_div;

ขั้นตอนที่ 2: สร้างตัวแบ่งนาฬิกา LED

สำหรับขั้นตอนนี้ เราสร้างตัวแบ่งนาฬิกาสำหรับหลอดไฟ LED เพื่อกำหนดระดับความเข้มที่แตกต่างกัน 16 ระดับ เมื่อ 0 ปิดเหลือ 15 แสดงความสว่างสูงสุด ตัวแบ่งนาฬิกาจะเพิ่มการกดปุ่มแต่ละปุ่มตามระดับความสว่างที่เราตั้งไว้ ระดับที่เพิ่มขึ้นแต่ละครั้งหมายถึงการเพิ่มขึ้นของนาฬิกาสำหรับหลอดไฟ LED โดยจำได้ว่าความสว่างไม่ได้เพิ่มขึ้นเป็นเส้นตรง เราหมุนนาฬิกาให้สูงที่สุดเท่าที่จะทำได้ และลดนาฬิกาลงตามลำดับ

หมายเหตุ: เราใช้ไฟ LED สีฟ้า การใช้สีที่ต่างกัน (เช่น สีแดง) จะต้องใช้นาฬิกาที่แตกต่างกันเล็กน้อย การตั้งค่าความสว่างปานกลางสำหรับสีน้ำเงินอาจเป็นความสว่างสูงสุดสำหรับสีแดงอยู่แล้ว สิ่งนี้เกิดขึ้นเนื่องจากความยาวคลื่นที่แตกต่างกันของแสงจะต้องใช้พลังงานในปริมาณที่แตกต่างกัน โดยสีที่เย็นกว่า เช่น สีม่วงและสีน้ำเงินต้องการพลังงานมากกว่า ในขณะที่สีที่อุ่นกว่า เช่น สีแดงและสีส้มใช้พลังงานน้อยกว่า

เอนทิตี led_clkDiv คือพอร์ต (present_state: ใน STD_LOGIC_VECTOR (3 เหลือ 0); clk: ใน STD_LOGIC; led_clk: ออก STD_LOGIC); สิ้นสุด led_clkDiv; สถาปัตยกรรม พฤติกรรมของ led_clkDiv คือสัญญาณ tmp_clk: std_logic:= '0'; ตัวแปรที่ใช้ร่วมกัน max_count: integer;begin count_stuff: process (present_state) start 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: กระบวนการ (clk, tmp_clk, present_state) ตัวแปร div_cnt: จำนวนเต็ม:= 0; เริ่มต้น if (rising_edge(clk)) แล้ว if (div_cnt >= max_count) แล้ว tmp_clk <= ไม่ใช่ tmp_clk; div_cnt:= 0; อื่น div_cnt:= div_cnt + 1; สิ้นสุดถ้า; สิ้นสุดถ้า; led_clk <= tmp_clk; สิ้นสุดกระบวนการ my_div; สิ้นสุดพฤติกรรม;

ขั้นตอนที่ 3: การสร้างตัวควบคุม LED

ตอนนี้เราได้ทำสำเร็จแล้ว ในที่สุดก็ถึงเวลาที่จะรวมส่วนประกอบทั้งหมดที่เราสร้างขึ้นมาจนถึงไฟล์ LED Controller

สรุปส่วนประกอบที่ใช้มีดังนี้:

  • ตัวนับอินพุต (updown_counter)
  • ตัวแบ่งนาฬิกา (counter_clkDiv)
  • ตัวแบ่งนาฬิกา LED (led_clkDiv)
  • ไดรเวอร์การแสดงผลเจ็ดส่วน (sseg_dec) (ไฟล์แนบ)

ก่อนหน้านี้ ไดรเวอร์การแสดงผลเจ็ดส่วนไม่เคยถูกกล่าวถึงเลย เพราะเราได้ยืมไฟล์ VHDL จาก Dr. Bryan Mealy เนื่องจากโค้ดที่ยาวและซับซ้อน โดยพื้นฐานแล้วสิ่งที่ทำคือผลักดันอินพุตปุ่มของเราไปยังจอแสดงผลเจ็ดส่วนบนบอร์ด Basys 3 เพื่อให้เราทราบว่าระดับความสว่างอยู่ที่ระดับใด

ก้าวไปข้างหน้า LED Controller ใช้รองเท้าแตะเพื่อเพิ่มหรือลดจำนวนที่ควบคุมทั้งการแสดงผลเจ็ดส่วนและระดับความสว่างของหลอดไฟ LED พร้อมกัน

ตัวนับเอนทิตีคือ Port (clk: in STD_LOGIC; up_enable: in STD_LOGIC; down_enable: in STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 downto 0); DISP_EN: out STD_LOGIC_VECTOR (3 downto 0); led_clk: out STD_LOGIC); สิ้นสุดเคาน์เตอร์; สถาปัตยกรรม พฤติกรรมของตัวนับเป็นส่วนประกอบ updown_counter คือ Port (present_state: out STD_LOGIC_VECTOR (3 ลดลงเป็น 0); Previous_state: ใน STD_LOGIC_VECTOR (3 ลดลงเป็น 0); next_state: ใน STD_LOGIC_VECTOR (3 ลดลงเป็น 0); clk: ใน STD_LOGIC; down_enable: ใน STD_LOGIC up_enable: ใน STD_LOGIC); ส่วนประกอบสิ้นสุด updown_counter; ส่วนประกอบ counter_clkDiv คือพอร์ต (clk: ใน std_logic; sclk: ออก std_logic); ส่วนประกอบสิ้นสุด counter_clkDiv; ส่วนประกอบ sseg_dec คือพอร์ต (ALU_VAL: ใน std_logic_vector(7 downto 0); SIGN: in std_logic; VALID: in std_logic; CLK: in std_logic; DISP_EN: out std_logic_vector(3 downto 0); SEGMENTS _ downtovector: out stdtovector; ส่วนประกอบท้าย sseg_dec; ส่วนประกอบ led_clkDiv คือพอร์ต (present_state: ใน STD_LOGIC_VECTOR (3 เหลือ 0); clk: ใน STD_LOGIC; led_clk: ออก STD_LOGIC); ส่วนประกอบท้าย led_clkDiv; สัญญาณ present_state: STD_LOGIC_VECTOR (3 ลดลง 0):= "0000"; สัญญาณ next_state: STD_LOGIC_VECTOR (3 ลดลง 0):= "0000"; สัญญาณ Previous_state: STD_LOGIC_VECTOR (3 ลดลง 0):= "0000"; สัญญาณ Alu_Val: STD_LOGIC_VECTOR (7 เหลือ 0); สัญญาณ sclk: STD_LOGIC; เริ่ม Alu_Val(7 เหลือ 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) and present_state(1)) xor present_state(2); next_state(3) <= (present_state(0) และ present_state(1) และ present_state(2)) xor present_state(3); Previous_state(0) <= ไม่ (ปัจจุบัน_state(0)); Previous_state(1) <= present_state(0) xหรือ present_state(1); Previous_state(2) <= (present_state(0) หรือ present_state(1)) xor present_state(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: การสร้างข้อจำกัดและการประกอบ

ข้อจำกัด

ในการติดตั้งและตั้งโปรแกรมบอร์ด Basy 3 อย่างถูกต้อง อันดับแรก เราต้องตั้งค่าไฟล์ข้อจำกัดของเราซึ่งแนบมากับขั้นตอนนี้ มีการปรับการตั้งค่าต่อไปนี้:

ปุ่ม

  • เปลี่ยน T18 เป็น "up_enable" (เพิ่มความสว่าง)
  • เปลี่ยน U17 เป็น "down_enable" (ลดความสว่าง)

จอแสดงผล 7 ส่วน

  • W7, W6, U8, V8, U5, V5, U7, V7 แสดงถึงแต่ละส่วนของจอแสดงผลเดียว
  • U2, U4, V4, W4 เป็นตัวแทนของแต่ละแอโนดที่แสดง (มีเพียง 2 เท่านั้นที่ทำงานเนื่องจากจำนวนสูงสุดของเราคือ 15)

PMOD Header JC

JC7 เป็นที่ที่เราเชื่อมต่อสายไฟเส้นหนึ่งของหลอดไฟ LED และอีกสายหนึ่งนำไปสู่กราวด์

หลังจากตั้งค่าทั้งหมดนี้แล้ว สิ่งที่คุณต้องทำคือสร้างบิตสตรีมของคุณ (ด้วยซอฟต์แวร์ใดก็ตามที่คุณใช้ เช่น Vivado) ตั้งโปรแกรมบอร์ดของคุณ แล้วบูม! คุณมีกระดานทำงาน

หมายเหตุ: การแมปพินสามารถพบได้ในแผ่นข้อมูล Basys 3 ที่นี่

การประกอบ

ขั้นตอนที่ 5: การใช้สวิตช์หรี่ไฟของคุณ

ถ้าทุกอย่างเป็นไปด้วยดี คุณควรมีระบบหรี่ไฟที่ทำงานได้อย่างสมบูรณ์ โดยสรุป การกดปุ่มบนสุดจะเพิ่มความสว่างของคุณ (จนถึง 15) และการกดปุ่มลงจะทำให้ความสว่างของคุณลดลง (จนถึง 0) หวังว่าทุกอย่างจะผ่านไปด้วยดีสำหรับสายตาที่ผ่อนคลายของคุณตอนนี้!

แนะนำ: