Съдържание:

Димируем светодиод, използващ Basys 3 Board: 5 стъпки
Димируем светодиод, използващ Basys 3 Board: 5 стъпки

Видео: Димируем светодиод, използващ Basys 3 Board: 5 стъпки

Видео: Димируем светодиод, използващ Basys 3 Board: 5 стъпки
Видео: Control 10 output pins or relay using 10 push button switch with 1 Arduino input pin ANPB-V2 2024, Юли
Anonim
Димируем светодиод с помощта на дъска Basys 3
Димируем светодиод с помощта на дъска Basys 3

В това ръководство ще изградим и контролираме външна LED система за затъмняване. С наличните бутони потребителят може да затъмни LED крушката до желаната яркост. Системата използва платката Basys 3 и е свързана с макет, който съдържа резистор и LED крушката. Натискането на определения бутон "нагоре" ще увеличи яркостта, а натискането на бутона "надолу" ще намали яркостта чак до нула. Това не само не позволява на потребителя да бъде заслепен от ярки като слънцето крушки, но и спестява енергия!

Стъпка 1: Създайте брояч на входовете

За тази стъпка създаваме компонента, който определя нивото на яркост (чрез часовник), като използваме два превключвателя: един за увеличаване и един за намаляване. Използвайки VHDL, ние създадохме брояча чрез използването на D джапанки. Натискането на бутона "нагоре" избутва следващото състояние към настоящото състояние, извеждайки до седем сегментния дисплей и LED крушката.

обект updown_counter е

Порт: end updown_counter; архитектура Поведението на updown_counter е start flop: process (next_state, clk, up_enable, down_enable, previous_state) start if (rise_edge (clk)) then if (up_enable = '1', а не (next_state = "0000")) then present_state <= next_state; elsif (down_enable = '1', а не (previous_state = "1111")) тогава present_state <= previous_state; край ако; край ако; флоп на крайния процес; край Поведенчески;

Също така се нуждаем от часовник, за който всеки вход да бъде фиксиран (когато се издигне), затова създадохме и разделител на часовника, който определя колко бързо могат да се натискат бутоните между всяко ниво на яркост. Този часовник разделител ни позволява правилно да показваме правилното ниво на седем сегментния дисплей и да произвеждаме правилното ниво на интензивност за всяко ниво.

обект counter_clkDiv е

Порт (clk: в std_logic; sclk: out std_logic); край counter_clkDiv; архитектура my_clk_div на counter_clkDiv е константа max_count: integer: = (10000000); сигнал tmp_clk: std_logic: = '0'; започнете my_div: process (clk, tmp_clk) променлива div_cnt: integer: = 0; започнете, ако (нарастващ ръб (clk)), след това ако (div_cnt> = MAX_COUNT), тогава tmp_clk <= не tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; край ако; край ако; sclk <= tmp_clk; край на процеса my_div; край my_clk_div;

Стъпка 2: Създайте LED разделител на часовника

За тази стъпка създаваме часовник за LED крушката, за да определим 16 различни нива на интензитет. Като 0 е изключено до 15, показвайки максимална яркост, часовникът разделител увеличава всяко натискане на бутон с това, което задаваме като нива на яркост. Всяко нарастващо ниво означаваше увеличаване на часовника за LED крушката. Като си спомним, че яркостта не се увеличава линейно, ние завъртяхме часовника до най -високата му стойност и съответно намалихме часовниците си.

Забележка: използваме син светодиод. Използването на различен цвят (като червено) ще изисква съвсем различни часовници като цяло; настройка за средна яркост за синьо вече може да бъде максимална яркост за червено. Това се случва, защото различните дължини на вълната на светлината ще изискват различни количества енергия, като по -хладните цветове като лилаво и синьо изискват повече енергия, докато по -топлите цветове като червено и оранжево изискват по -малко енергия.

обект led_clkDiv е порт (сегашно състояние: в STD_LOGIC_VECTOR (3 надолу 0); clk: в STD_LOGIC; led_clk: изход STD_LOGIC); end led_clkDiv; архитектура Поведението на led_clkDiv е сигнал tmp_clk: std_logic: = '0'; споделена променлива max_count: integer; когато "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: process (clk, tmp_clk, present_state) променлива div_cnt: integer: = 0; започнете, ако (нарастващ ръб (clk)), след това ако (div_cnt> = max_count), тогава tmp_clk <= не tmp_clk; div_cnt: = 0; else div_cnt: = div_cnt + 1; край ако; край ако; led_clk <= tmp_clk; край на процеса my_div; край Поведенчески;

Стъпка 3: Създаване на LED контролер

Сега, когато стигнахме дотук, е време най -накрая да комбинираме всички компоненти, които сме създали досега, във файла на LED контролера.

В обобщение, използваните компоненти са следните:

  • Входен брояч (updown_counter)
  • Часовник (counter_clkDiv)
  • LED разделител на часовника (led_clkDiv)
  • Драйвер за седем сегмента на дисплея (sseg_dec) (прикачен файл)

Седемсегментният драйвер на дисплея всъщност не беше обсъждан по-рано, защото всъщност заимствахме VHDL файла от д-р Брайън Мили поради дългия и сложен код. Това, което той по същество прави, е да задвижва нашите входни бутони към седем-сегментния дисплей на платката Basys 3, така че да знаем какво ниво на яркост е включено.

Придвижвайки се напред, LED контролерът използва джапанки, за да увеличи или намали броя, който контролира едновременно седемсегментния дисплей и нивото на яркост на LED крушката.

броячът на обекти е Port (clk: в STD_LOGIC; up_enable: в STD_LOGIC; down_enable: в STD_LOGIC; SEGMENTS: out STD_LOGIC_VECTOR (7 downto 0); DISP_EN: out STD_LOGIC_VECTOR (3 downto 0); led_clIC: out ST; краен брояч; архитектура Поведението на брояча е компонент updown_counter е 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_ up_enable: в STD_LOGIC); краен компонент updown_counter; компонент counter_clkDiv е порт (clk: в std_logic; sclk: out std_logic); краен компонент counter_clkDiv; компонент sseg_dec е Порт (ALU_VAL: в 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); SEGMENTS: out std_logic_ve; краен компонент sseg_dec; компонент led_clkDiv е Port (present_state: в STD_LOGIC_VECTOR (3 downto 0); clk: in STD_LOGIC; led_clk: out STD_LOGIC); краен компонент led_clkDiv; сигнал present_state: STD_LOGIC_VECTOR (3 downto 0): = "0000"; сигнал next_state: STD_LOGIC_VECTOR (3 надолу 0): = "0000"; сигнал previous_state: STD_LOGIC_VECTOR (3 downto 0): = "0000"; сигнал Alu_Val: STD_LOGIC_VECTOR (7 надолу 0); сигнал sclk: STD_LOGIC; започнете Alu_Val (7 downto 4) <= "0000"; Alu_Val (3 downto 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) и present_state (1)) xor present_state (2); next_state (3) <= (present_state (0) и present_state (1) и present_state (2)) xor present_state (3); предишно_състояние (0) <= не (настоящо_състояние (0)); предишно_състояние (1) <= настояще_състояние (0) xnor настояще_състояние (1); предишно_състояние (2) <= (настоящо_състояние (0) нито настояще_състояние (1)) xor настояще_състояние (2); предишно_състояние (3) sclk, следващо_състояние => следващо_състояние, предишно_състояние => предишно_състояние, нагоре_възможност => нагоре_възможно, надолу_енактивиране => надолу_настаняване, настоящо_състояние => настояще_състояние); показване: 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 е мястото, където свързваме един от проводниците на LED крушката, а другият проводник води към GROUND

След като настроите всичко това, всичко, което трябва да направите, е да генерирате своя поток от битове (с какъвто и софтуер да използвате, т.е. Vivado), да програмирате дъската си и да бум! Имате си работна дъска.

Забележка: Съпоставянето на щифтове може да се намери в листа с данни Basys 3 тук.

Монтаж

Стъпка 5: Използване на превключвателя за димер

Ако всичко върви добре, трябва да имате напълно функционираща димерна система. За да обобщим, натискането на горния бутон ще увеличи яркостта (чак до 15), а натискането на бутона надолу ще намали яркостта (чак до 0). Надявам се всичко да е наред с отпуснатото ви зрение!

Препоръчано: