Мазмуну:

Dimysable LED Basys 3 Board колдонуп: 5 кадам
Dimysable LED Basys 3 Board колдонуп: 5 кадам

Video: Dimysable LED Basys 3 Board колдонуп: 5 кадам

Video: Dimysable LED Basys 3 Board колдонуп: 5 кадам
Video: Dimmable LED Using Basys 3 Board #fpga #vhdl #youtube #maker #engineering #muhendis 2024, Июль
Anonim
Dimysable LED Basys 3 Board колдонуп
Dimysable LED Basys 3 Board колдонуп

Бул колдонмодо биз тышкы LED караңгылатуу тутумун курабыз жана башкарабыз. Жеткиликтүү баскычтар менен, колдонуучу каалаган каалаган жарыктыкка лампочканы өчүрө алат. Система Basys 3 тактасын колдонот жана ал резистор жана LED лампасы бар нан тактасына туташкан. Белгиленген "өйдө" баскычын басуу жарыкты жогорулатат, ал эми "ылдый" баскычын басуу жарыкты нөлгө чейин азайтат. Бул колдонуучуну күндүн жарыгындай лампочкалардын сокур болушуна тоскоол кылбастан, энергияны үнөмдөйт!

1 -кадам: Киргизүүчү эсептегичти түзүңүз

Бул кадам үчүн биз жарыктын деңгээлин аныктоочу компонентти (саат аркылуу) эки которгучту колдонуу менен түзөбүз: бири көбөйтүү үчүн, экинчиси азайтуу үчүн. VHDLди колдонуп, биз D флип-флопторун колдонуу менен эсептегичти чыгардык. "Өйдө" баскычын басуу кийинки абалды азыркы абалга түртөт, жети сегменттүү дисплейге жана LED лампасына чыгарат.

субъект updown_counter болуп саналат

Порт (учурдагы абал: STD_LOGIC_VECTOR (3 төмөн 0гө чейин); мурунку_стат: STD_LOGIC_VECTORдо (3 төмөнгө 0); кийинки_стат: STD_LOGIC_VECTORдо (3 төмөн 0гө); clk: STD_LOGICте; ылдыйда: STD_LOGICте; updown_counter аяктоо; архитектура updown_counterдин жүрүм -туруму башталат: процесс (next_state, clk, up_enable, down_enable, previous_state) башталса, эгер (ko'tarүлө турган кыр (clk)) анда эгерде (up_enable = '1' жана эмес (next_state = "0000")) анда present_state <= next_state; elsif (down_enable = '1' жана эмес (previous_state = "1111")) анда present_state <= мурунку_стат; эгерде бүтсө; эгерде бүтсө; процессти токтотуу; жүрүм -турумду токтотуу;

Бизге ар бир киргизүү үчүн саат керек (ал көтөрүлгөндө), андыктан биз жарыктын ар бир деңгээлинин ортосунда баскычтардын басуу ылдамдыгын аныктоочу саат бөлүштүргүчтү түздүк. Бул саат бөлүүчү бизге жети сегменттүү дисплейде туура деңгээлди туура көрсөтүүгө жана ар бир деңгээл үчүн туура интенсивдүүлүк деңгээлин чыгарууга мүмкүндүк берет.

жак counter_clkDiv болуп саналат

Порт (clk: std_logic; sclk: out std_logic); counter counter_clkDiv; counter_clkDiv архитектурасы my_clk_div туруктуу max_count: integer: = (10000000); сигнал tmp_clk: std_logic: = '0'; my_div: process (clk, tmp_clk) баштоо div_cnt: integer: = 0; баштоо if (ko'tarүлө турган кыр (clk)) анда, эгерде (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 Clock Divider түзүңүз

Бул кадам үчүн биз 16 түрдүү интенсивдүүлүк деңгээлин аныктоо үчүн LED лампочкасына саат бөлгүч түзөбүз. 0 өчүрүү менен 15 чейин максималдуу жарыктыкты көрсөтүү менен, саат бөлүштүргүч ар бир баскычтын баскычын биз жарыктыктын деңгээлине койгонубузга көбөйтөт. Ар бир жогорулатылган деңгээл LED лампочкасынын саатынын көбөйүшүн билдирет. Жарыктык сызыктуу түрдө жогорулабасын эстеп, биз саатты мүмкүн болушунча жогору бурдук жана ошого жараша саатыбызды азайттык.

Эскертүү: биз көк LEDди колдонуп жатабыз. Башка түстү колдонуу (кызыл сыяктуу) таптакыр башкача сааттарды талап кылат; көк үчүн орто жарыктык жөндөөсү кызыл үчүн максималдуу жарыктык болушу мүмкүн. Бул жарыктын ар кандай толкун узундугу ар кандай энергияны талап кылат, анткени кызгылт көк жана муздак түстөр көбүрөөк энергияны талап кылат, ал эми кызыл жана кызгылт сары сыяктуу жылуу түстөр азыраак энергияны талап кылат.

led_clkDiv субъекти - бул Порт (азыркы абал: 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) баштоо учурдун учурдагы абалы "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: integer: = 0; баштоо if (ko'tarүлө турган кыр (clk)) анда, эгерде (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 файлын доктор Брайан Мелиден узун жана татаал кодунан улам карызга алганбыз. Негизги нерсе, биздин баскычтын кириштерин Basys 3 тактасындагы жети сегменттүү дисплейге жеткирүү, ошондо биз жарыктын кандай деңгээлде экенин билебиз.

Алдыга жылуу менен, LED контроллери жети сегменттүү дисплейди да, лампочканын жарыктыгын дагы көзөмөлдөгөн флип -флопторду колдонот.

субъект эсептегич Порт (clk: STD_LOGIC; up_enable: STD_LOGIC; in_enable: STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 төмөн 0); DISP_EN: STD_LOGIC_VECTOR (3 төмөн 0); led_LOG: STD_LOGIC: STD_LOGIC; соңку эсептегич; архитектура эсептегичтин жүрүм -туруму компоненти updown_counter болуп саналат Port (азыркы_стат: STD_LOGIC_VECTOR (3 төмөн 0); мурунку_стат: STD_LOGIC_VECTORдо (3 төмөн 0); next_state: STD_LOGIC_VECTORдо (3 төмөн 0); clk: in STD_LOGIC; in STD_LOGIC up_enable: STD_LOGICте); акыркы компонент updown_counter; counter_clkDiv компоненти Порт (clk: 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); SEGMENTS: out std_logic); аяктоочу компонент sseg_dec; led_clkDiv компоненти Port (азыркы_стат: STD_LOGIC_VECTORдо (3кө чейин 0); clk: STD_LOGICте; led_clk: STD_LOGICтен тышкары); акыркы компонент led_clkDiv; signal present_state: STD_LOGIC_VECTOR (3кө 0 чейин): = "0000"; next_state сигналы: STD_LOGIC_VECTOR (3кө 0 чейин): = "0000"; signal 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 чейин) <= азыркы_стат; next_state (0) <= эмес (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) and present_state (1) and present_state (2)) xor present_state (3); previous_state (0) <= жок (present_state (0)); previous_state (1) <= present_state (0) xnor present_state (1); previous_state (2) <= (present_state (0) nor 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 -кадам: Чектөөлөрдү жана Ассамблеяны орнотуу

Чектөөлөр

Basys 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 бул жерде биз лампочканын зымдарынын бирин туташтырабыз, ал эми башка зым GROUNDга алып барат

Мунун баарын жөнгө салгандан кийин, сиздин бит агымыңызды (Vivado колдонуп жаткан программаңыз менен), тактаңызды программаңызды жана бумду жасооңуз керек! Сиз өзүңүзгө жумушчу такта алдыңыз.

Эскертүү: пин картасын бул жерде Basys 3 маалымат барагынан тапса болот.

Ассамблея

5 -кадам: Dimmer которгучту колдонуу

Эгерде баары ойдогудай болсо, анда сизде толугу менен иштөөчү диммер системасы болушу керек. Жыйынтыктап айтканда, үстүңкү баскычты басуу сиздин жарыктыгыңызды жогорулатат (15ке чейин), ал эми ылдый баскычын басуу сиздин жарыктыгыңызды төмөндөтөт (0го чейин). Азыр эс алып жаткан көзүңүз үчүн баары жакшы болот деп үмүттөнөбүз!

Сунушталууда: