INHOUDSOPGAWE:

Dimbare LED met Basys 3 -bord: 5 stappe
Dimbare LED met Basys 3 -bord: 5 stappe

Video: Dimbare LED met Basys 3 -bord: 5 stappe

Video: Dimbare LED met Basys 3 -bord: 5 stappe
Video: Основные ошибки при шпатлевке стен и потолка. #35 2024, Julie
Anonim
Dimbare LED met Basys 3 -bord
Dimbare LED met Basys 3 -bord

In hierdie gids gaan ons 'n eksterne LED -verduisteringstelsel bou en beheer. Met die beskikbare knoppies kan die gebruiker die LED -gloeilamp tot die gewenste helderheid dim. Die stelsel gebruik die Basys 3 -bord en is gekoppel aan 'n broodbord met 'n weerstand en die LED -gloeilamp. Deur op die aangewese "op" -knoppie te druk, word die helderheid verhoog, en deur op die "af" -knoppie te druk, word die helderheid tot nul verminder. Dit verhoed nie net dat die gebruiker verblind word deur gloeilampe soos sonlig nie, maar dit bespaar ook energie!

Stap 1: Skep invoerteller

Vir hierdie stap skep ons die komponent wat die helderheidsgraad bepaal (deur 'n klok) deur twee skakelaars te gebruik: een om te verhoog en een om te verminder. Met behulp van VHDL het ons die toonbank vervaardig deur D-flip-flops te gebruik. Deur op die "omhoog" -knoppie te druk, word die volgende toestand na die huidige toestand gedruk, met die sewe segmentskerm en die LED -lamp.

entiteit updown_counter is

Poort (present_state: out STD_LOGIC_VECTOR (3 downto 0); previous_state: in STD_LOGIC_VECTOR (3 downto 0); next_state: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; down_enable: in STD_LOGIC; up_enable: in STD_LOGIC; beëindig updown_counter; argitektuur Gedrag van updown_counter begin flop: proses (next_state, clk, up_enable, down_enable, previous_state) begin as (rising_edge (clk)) dan as (up_enable = '1' en nie (next_state = "0000")) dan present_state <= volgende_staat; elsif (down_enable = '1' en nie (previous_state = "1111")) dan present_state <= previous_state; eindig as; eindig as; eindproses flop; einde Gedrag;

Ons benodig ook 'n horlosie om elke ingang vas te hou (wanneer dit styg), daarom het ons ook 'n klokverdeler geskep wat bepaal hoe vinnig die knoppies tussen elke helderheidsgraad ingedruk kan word. Met hierdie klokverdeler kan ons die regte vlak op die sewesegment vertoon en die regte intensiteitsvlak vir elke vlak produseer.

entiteit counter_clkDiv is

Poort (clk: in std_logic; sclk: out std_logic); eindig counter_clkDiv; argitektuur my_clk_div van counter_clkDiv is konstant max_count: heelgetal: = (10000000); sein tmp_clk: std_logic: = '0'; begin my_div: proses (clk, tmp_clk) veranderlike div_cnt: heelgetal: = 0; begin as (rising_edge (clk)) dan as (div_cnt> = MAX_COUNT) dan tmp_clk <= nie tmp_clk; div_cnt: = 0; anders div_cnt: = div_cnt + 1; eindig as; eindig as; sclk <= tmp_clk; beëindig proses my_div; eindig my_clk_div;

Stap 2: Skep LED Clock Divider

Vir hierdie stap skep ons 'n klokverdeler vir die LED -gloeilamp om 16 verskillende intensiteitsvlakke te bepaal. Aangesien 0 af is na 15 met maksimum helderheid, verhoog die klokverdeler elke druk op die knoppie volgens wat ons stel om die helderheidsvlakke te wees. Elke toenemende vlak beteken 'n toename in die horlosie vir die LED -gloeilamp. Onthou ons dat die helderheid nie lineêr toeneem nie, het ons die horlosie tot die hoogste gestyg en ons horlosies dienooreenkomstig verminder.

Let wel: ons gebruik 'n blou LED. Om 'n ander kleur (soos rooi) te gebruik, benodig heeltemal verskillende horlosies; 'n medium helderheidsinstelling vir blou kan reeds die maksimum helderheid vir rooi wees. Dit gebeur omdat verskillende golflengtes van lig verskillende hoeveelhede energie benodig, terwyl die koeler kleure soos pers en blou meer energie benodig, terwyl die warmer kleure soos rooi en oranje minder energie benodig.

entiteit led_clkDiv is Port (present_state: in STD_LOGIC_VECTOR (3 tot 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); beëindig led_clkDiv; argitektuur Gedrag van led_clkDiv is sein tmp_clk: std_logic: = '0'; gedeelde veranderlike max_count: heelgetal; begin count_stuff: proses (present_state) begin case present_state is wanneer "0000" => max_count: = 0; wanneer "0001" => max_count: = 2; wanneer "0010" => max_count: = 4; wanneer "0011" => max_count: = 6; wanneer "0100" => max_count: = 8; wanneer "0101" => max_count: = 10; wanneer "0110" => max_count: = 12; wanneer "0111" => max_count: = 14; wanneer "1000" => max_count: = 16; wanneer "1001" => max_count: = 25; wanneer "1010" => max_count: = 50; wanneer "1011" => max_count: = 100; wanneer "1100" => max_count: = 150; wanneer "1101" => max_count: = 200; wanneer "1110" => max_count: = 250; wanneer "1111" => max_count: = 300; eindsaak; einde proses count_stuff; my_div: verwerk (clk, tmp_clk, present_state) veranderlike div_cnt: heelgetal: = 0; begin as (rising_edge (clk)) dan as (div_cnt> = max_count) dan tmp_clk <= nie tmp_clk; div_cnt: = 0; anders div_cnt: = div_cnt + 1; eindig as; eindig as; led_clk <= tmp_clk; beëindig proses my_div; einde Gedrag;

Stap 3: Skep die LED -beheerder

Noudat ons so ver gekom het, is dit tyd om uiteindelik al die komponente wat ons tot dusver geskep het, in die LED Controller -lêer te kombineer.

Om op te som, die komponente wat gebruik word, is die volgende:

  • Invoerteller (updown_counter)
  • Klokverdeler (counter_clkDiv)
  • LED klok verdeler (led_clkDiv)
  • Sewe-segment vertoonbestuurder (sseg_dec) (aangehegte lêer)

Die bestuurder van die sewe segmente is eintlik nie voorheen bespreek nie, want ons het eintlik die VHDL-lêer by dr. Bryan Mealy geleen vanweë die lang en ingewikkelde kode. Wat dit eintlik doen, is om ons knoppie-insette na die sewesegment op die Basys 3-bord te stuur, sodat ons weet op watter vlak van helderheid.

Die LED -kontroleerder gebruik vorentoe flip -flops om die telling te verhoog of te verminder, wat beide die sewe segmentweergawe en die helderheid van die LED -gloeilamp gelyktydig beheer.

entiteitsteller is 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); eindteller; argitektuur Gedrag van teller is komponent updown_counter is Port (present_state: out STD_LOGIC_VECTOR (3 downto 0); previous_state: in STD_LOGIC_VECTOR (3 downto 0); next_state: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; down_enable: up_enable: in STD_LOGIC); einde komponent updown_counter; komponent counter_clkDiv is Port (clk: in std_logic; sclk: out std_logic); eindkomponent counter_clkDiv; komponent sseg_dec is Port (ALU_VAL: in std_logic_vector (7 downto 0); SIGN: in std_logic; Geldig: in std_logic; CLK: in std_logic; DISP_EN: out std_logic_vector (3 downto 0); SEGMENTS: out std_logic_; eindkomponent sseg_dec; komponent led_clkDiv is Port (present_state: in STD_LOGIC_VECTOR (3 tot 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); eindkomponent led_clkDiv; sein present_state: STD_LOGIC_VECTOR (3 tot 0): = "0000"; sein volgende_staat: STD_LOGIC_VECTOR (3 tot 0): = "0000"; sein vorige_staat: STD_LOGIC_VECTOR (3 tot 0): = "0000"; sein Alu_Val: STD_LOGIC_VECTOR (7 tot 0); sein sclk: STD_LOGIC; begin Alu_Val (7 tot 4) <= "0000"; Alu_Val (3 tot 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) and present_state (1) and present_state (2)) xor present_state (3); previous_state (0) <= not (present_state (0)); vorige_staat (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); vertoon: sseg_dec poortkaart (ALU_VAL => Alu_Val, SIGN => '0', Geldig => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: led_clkDiv -poortkaart (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv -poortkaart (clk => clk, sclk => sclk); einde Gedrag;

Stap 4: Vasstelling van beperkings en samestelling

Beperkings

Om die Basys 3 -bord behoorlik op te stel en te programmeer, moet ons eers ons beperkingslêer opstel wat by hierdie stap aangeheg is. Die volgende instellings is aangepas:

Knoppies

  • T18 verander na "up_enable" (verhoog helderheid)
  • U17 verander na "down_enable" (verminder helderheid)

7 segment vertoon

  • W7, W6, U8, V8, U5, V5, U7, V7 verteenwoordig elke segment van een skerm
  • U2, U4, V4, W4 verteenwoordig elke anode wat vertoon word (slegs 2 is aktief omdat ons hoogste getal 15 is)

PMOD -kop JC

JC7 is waar ons een van die drade van die LED -gloeilamp verbind, en die ander draad lei na GROND

Nadat u dit alles opgestel het, hoef u net u bitstream te genereer (met watter sagteware u ook al gebruik, d.w.s. Vivado), u bord te programmeer en 'n boom! Jy het vir jou 'n werkbord gekry.

Opmerking: die penkaart kan hier op die Basys 3 -datablad gevind word.

Vergadering

Stap 5: Gebruik u dimmer -skakelaar

As alles goed verloop, moet u 'n ten volle funksionerende dimmerstelsel hê. Om op te som, verhoog die helderheid (tot 15) deur op die boonste knoppie te druk, en deur op die af -knoppie te druk, word u helderheid verminder (tot 0). Hoop dit gaan goed met u nou ontspanne gesig!

Aanbeveel: