Turinys:

Reguliuojamas šviesos diodas naudojant „Basys 3“plokštę: 5 žingsniai
Reguliuojamas šviesos diodas naudojant „Basys 3“plokštę: 5 žingsniai

Video: Reguliuojamas šviesos diodas naudojant „Basys 3“plokštę: 5 žingsniai

Video: Reguliuojamas šviesos diodas naudojant „Basys 3“plokštę: 5 žingsniai
Video: Блок питания 3,2 В 3,5 А, для газовых колоно, расстаемся с батарейками. 2024, Liepa
Anonim
Reguliuojamas šviesos diodas naudojant „Basys 3“plokštę
Reguliuojamas šviesos diodas naudojant „Basys 3“plokštę

Šiame vadove mes ketiname sukurti ir valdyti išorinę šviesos diodų pritemdymo sistemą. Naudodamas galimus mygtukus, vartotojas gali pritemdyti LED lemputę iki norimo ryškumo. Sistema naudoja „Basys 3“plokštę ir yra prijungta prie duonos lentos, kurioje yra rezistorius ir LED lemputė. Paspaudus nurodytą mygtuką „aukštyn“, ryškumas padidės, o paspaudus mygtuką „žemyn“- ryškumas sumažės iki nulio. Tai ne tik neleidžia vartotojui apakinti ryškių saulės spindulių lempučių, bet ir taupo energiją!

1 veiksmas: sukurkite įvesties skaitiklį

Šiam žingsniui mes sukuriame komponentą, kuris nustato ryškumo lygį (per laikrodį), naudodami du jungiklius: vieną padidinti ir kitą sumažinti. Naudodami VHDL, skaitiklį pagaminome naudodami D šlepetes. Paspaudus mygtuką „aukštyn“, būsena perkeliama į dabartinę būseną, išvedama į septynių segmentų ekraną ir LED lemputę.

subjektas updown_counter yra

Uostas (dabartinė_stata: iš STD_LOGIC_VECTOR (nuo 3 iki 0); ankstesnė_statė: į STD_LOGIC_VECTOR (nuo 3 iki 0); kita_statė: į STD_LOGIC_VECTOR (nuo 3 iki 0); clk: į STD_LOGIC; įjungta: įjungta: pagal STD_LOGIC; up_enable: į ST) end updown_counter; architektūra Updown_counter elgsena prasideda flop: procesas (next_state, clk, up_enable, down_enable, previous_state) prasideda if (kylančioji briauna (clk)) tada if (up_enable = '1', o ne (next_state = "0000")) tada present_state <= next_state; elsif (down_enable = '1', o ne (ankstesnė_stata = "1111")) tada dabartinė_stata <= ankstesnė_stata; pabaiga, jei; pabaiga, jei; pabaigos proceso šnipštas; pabaiga Elgesys;

Mums taip pat reikia laikrodžio, kad kiekvienas įėjimas būtų užfiksuotas (kai jis pakyla), todėl mes taip pat sukūrėme laikrodžio daliklį, kuris nustato, kaip greitai galima paspausti mygtukus tarp kiekvieno ryškumo lygio. Šis laikrodžio daliklis leidžia tinkamai parodyti tinkamą lygį septynių segmentų ekrane ir kiekvienam lygiui sukurti reikiamą intensyvumo lygį.

subjektas counter_clkDiv yra

Uostas (clk: in std_logic; sclk: out std_logic); end counter_clkDiv; architektūra my_clk_div iš counter_clkDiv yra pastovi max_count: integer: = (10000000); signalas tmp_clk: std_logic: = '0'; pradėti my_div: process (clk, tmp_clk) kintamasis div_cnt: integer: = 0; pradėti, jei (kylančioji briauna (clk)), tada jei (div_cnt> = MAX_COUNT), tada tmp_clk <= ne tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; pabaiga, jei; pabaiga, jei; sclk <= tmp_clk; baigti procesą my_div; pabaiga my_clk_div;

2 veiksmas: sukurkite LED laikrodžio daliklį

Šiam žingsniui sukuriame laikrodžio daliklį, skirtą LED lemputei, kad būtų galima nustatyti 16 skirtingų stiprumo lygių. Kai 0 yra išjungtas iki 15, rodomas maksimalus ryškumas, laikrodžio daliklis kiekvieną mygtuko paspaudimą padidina pagal mūsų nustatytus ryškumo lygius. Kiekvienas didėjantis lygis reiškė LED lemputės laikrodžio padidėjimą. Prisimindami, kad ryškumas nedidėja tiesiškai, mes pasukome laikrodį iki aukščiausios galios ir atitinkamai sumažinome laikrodžius.

Pastaba: mes naudojame mėlyną šviesos diodą. Naudojant kitokią spalvą (pvz., Raudoną), iš viso reikės šiek tiek skirtingų laikrodžių; vidutinio ryškumo mėlynos spalvos nustatymas jau gali būti maksimalus raudonos spalvos ryškumas. Taip atsitinka todėl, kad skirtingiems šviesos bangos ilgiams reikės skirtingo energijos kiekio, o šaltesnėms spalvoms, tokioms kaip violetinė ir mėlyna, reikia daugiau energijos, o šiltesnėms spalvoms, tokioms kaip raudona ir oranžinė, reikia mažiau energijos.

subjektas led_clkDiv yra uostas (dabartinė_stata: į STD_LOGIC_VECTOR (3 iki 0); clk: į STD_LOGIC; led_clk: iš STD_LOGIC); pabaiga led_clkDiv; architektūra LED_clkDiv elgsena yra signalas tmp_clk: std_logic: = '0'; bendrinamas kintamasis maks. kai "0001" => max_count: = 2; kai "0010" => max_count: = 4; kai "0011" => max_count: = 6; kai "0100" => max_count: = 8; kai "0101" => max_count: = 10; kai "0110" => max_count: = 12; kai "0111" => max_count: = 14; kai "1000" => max_count: = 16; kai "1001" => max_count: = 25; kai "1010" => max_count: = 50; kai "1011" => max_count: = 100; kai "1100" => max_count: = 150; kai "1101" => max_count: = 200; kai "1110" => max_count: = 250; kai "1111" => max_count: = 300; pabaigos atvejis; pabaigos procesas count_stuff; my_div: process (clk, tmp_clk, present_state) kintamasis div_cnt: sveikasis skaičius: = 0; pradėti, jei (kylančioji briauna (clk)), tada jei (div_cnt> = max_count), tada tmp_clk <= ne tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; pabaiga, jei; pabaiga, jei; led_clk <= tmp_clk; baigti procesą my_div; pabaiga Elgesys;

3 žingsnis: sukurkite LED valdiklį

Dabar, kai pasiekėme tiek laiko, atėjo laikas pagaliau sujungti visus iki šiol sukurtus komponentus į LED valdiklio failą.

Apibendrinant, naudojami šie komponentai:

  • Įvesties skaitiklis (updown_counter)
  • Laikrodžio daliklis (counter_clkDiv)
  • LED laikrodžio daliklis (led_clkDiv)
  • Septynių segmentų ekrano tvarkyklė (sseg_dec) (pridėtas failas)

Septynių segmentų ekrano tvarkyklė anksčiau nebuvo aptarta, nes mes iš tikrųjų pasiskolinome VHDL failą iš daktaro Bryano Mealy dėl ilgo ir sudėtingo kodo. Tai iš esmės nukreipia mūsų mygtuko įvestis į septynių segmentų ekraną „Basys 3“plokštėje, kad žinotume, koks ryškumo lygis.

Judėdamas į priekį, LED valdiklis naudoja šlepetes, kad padidintų arba sumažintų skaičių, kuris vienu metu valdo septynių segmentų ekraną ir LED lemputės ryškumo lygį.

objekto skaitiklis yra prievadas (clk: STD_LOGIC; up_enable: in STD_LOGIC; down_enable: STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 down to 0); DISP_EN: out STD_LOGIC_VECTOR (3 down to 0); led_clk: out STD_LOGIC); galinis skaitiklis; architektūra Skaitiklio elgesys yra komponentas upown_counter yra uostas (dabartinė_stata: iš STD_LOGIC_VECTOR (nuo 3 iki 0); ankstesnė_statė: į STD_LOGIC_VECTOR (nuo 3 iki 0); next_state: į STD_LOGIC_VECTOR (nuo 3 iki 0); clk: in STD_LOGIC; in ST_Lable) up_enable: STD_LOGIC); pabaigos komponentas updown_counter; komponentas counter_clkDiv yra prievadas (clk: in std_logic; sclk: out std_logic); pabaigos komponentas counter_clkDiv; komponentas sseg_dec yra prievadas (ALU_VAL: std_logic_vector (7 iki 0); SIGN: in std_logic; VALID: in std_logic; CLK: in std_logic; DISP_EN: out std_logic_vector (3 downto 0); SEGMENTS: out 0 std_); pabaigos komponentas sseg_dec; komponentas led_clkDiv yra prievadas (dabartinė_stata: į STD_LOGIC_VECTOR (3 iki 0); clk: į STD_LOGIC; led_clk: iš STD_LOGIC); pabaigos komponentas led_clkDiv; signalas dabartinė_stata: STD_LOGIC_VECTOR (nuo 3 iki 0): = "0000"; signalas next_state: STD_LOGIC_VECTOR (3 iki 0): = "0000"; signalas ankstesnė_stata: STD_LOGIC_VECTOR (nuo 3 iki 0): = "0000"; signalas Alu_Val: STD_LOGIC_VECTOR (nuo 7 iki 0); signalo sclk: STD_LOGIC; pradėti Alu_Val (nuo 7 iki 4) <= "0000"; Alu_Val (3 iki 0) <= dabartinė_stata; kita_stata (0) <= ne (dabartinė_stata (0)); kita_stata (1) <= dabartinė_stata (0) x arba dabartinė_stata (1); kita_stata (2) <= (dabartinė_stata (0) ir dabartinė_stata (1)) x arba dabartinė_stata (2); kita_stata (3) <= (dabartinė_stata (0) ir dabartinė_stata (1) ir dabartinė_stata (2)) x arba dabartinė_stata (3); ankstesnė_stata (0) <= ne (dabartinė_stata (0)); ankstesnė_stata (1) <= dabartinė_stata (0) xnor dabartinė_stata (1); ankstesnė_stata (2) <= (dabartinė_stata (0) ir dabartinė_stata (1)) x arba dabartinė_stata (2); ankstesnė_stata (3) sclk, sekanti_stata => kita_stata, ankstesnė_stata => ankstesnė_stata, aukštyn_galima => aukštyn_galima, žemyn_galima => žemyn įjungta, dabartinė_stata => dabartinė_stata); rodyti: sseg_dec uosto žemėlapis (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: led_clkDiv uosto žemėlapis (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv uosto žemėlapis (clk => clk, sclk => sclk); pabaiga Elgesys;

4 žingsnis: Apribojimų nustatymas ir surinkimas

Apribojimai

Norėdami tinkamai nustatyti ir užprogramuoti „Basys 3“plokštę, pirmiausia turime nustatyti suvaržymų failą, kuris pridedamas prie šio veiksmo. Buvo sureguliuoti šie nustatymai:

Mygtukai

  • T18 pakeistas į „up_enable“(padidinkite ryškumą)
  • U17 pakeistas į „down_enable“(sumažinkite ryškumą)

7 segmentų ekranas

  • W7, W6, U8, V8, U5, V5, U7, V7 reiškia kiekvieną vieno ekrano segmentą
  • U2, U4, V4, W4 reiškia kiekvieną rodomą anodą (tik 2 yra aktyvūs, nes didžiausias mūsų skaičius yra 15)

PMOD antraštė JC

JC7 yra vieta, kur mes prijungiame vieną iš LED lemputės laidų, o kita - prie GROUND

Nustačius visa tai, jums tereikia sugeneruoti bitų srautą (naudojant bet kokią programinę įrangą, kurią naudojate, pvz., „Vivado“), užprogramuoti plokštę ir pakilti! Turite darbo lentą.

Pastaba: kaiščių atvaizdavimą rasite „Basys 3“duomenų lape.

Surinkimas

5 veiksmas: reguliatoriaus naudojimas

Jei viskas gerai, turėtumėte turėti visiškai veikiančią apšvietimo sistemą. Apibendrinant galima pasakyti, kad paspaudus viršutinį mygtuką, ryškumas padidės (iki 15), o paspaudus žemyn - ryškumas sumažės (iki 0). Tikimės, kad viskas gerai jūsų dabar atsipalaidavusiam regėjimui!

Rekomenduojamas: