Indholdsfortegnelse:

Dæmpbar LED ved hjælp af Basys 3 Board: 5 trin
Dæmpbar LED ved hjælp af Basys 3 Board: 5 trin

Video: Dæmpbar LED ved hjælp af Basys 3 Board: 5 trin

Video: Dæmpbar LED ved hjælp af Basys 3 Board: 5 trin
Video: Søgelys fra skålen af ​​Auchan 2024, Juli
Anonim
Dæmpbar LED ved hjælp af Basys 3 Board
Dæmpbar LED ved hjælp af Basys 3 Board

I denne vejledning skal vi bygge og styre et eksternt LED -dæmpningssystem. Med de tilgængelige knapper kan brugeren dæmpe LED -pæren til enhver ønsket lysstyrke. Systemet bruger Basys 3 -kortet, og det er forbundet til et brødbræt, der indeholder en modstand og LED -pæren. Ved at trykke på den angivne "op" -knap øges lysstyrken, og ved at trykke på knappen "ned" sænkes lysstyrken helt til nul. Dette forhindrer ikke kun, at brugeren bliver blændet af lyse pærer, men det sparer også energi!

Trin 1: Opret inputtæller

Til dette trin opretter vi den komponent, der bestemmer lysstyrkeniveauet (gennem et ur) ved hjælp af to kontakter: en for at øge og en for at reducere. Ved hjælp af VHDL producerede vi tælleren ved hjælp af D-flip-flops. Ved at trykke på "op" -knappen skubbes den næste tilstand til den nuværende tilstand og sendes til displayet med syv segmenter og LED -pæren.

enhed updown_counter er

Port (nuværende_stat: ud STD_LOGIC_VECTOR (3 ned til 0); forrige_stat: i STD_LOGIC_VECTOR (3 ned til 0); næste_stat: i STD_LOGIC_VECTOR (3 ned til 0); clk: i STD_LOGIC; ned_aktiveret: i STD_LOGIC; op_aktiveret: i STD_LOGIC afslut updown_counter; arkitektur Adfærdsadfærd for updown_counter starter flop: proces (next_state, clk, up_enable, down_enable, previous_state) begynder hvis (rising_edge (clk)) derefter hvis (up_enable = '1' og ikke (next_state = "0000")) derefter present_state <= næste_stat; elsif (down_enable = '1' og ikke (previous_state = "1111")) derefter present_state <= previous_state; Afslut Hvis; Afslut Hvis; slut proces flop; ende Adfærdsmæssig;

Vi har også brug for et ur til hver indgang, der skal låses fast (når den stiger), så vi har også oprettet en urdeler, der bestemmer, hvor hurtigt knapperne kan trykkes mellem hvert lysstyrkeniveau. Denne urdeler giver os mulighed for korrekt at vise det rigtige niveau på syv segment display og producere det rigtige intensitetsniveau for hvert niveau.

enhed counter_clkDiv er

Port (clk: in std_logic; sclk: out std_logic); afslut counter_clkDiv; arkitektur my_clk_div for counter_clkDiv er konstant max_count: heltal: = (10000000); signal tmp_clk: std_logic: = '0'; begynde my_div: proces (clk, tmp_clk) variabel div_cnt: heltal: = 0; start if (rising_edge (clk)) derefter hvis (div_cnt> = MAX_COUNT) derefter tmp_clk <= ikke tmp_clk; div_cnt: = 0; ellers div_cnt: = div_cnt + 1; Afslut Hvis; Afslut Hvis; sclk <= tmp_clk; afslutte processen my_div; afslut my_clk_div;

Trin 2: Opret LED Clock Divider

Til dette trin opretter vi en urdeler til LED -pæren for at bestemme 16 forskellige intensitetsniveauer. Da 0 er slukket til 15, der viser maksimal lysstyrke, øger uropdeleren hvert knaptryk med det, vi har indstillet til at være lysstyrkeniveauer. Hvert stigende niveau betød en stigning i uret til LED -pæren. Ved at huske på, at lysstyrken ikke stiger lineært, slog vi uret til det højeste, det kunne gå, og reducerede vores ure i overensstemmelse hermed.

Bemærk: vi bruger en blå LED. Brug af en anden farve (som rød) vil kræve lidt forskellige ure helt; en medium lysstyrkeindstilling for blå kunne allerede være maks lysstyrke for rød. Dette sker, fordi forskellige lysbølgelængder vil kræve forskellige mængder energi, hvor de køligere farver som lilla og blå kræver mere energi, mens de varmere farver som rød og orange kræver mindre energi.

enhed led_clkDiv er Port (nuværende_stat: i STD_LOGIC_VECTOR (3 ned til 0); clk: i STD_LOGIC; led_clk: ude STD_LOGIC); slut led_clkDiv; arkitektur Adfærdsmæssig af led_clkDiv er signal tmp_clk: std_logic: = '0'; delt variabel max_count: integer; begin count_stuff: process (present_state) begin case present_state er når "0000" => max_count: = 0; når "0001" => max_count: = 2; når "0010" => max_count: = 4; når "0011" => max_count: = 6; når "0100" => max_count: = 8; når "0101" => max_count: = 10; når "0110" => max_count: = 12; når "0111" => max_count: = 14; når "1000" => max_count: = 16; når "1001" => max_count: = 25; når "1010" => max_count: = 50; når "1011" => max_count: = 100; når "1100" => max_count: = 150; når "1101" => max_count: = 200; når "1110" => max_count: = 250; når "1111" => max_count: = 300; slut sag; afslutte processen count_stuff; my_div: proces (clk, tmp_clk, present_state) variabel div_cnt: heltal: = 0; begynde hvis (stigende_kant (clk)) derefter hvis (div_cnt> = max_count) derefter tmp_clk <= ikke tmp_clk; div_cnt: = 0; ellers div_cnt: = div_cnt + 1; Afslut Hvis; Afslut Hvis; led_clk <= tmp_clk; afslutte processen my_div; ende Adfærdsmæssig;

Trin 3: Oprettelse af LED -controlleren

Nu hvor vi er nået så langt, er det tid til endelig at kombinere alle de komponenter, vi har skabt indtil nu, i LED Controller -filen.

For at opsummere er de anvendte komponenter følgende:

  • Input tæller (updown_counter)
  • Urdeler (counter_clkDiv)
  • LED clock divider (led_clkDiv)
  • Syv segment display driver (sseg_dec) (vedhæftet fil)

Den syv-segmenters displaydriver blev faktisk ikke tidligere diskuteret, fordi vi faktisk lånte VHDL-filen fra Dr. Bryan Mealy på grund af dens lange og komplicerede kode. Hvad det i det væsentlige gør, er at drive vores knapindgange til syv-segmentets display på Basys 3-kortet, så vi ved, hvilket lysstyrkeniveau der er.

Fremadrettet bruger LED -controlleren flip -flops til at øge eller reducere antallet, der styrer både det syv segment display og lysstyrkeniveauet for LED -pæren samtidigt.

enhedstæller er Port (clk: i STD_LOGIC; up_enable: i STD_LOGIC; down_enable: i STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 ned til 0); DISP_EN: ud STD_LOGIC_VECTOR (3 ned til 0); led_clk: ud STD_LOGIC); slut tæller; arkitektur Tællers adfærd er komponent updown_counter er Port (nuværende_stat: ude STD_LOGIC_VECTOR (3 ned til 0); forrige_stat: i STD_LOGIC_VECTOR (3 ned til 0); næste_stat: i STD_LOGIC_VECTOR (3 ned til 0); clk: i STD_LOGIC; ned_aktiveret: up_enable: i STD_LOGIC); slutkomponent updown_counter; komponent counter_clkDiv er Port (clk: in std_logic; sclk: out std_logic); slutkomponent counter_clkDiv; komponent sseg_dec er Port (ALU_VAL: i std_logic_vector (7 ned til 0); SIGN: i std_logic; Gyldig: i std_logic; CLK: i std_logic; DISP_DA: out std_logic_vector (3 ned til 0); SEGMENTS: ud std_logic_; slutkomponent sseg_dec; komponent led_clkDiv er Port (nuværende_stat: i STD_LOGIC_VECTOR (3 ned til 0); clk: i STD_LOGIC; led_clk: ud STD_LOGIC); slutkomponent led_clkDiv; signal present_state: STD_LOGIC_VECTOR (3 ned til 0): = "0000"; signal næste_stat: STD_LOGIC_VECTOR (3 ned til 0): = "0000"; signal foregående_stat: STD_LOGIC_VECTOR (3 ned til 0): = "0000"; signal Alu_Val: STD_LOGIC_VECTOR (7 ned til 0); signal sclk: STD_LOGIC; begynde Alu_Val (7 ned til 4) <= "0000"; Alu_Val (3 ned til 0) <= nuværende_stat; 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) og present_state (1) og present_state (2)) xor present_state (3); previous_state (0) <= not (present_state (0)); previous_state (1) <= present_state (0) xnor present_state (1); forrige_stat (2) <= (præsent_stat (0) eller præsent_stat (1)) eller nuværende_stat (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); display: sseg_dec port map (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: led_clkDiv portkort (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv portkort (clk => clk, sclk => sclk); ende Adfærdsmæssig;

Trin 4: Etablering af begrænsninger og samling

Begrænsninger

For at konfigurere og programmere Basys 3 -kortet korrekt skal vi først konfigurere vores begrænsningsfil, der er vedhæftet dette trin. Følgende indstillinger er blevet justeret:

Knapper

  • Ændret T18 til "up_enable" (øg lysstyrken)
  • Ændret U17 til "down_enable" (reducer lysstyrken)

7 segment display

  • W7, W6, U8, V8, U5, V5, U7, V7 repræsenterer hvert segment i et display
  • U2, U4, V4, W4 repræsenterer hver anode, der vises (kun 2 er aktive, fordi vores højeste tal er 15)

PMOD Header JC

JC7 er, hvor vi forbinder en af ledningerne på LED -pæren, og den anden ledning fører til JORD

Efter at have konfigureret alt dette, er alt du skal gøre at generere din bitstream (med den software du bruger, dvs. Vivado), programmere dit board og boom! Du skaffede dig en arbejdsgruppe.

Bemærk: Pin -mapping kan findes på Basys 3 -databladet her.

montage

Trin 5: Brug af din lysdæmperkontakt

Hvis alt går godt, skal du have et fuldt fungerende lysdæmper. For at opsummere, øges din lysstyrke ved at trykke på den øverste knap (helt til 15), og ved at trykke på ned -knappen reduceres din lysstyrke (helt til 0). Håber alt går godt for dit nu afslappede syn!

Anbefalede: