Sisällysluettelo:

Himmennettävä LED Basys 3 -levyä käyttämällä: 5 vaihetta
Himmennettävä LED Basys 3 -levyä käyttämällä: 5 vaihetta

Video: Himmennettävä LED Basys 3 -levyä käyttämällä: 5 vaihetta

Video: Himmennettävä LED Basys 3 -levyä käyttämällä: 5 vaihetta
Video: Основные ошибки при возведении перегородок из газобетона #5 2024, Marraskuu
Anonim
Himmennettävä LED Basys 3 Boardilla
Himmennettävä LED Basys 3 Boardilla

Tässä oppaassa aiomme rakentaa ja ohjata ulkoista LED -himmennysjärjestelmää. Käytettävissä olevilla painikkeilla käyttäjä voi himmentää LED -lampun haluamaansa kirkkauteen. Järjestelmä käyttää Basys 3 -korttia ja se on liitetty leipälevyyn, joka sisältää vastuksen ja LED -lampun. Painamalla "ylös" -painiketta lisätään kirkkautta ja "alas" -painikkeen painaminen vähentää kirkkautta kokonaan nollaan. Tämä ei ainoastaan estä käyttäjää sokeutumasta kirkkaina auringonvalolampuina, vaan myös säästää energiaa!

Vaihe 1: Luo tulolaskuri

Tässä vaiheessa luomme komponentin, joka määrittää kirkkauden tason (kellon kautta) käyttämällä kahta kytkintä: toinen lisää ja toinen pienentää. VHDL: n avulla tuotimme laskurin käyttämällä D-varvastossuja. "Ylös" -painikkeen painaminen siirtää seuraavan tilan nykyiseen tilaan ja tuottaa seitsemän segmentin näytön ja LED -lampun.

entiteetti updown_counter on

Portti (nykyinen_tila: ulos STD_LOGIC_VECTOR (3 - 0); edellinen_tila: STD_LOGIC_VECTOR (3 - 0); next_state: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; down_enable: in STD_LOGIC; up_enable: in ST) end updown_counter; arkkitehtuuri updown_counterin käyttäytyminen alkaa flop: prosessi (seuraava_tila, clk, ylös_enable, alas_enable, edellinen_tila) alkaa jos (nouseva reuna (clk)) sitten jos (up_enable = '1' ja ei (next_state = "0000")) sitten present_state <= seuraava_tila; elsif (down_enable = '1' eikä ei (previous_state = "1111")) sitten present_state <= edellinen_tila; loppu Jos; loppu Jos; lopeta prosessin floppi; lopeta käyttäytyminen;

Tarvitsemme myös kellon jokaista tuloa varten (kun se nousee), joten loimme myös kellonjakajan, joka määrittää, kuinka nopeasti painikkeita voidaan painaa kunkin kirkkaustason välillä. Tämän kellonjakajan avulla voimme näyttää oikean tason oikein seitsemän segmentin näytöllä ja tuottaa oikean intensiteetin tason kullekin tasolle.

entiteetti counter_clkDiv on

Portti (clk: in std_logic; sclk: out std_logic); end counter_clkDiv; arkkitehtuuri my_clk_div / counter_clkDiv on vakio max_count: integer: = (10000000); signaali tmp_clk: std_logic: = '0'; aloita my_div: process (clk, tmp_clk) muuttuja div_cnt: integer: = 0; aloita jos (nouseva reuna (clk)) sitten jos (div_cnt> = MAX_COUNT) sitten tmp_clk <= ei tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; loppu Jos; loppu Jos; sclk <= tmp_clk; lopeta prosessi my_div; end my_clk_div;

Vaihe 2: Luo LED -kellonjakaja

Tässä vaiheessa luomme kellonjakajan LED -lampulle 16 eri voimakkuustason määrittämiseksi. Kun 0 on pois päältä ja 15 näyttää suurimman kirkkauden, kellonjakaja lisää jokaista painikkeen painallusta valitsemallamme kirkkaustasoksi. Jokainen nouseva taso merkitsi LED -lampun kellon kasvua. Muistaessamme, että kirkkaus ei kasva lineaarisesti, käänsimme kelloa suurimmalle mahdolliselle tasolle ja laskimme kelloja vastaavasti.

Huomaa: käytämme sinistä LEDiä. Eri värin (kuten punaisen) käyttäminen vaatii hieman erilaisia kelloja; keskikokoinen kirkkausasetus siniselle voisi jo olla punaisen kirkkaus. Tämä johtuu siitä, että erilaiset valon aallonpituudet vaativat erilaisia määriä energiaa, ja viileämmät värit, kuten violetti ja sininen, vaativat enemmän energiaa, kun taas lämpimät värit, kuten punainen ja oranssi, vaativat vähemmän energiaa.

entiteetti led_clkDiv on portti (nykyinen_tila: kohteessa STD_LOGIC_VECTOR (3 - 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); end led_clkDiv; arkkitehtuuri led_clkDivin käyttäytyminen on signaali tmp_clk: std_logic: = '0'; jaettu muuttuja max_count: kokonaisluku; aloita count_stuff: process (present_state) aloita tapaus present_state is when "0000" => max_count: = 0; kun "0001" => max_count: = 2; kun "0010" => max_count: = 4; kun "0011" => max_count: = 6; kun "0100" => max_count: = 8; kun "0101" => max_count: = 10; kun "0110" => max_count: = 12; kun "0111" => max_count: = 14; kun "1000" => max_count: = 16; kun "1001" => max_count: = 25; kun "1010" => max_count: = 50; kun "1011" => max_count: = 100; kun "1100" => max_count: = 150; kun "1101" => max_count: = 200; kun "1110" => max_count: = 250; kun "1111" => max_count: = 300; päätykotelo; lopeta prosessi count_stuff; my_div: process (clk, tmp_clk, present_state) muuttuja div_cnt: integer: = 0; aloita jos (nouseva reuna (clk)) sitten jos (div_cnt> = max_count) sitten tmp_clk <= ei tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; loppu Jos; loppu Jos; led_clk <= tmp_clk; lopeta prosessi my_div; lopeta käyttäytyminen;

Vaihe 3: Led -ohjaimen luominen

Nyt kun olemme päässeet tähän asti, on aika yhdistää kaikki tähän mennessä luomamme komponentit LED -ohjaintiedostoon.

Yhteenvetona voidaan todeta, että käytetyt komponentit ovat seuraavat:

  • Syöttölaskuri (päivityslaskuri)
  • Kellonjakaja (counter_clkDiv)
  • LED -kellonjakaja (led_clkDiv)
  • Seitsemän segmentin näytönohjain (sseg_dec) (liitteenä oleva tiedosto)

Seitsemän segmentin näytönohjaimesta ei oikeastaan keskusteltu aiemmin, koska lainasimme VHDL-tiedoston tohtori Bryan Mealylta sen pitkän ja monimutkaisen koodin vuoksi. Pohjimmiltaan se ohjaa painikkeemme syötteet Basys 3 -kortin seitsemän segmentin näyttöön, jotta tiedämme kirkkauden tason.

Jatkossa LED -ohjain lisää tai vähentää laskuja, jotka ohjaavat samanaikaisesti sekä seitsemän segmentin näyttöä että LED -lampun kirkkautta.

entiteettilaskuri on portti (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); päätylaskuri; arkkitehtuuri Laskurin käyttäytyminen on komponentti päivitys_laskuri on portti (nykyinen_tila: ulos STD_LOGIC_VECTOR (3 - 0); edellinen_tila: STD_LOGIC_VECTOR (3 - 0); next_state: in STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; ST_LOGIC) up_enable: STD_LOGIC); loppukomponentti updown_counter; komponentti counter_clkDiv on portti (clk: in std_logic; sclk: out std_logic); pääkomponentti counter_clkDiv; komponentti sseg_dec on portti (ALU_VAL: in 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); SEGMENTSog out out std_); pääkomponentti sseg_dec; komponentti led_clkDiv on portti (nykyinen_tila: STD_LOGIC_VECTORissa (3 - 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); pääkomponentti led_clkDiv; signaali nykyinen_tila: STD_LOGIC_VECTOR (3 - 0): = "0000"; signaali next_state: STD_LOGIC_VECTOR (3 - 0): = "0000"; signaali edellinen_tila: STD_LOGIC_VECTOR (3 - 0): = "0000"; signaali Alu_Val: STD_LOGIC_VECTOR (7 - 0); signaali sclk: STD_LOGIC; aloita Alu_Val (7 - 4) <= "0000"; Alu_Val (3 - 0) <= nykyinen_tila; seuraava_tila (0) <= ei (nykyinen_tila (0)); seuraava_tila (1) <= nykyinen_tila (0) xtai nykyinen_tila (1); seuraava_tila (2) <= (nykyinen_tila (0) ja nykyinen_tila (1)) xtai nykyinen_tila (2); seuraava_tila (3) <= (nykyinen_tila (0) ja nykyinen_tila (1) ja nykyinen_tila (2)) xtai nykyinen_tila (3); edellinen_tila (0) <= ei (nykyinen_tila (0)); edellinen_tila (1) <= nykyinen_tila (0) xtai nykyinen_tila (1); edellinen_tila (2) <= (nykyinen_tila (0) eikä nykyinen_tila (1)) xtai nykyinen_tila (2); edellinen_tila (3) sclk, seuraava_tila => seuraava_tila, edellinen_tila => edellinen_tila, ylös_enable => ylös_kelpoinen, alas_kelpoinen => alas_käytettävä, nykyinen_tila => nykyinen tila); 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 -porttikartta (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv -porttikartta (clk => clk, sclk => sclk); lopeta käyttäytyminen;

Vaihe 4: Rajoitusten asettaminen ja kokoonpano

Rajoitukset

Jotta voimme asentaa ja ohjelmoida Basys 3 -levyn oikein, meidän on ensin määritettävä tähän vaiheeseen liitetty rajoitustiedosto. Seuraavia asetuksia on muutettu:

Painikkeet

  • T18 muutettu arvoon "up_enable" (lisää kirkkautta)
  • Vaihdettu U17 arvoon "down_enable" (vähennä kirkkautta)

7 segmentin näyttö

  • W7, W6, U8, V8, U5, V5, U7, V7 edustavat yhden näytön jokaista segmenttiä
  • U2, U4, V4, W4 edustavat jokaista näytettyä anodia (vain 2 on aktiivinen, koska suurin lukumme on 15)

PMOD -otsikko JC

JC7 kytketään yksi LED -lampun johtimista ja toinen johdin maadoitukseen

Kun olet asettanut tämän kaiken, sinun tarvitsee vain luoda bittivirta (millä tahansa ohjelmistolla, jota käytät, esim. Vivado), ohjelmoida korttisi ja puomi! Sinulla on työtaulu.

Huomautus: Pin -kartoitus löytyy Basys 3 -esitteestä täältä.

Kokoonpano

Vaihe 5: Himmenninkytkimen käyttäminen

Jos kaikki menee hyvin, sinulla pitäisi olla täysin toimiva himmennysjärjestelmä. Yhteenvetona voidaan todeta, että yläpainikkeen painaminen lisää kirkkautta (aina 15: een) ja alas -painikkeen painaminen vähentää kirkkautta (aina 0). Toivottavasti kaikki menee hyvin nyt rentoutuneelle näkökyvyllesi!

Suositeltava: