Mündəricat:

Basys 3 lövhəsini istifadə edərək sönən LED: 5 addım
Basys 3 lövhəsini istifadə edərək sönən LED: 5 addım

Video: Basys 3 lövhəsini istifadə edərək sönən LED: 5 addım

Video: Basys 3 lövhəsini istifadə edərək sönən LED: 5 addım
Video: Gledopto GL-C-103P - Ünvanlı LED lampalar üçün Zigbee nəzarətçisi, ilk tanışlıq 2024, Iyul
Anonim
Basys 3 lövhəsini istifadə edərək dimed LED
Basys 3 lövhəsini istifadə edərək dimed LED

Bu təlimatda xarici bir LED karartma sistemi quracaq və idarə edəcəyik. Mövcud düymələrlə istifadəçi LED ampulünü istənilən parlaqlığa endirə bilər. Sistem Basys 3 lövhəsini istifadə edir və bir rezistor və LED ampulü olan bir çörək taxtasına qoşulur. Təyin olunmuş "yuxarı" düyməsinə basmaq parlaqlığı artıracaq və "aşağı" düyməsini basmaq parlaqlığı sıfıra qədər azaldacaq. Bu, istifadəçinin günəş kimi parlaq ampullər tərəfindən kor olmasını qarşısını almaqla yanaşı, həm də enerjiyə qənaət edir!

Addım 1: Giriş Sayğacı yaradın

Bu addım üçün iki açar istifadə edərək parlaqlıq səviyyəsini (bir saat vasitəsilə) təyin edən bir komponent yaradırıq: biri artırmaq üçün, biri də azaltmaq üçün. VHDL istifadə edərək, sayğacı D flip-flopları istifadə edərək istehsal etdik. "Yuxarı" düyməsinə basaraq yeddi seqmentli ekrana və LED ampulə çıxaraq növbəti vəziyyəti indiki vəziyyətə keçir.

var updown_counter

Liman (indiki vəziyyət: STD_LOGIC_VECTOR (3 aşağı 0); əvvəlki_stat: STD_LOGIC_VECTOR -da (3 aşağı 0); next_state: STD_LOGIC_VECTOR -da (3 aşağı 0); clk: STD_LOGIC -də; aşağı_enable: STD_LOGIC -də; updown_counter -ı bitir; memarlıq updown_counter -ın davranışı başlayır flop: proses (next_state, clk, up_enable, down_enable, previous_state) if if (Yüksələn_kiymət (clk)), sonra (up_enable = '1' deyil, (next_state = "0000")) sonra present_state <= next_state; elsif (down_enable = '1' deyil, (əvvəlki_stat = "1111")) sonra present_state <= əvvəlki_stat; bitərsə; bitərsə; prosesin sona çatması; Davranışa son qoymaq;

Hər bir girişin bağlanması üçün bir saata ehtiyacımız var (qalxanda), buna görə də hər bir parlaqlıq səviyyəsi arasında düymələrin nə qədər tez basıla biləcəyini təyin edən bir saat bölücü yaratdıq. Bu saat bölücü, yeddi seqmentli ekranda düzgün səviyyəni düzgün şəkildə göstərməyimizə və hər səviyyə üçün doğru intensivlik səviyyəsini çıxarmağımıza imkan verir.

counter_clkDiv varlığıdır

Port (clk: std_logic; sclk: out std_logic); counter_clkDiv bitirin; counter_clkDiv -in my_clk_div memarlığı sabitdir max_count: integer: = (10000000); siqnal tmp_clk: std_logic: = '0'; my_div başlamaq: proses (clk, tmp_clk) dəyişən div_cnt: integer: = 0; əgər başlasa (yüksələn_qıraq (clk)) sonra, əgər (div_cnt> = MAX_COUNT) onda tmp_clk <= tmp_clk deyil; div_cnt: = 0; başqa div_cnt: = div_cnt + 1; bitərsə; bitərsə; sclk <= tmp_clk; my_div prosesini bitir; my_clk_div -i bitir;

Addım 2: LED Saat Bölücü yaradın

Bu addım üçün, 16 fərqli intensivlik səviyyəsini təyin etmək üçün LED ampul üçün bir saat bölücü yaradırıq. Maksimum parlaqlığı göstərən 0 -dan 15 -ə qədər olan saat bölücü, hər bir düyməni basaraq parlaqlıq səviyyəsi olaraq təyin etdiyimiz qədər artırır. Hər bir artan səviyyə LED ampul üçün saatın artması demək idi. Parlaqlığın xətti olaraq artmadığını xatırlayaraq saatı ən yüksək səviyyəyə qaldırdıq və saatlarımızı buna uyğun olaraq azaltdıq.

Qeyd: mavi LED istifadə edirik. Fərqli bir rəng (qırmızı kimi) istifadə etmək üçün ümumiyyətlə bir az fərqli saatlar tələb olunacaq; mavi üçün orta parlaqlıq ayarı artıq qırmızı üçün maksimum parlaqlıq ola bilər. Bunun səbəbi, fərqli dalğa uzunluqlu işığın fərqli miqdarda enerji tələb etməsi, bənövşəyi və mavi kimi soyuq rənglərin daha çox enerji, qırmızı və narıncı kimi daha isti rənglərin isə daha az enerji tələb etməsidir.

varlıq led_clkDiv Limandır (indiki_stat: STD_LOGIC_VECTOR -da (3 aşağıya 0); clk: STD_LOGIC -də; led_clk: STD_LOGIC xaricində); led_clkDiv bitir; memarlıq led_clkDiv davranışı siqnaldır tmp_clk: std_logic: = '0'; paylaşılan dəyişən max_count: integer; begin count_stuff: process (present_state) start case present_state, "0000" => max_count: = 0; zaman "0001" => max_count: = 2; zaman "0010" => max_count: = 4; zaman "0011" => max_count: = 6; zaman "0100" => max_count: = 8; zaman "0101" => max_count: = 10; zaman "0110" => max_count: = 12; zaman "0111" => max_count: = 14; zaman "1000" => max_count: = 16; zaman "1001" => max_count: = 25; zaman "1010" => max_count: = 50; zaman "1011" => max_count: = 100; zaman "1100" => max_count: = 150; zaman "1101" => max_count: = 200; zaman "1110" => max_count: = 250; zaman "1111" => max_count: = 300; son hal; prosesin sonunu saymaq_stuff; my_div: proses (clk, tmp_clk, present_state) dəyişən div_cnt: integer: = 0; əgər başlasa (yüksələn_qıraq (clk)) sonra əgər (div_cnt> = max_count) onda tmp_clk <= tmp_clk deyil; div_cnt: = 0; başqa div_cnt: = div_cnt + 1; bitərsə; bitərsə; led_clk <= tmp_clk; my_div prosesini bitir; Davranışa son qoymaq;

Addım 3: LED nəzarətçisinin yaradılması

İndiyə qədər bu yolu keçdik, nəhayət indiyə qədər yaratdığımız bütün komponentləri LED Controller faylına birləşdirməyin vaxtı gəldi.

Ümumiləşdirmək üçün istifadə olunan komponentlər aşağıdakılardır:

  • Giriş sayğacı (updown_counter)
  • Saat bölücü (counter_clkDiv)
  • LED saat bölücü (led_clkDiv)
  • Yeddi seqmentli ekran sürücüsü (sseg_dec) (əlavə edilmiş fayl)

Yeddi seqmentli ekran sürücüsü əslində əvvəllər müzakirə edilmirdi, çünki VHDL faylını uzun və mürəkkəb koduna görə Dr. Bryan Mealy-dən götürmüşük. Əslində etdiyi şey, düymələrimizi Basys 3 lövhəsindəki yeddi seqmentli ekrana yönəltməkdir ki, hansı səviyyədə parlaqlıq olduğunu bilək.

İrəli irəliləyərkən, LED Controller, həm yeddi seqmentli ekranı, həm də LED ampulün parlaqlıq səviyyəsini idarə edən sayını artırmaq və ya azaltmaq üçün flip floplardan istifadə edir.

varlıq sayacı Portdur (clk: STD_LOGIC -də; up_enable: STD_LOGIC -də; aşağı_enable: STD_LOGIC -də; SEGMENTS: STD_LOGIC_VECTOR (7 aşağı 0); DISP_EN: STD_LOGIC_VECTOR (3 aşağı 0); led_LOG: STD_LOGIC: STD_LOGIC son sayğac; memarlıq Sayğının davranışı komponentdir updown_counter Limandır (indiki_stat: STD_LOGIC_VECTOR (3 aşağı 0); əvvəlki_stat: STD_LOGIC_VECTOR -da (3 aşağı 0); next_state: STD_LOGIC_VECTOR -da (3 aşağı 0); clk: STD_LOGIC -də; STD_LOGIC -də up_enable: STD_LOGIC -də); son komponenti updown_counter; counter_clkDiv komponenti Limandır (clk: in std_logic; sclk: out std_logic); son komponent counter_clkDiv; sseg_dec komponenti Limandır (ALU_VAL: std_logic_vector'da (7 aşağıya doğru 0); İŞARET: std_logic -də; VALID: std_logic -də; CLK: std_logic -də; DISP_EN: std_logic_vector (3 aşağı 0); SEGMENTS: kənarda std_logic 0); son komponent sseg_dec; led_clkDiv komponenti Limandır (indiki_stat: STD_LOGIC_VECTOR -da (3 aşağıya 0); clk: STD_LOGIC -də; led_clk: STD_LOGIC xaricində); son komponent led_clkDiv; siqnal present_state: STD_LOGIC_VECTOR (3 aşağıya 0): = "0000"; next_state siqnalı: STD_LOGIC_VECTOR (3 aşağıya 0): = "0000"; siqnal əvvəlki_stat: STD_LOGIC_VECTOR (3 aşağıya 0): = "0000"; siqnal Alu_Val: STD_LOGIC_VECTOR (7 aşağı 0); siqnal sclk: STD_LOGIC; başlamaq Alu_Val (7 aşağı 4) <= "0000"; Alu_Val (3 aşağı 0) <= indiki vəziyyət; next_state (0) <= yox (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) <= yox (present_state (0)); previous_state (1) <= present_state (0) xnor present_state (1); previous_state (2) <= (present_state (0) nə 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); ekran: sseg_dec liman xəritəsi (ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: led_clkDiv liman xəritəsi (clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv liman xəritəsi (clk => clk, sclk => sclk); Davranışa son qoymaq;

Addım 4: Məhdudiyyətlər və Montaj qurmaq

Məhdudiyyətlər

Basys 3 lövhəsini düzgün qurmaq və proqramlaşdırmaq üçün əvvəlcə bu addıma əlavə edilmiş məhdudiyyətlər faylımızı qurmalıyıq. Aşağıdakı parametrlər düzəldildi:

Düymələr

  • T18 "up_enable" olaraq dəyişdirildi (parlaqlığı artırın)
  • U17 U17 -ni "down_enable" olaraq dəyişdirdi (parlaqlığı azaldın)

7 seqmentli ekran

  • W7, W6, U8, V8, U5, V5, U7, V7 bir ekranın hər seqmentini təmsil edir
  • U2, U4, V4, W4, göstərilən hər bir anodu təmsil edir (ən çox sayımız 15 olduğu üçün yalnız 2 aktivdir)

PMOD Başlığı JC

JC7, LED ampulünün tellərindən birini bağladığımız yerdir, digər tel isə GROUND -a aparır

Bütün bunları qurduqdan sonra, bit axınınızı (Vivadodan istifadə etdiyiniz hər hansı bir proqramla) yaratmaq, lövhənizi proqramlaşdırmaq və bum etmək kifayətdir! Özünüzə bir iş lövhəsi var.

Qeyd: Pin xəritəsini Basys 3 Məlumat Cədvəlində tapa bilərsiniz.

Məclis

Addım 5: Dimmer açarınızı istifadə edin

Hər şey yaxşı olarsa, tam işləyən bir dimmer sisteminiz olmalıdır. Xülasə etmək üçün yuxarı düyməni basmaq parlaqlığınızı artıracaq (15 -ə qədər) və aşağı düyməni basmaq da parlaqlığınızı azaldacaq (0 -a qədər). Ümid edirəm ki, indi rahat olan görmə qabiliyyətiniz üçün hər şey yaxşı olacaq!

Tövsiyə: