İçindekiler:

Basys 3 Board Kullanan Kısılabilir LED: 5 Adım
Basys 3 Board Kullanan Kısılabilir LED: 5 Adım

Video: Basys 3 Board Kullanan Kısılabilir LED: 5 Adım

Video: Basys 3 Board Kullanan Kısılabilir LED: 5 Adım
Video: Uzaktan Kumanda nasıl çalışır I Rf ve infrared nedir I Devre Şeması #16 2024, Temmuz
Anonim
Basys 3 Board Kullanan Kısılabilir LED
Basys 3 Board Kullanan Kısılabilir LED

Bu kılavuzda harici bir LED karartma sistemi oluşturup kontrol edeceğiz. Mevcut düğmeler ile kullanıcı, LED ampulü istediği parlaklığa kısabilir. Sistem Basys 3 kartını kullanır ve bir direnç ve LED ampul içeren bir devre tahtasına bağlanır. Belirlenen "yukarı" düğmesine basmak parlaklığı artıracak ve "aşağı" düğmesine basmak parlaklığı tamamen sıfıra indirecektir. Bu, kullanıcının güneş gibi parlak ampuller tarafından körlenmesini engellemekle kalmaz, aynı zamanda enerji tasarrufu da sağlar!

Adım 1: Giriş Sayacı Oluşturun

Bu adım için iki anahtar kullanarak (bir saat aracılığıyla) parlaklık seviyesini belirleyen bileşeni oluşturuyoruz: biri artırmak ve diğeri azaltmak için. VHDL kullanarak sayacı D parmak arası terlik kullanarak ürettik. "Yukarı" düğmesine basılması, sonraki durumu mevcut duruma iterek yedi segmentli ekrana ve LED ampule çıktı verir.

varlık updown_counter

Port (present_state: out STD_LOGIC_VECTOR (3'ten 0'a); önceki_state: STD_LOGIC_VECTOR'da (3'ten 0'a); next_state: STD_LOGIC_VECTOR'da (3'ten 0'a); clk: STD_LOGIC'de; down_enable: STD_LOGIC'de; up_enable: STD_'de updown_counter'ı sonlandır; mimari updown_counter'ın davranışı startup flop: process(next_state, clk, up_enable, down_enable, önceki_state) başlarsa (rising_edge(clk)) sonra if (up_enable = '1' and not(next_state="0000")) sonra present_state <= sonraki_durum; elsif (down_enable = '1' ve not(previous_state= "1111")) sonra present_state <= önceki_state; eğer son; eğer son; süreç flopunu sonlandır; son Davranış;

Ayrıca her girişin (yükseldiğinde) mandallanması için bir saate ihtiyacımız var, bu nedenle her parlaklık seviyesi arasında düğmelere ne kadar hızlı basılabileceğini belirleyen bir saat bölücü de oluşturduk. Bu saat bölücü, yedi segmentli ekranda doğru seviyeyi düzgün bir şekilde görüntülememizi ve her seviye için doğru yoğunluk seviyesini üretmemizi sağlar.

varlık counter_clkDiv

Bağlantı noktası (clk: std_logic içinde; sclk: std_logic dışında); counter_clkDiv'i sonlandır; counter_clkDiv'in my_clk_div mimarisi sabittir max_count: tamsayı:= (10000000); sinyal tmp_clk: std_logic:= '0'; my_div'e başla: süreç (clk, tmp_clk) değişken div_cnt: tamsayı:= 0; başlar if (rising_edge(clk)) sonra if (div_cnt >= MAX_COUNT) o zaman tmp_clk <= tmp_clk değil; div_cnt:= 0; başka div_cnt:= div_cnt + 1; eğer son; eğer son; sclk <= tmp_clk; işlemi sonlandır my_div; my_clk_div'i sonlandır;

Adım 2: LED Saat Bölücü Oluşturun

Bu adım için LED ampulün 16 farklı yoğunluk seviyesini belirlemesi için bir saat bölücü oluşturuyoruz. 0, maksimum parlaklığı gösteren 15'e kapalıyken, saat bölücü her düğmeye basıldığında parlaklık seviyeleri olarak ayarladığımız şeyi artırır. Artan her seviye, LED ampulün saatinde bir artış anlamına geliyordu. Parlaklığın lineer olarak artmadığını hatırlayarak saati gidebileceği en yüksek seviyeye getirdik ve saatlerimizi buna göre azalttık.

Not: mavi bir LED kullanıyoruz. Farklı bir renk (kırmızı gibi) kullanmak, tamamen farklı saatler gerektirecektir; mavi için orta parlaklık ayarı zaten kırmızı için maksimum parlaklık olabilir. Bunun nedeni, farklı dalga boylarındaki ışığın farklı miktarlarda enerji gerektirmesi, mor ve mavi gibi daha soğuk renkler daha fazla enerji, kırmızı ve turuncu gibi daha sıcak renkler ise daha az enerji gerektirmesidir.

varlık led_clkDiv Bağlantı Noktasıdır (present_state: STD_LOGIC_VECTOR'da (3'ten 0'a); clk: STD_LOGIC'de; led_clk: STD_LOGIC çıkışında); led_clkDiv'i sonlandır; mimari led_clkDiv'in davranışı sinyaldir tmp_clk: std_logic:= '0'; paylaşılan değişken max_count: tamsayı;başla say_stuff: process (present_state) start case present_state "0000" => max_count:= 0 olduğunda; "0001" => max_count:= 2; ne zaman "0010" => max_count:= 4; ne zaman "0011" => max_count:= 6; ne zaman "0100" => max_count:= 8; ne zaman "0101" => max_count:= 10; ne zaman "0110" => max_count:= 12; ne zaman "0111" => max_count:= 14; ne zaman "1000" => max_count:= 16; "1001" => max_count:= 25 olduğunda; "1010" => max_count:= 50 olduğunda; ne zaman "1011" => max_count:= 100; ne zaman "1100" => max_count:= 150; ne zaman "1101" => max_count:= 200; ne zaman "1110" => max_count:= 250; "1111" => max_count:= 300 olduğunda; son durum; işlemi sonlandır say_stuff; my_div: süreç (clk, tmp_clk, present_state) değişkeni div_cnt: tamsayı:= 0; başlar if (rising_edge(clk)) sonra if (div_cnt >= max_count) o zaman tmp_clk <= tmp_clk değil; div_cnt:= 0; başka div_cnt:= div_cnt + 1; eğer son; eğer son; led_clk <= tmp_clk; işlemi sonlandır my_div; son Davranış;

Adım 3: LED Denetleyicisini Oluşturma

Buraya kadar geldiğimize göre, şu ana kadar oluşturduğumuz tüm bileşenleri nihayet LED Controller dosyasında birleştirmenin zamanı geldi.

Özetlemek gerekirse, kullanılan bileşenler şunlardır:

  • Giriş sayacı (updown_counter)
  • Saat bölücü (counter_clkDiv)
  • LED saat bölücü (led_clkDiv)
  • Yedi segmentli ekran sürücüsü (sseg_dec) (ekli dosya)

Yedi segmentli ekran sürücüsü aslında daha önce tartışılmadı çünkü uzun ve karmaşık kodu nedeniyle VHDL dosyasını Dr. Bryan Mealy'den ödünç aldık. Esasen yaptığı şey, düğme girişlerimizi Basys 3 kartındaki yedi segmentli ekrana yönlendirerek hangi parlaklık seviyesinde olduğunu bilmemizdir.

İleriye dönük olarak, LED Kontrol Cihazı, hem yedi segmentli ekranı hem de LED ampulün parlaklık seviyesini aynı anda kontrol eden sayımı artırmak veya azaltmak için parmak arası terlik kullanır.

varlık sayacı Port'tur (clk: STD_LOGIC'de; up_enable: STD_LOGIC'de; down_enable: STD_LOGIC'de; SEGMENTS: out STD_LOGIC_VECTOR (7'den 0'a); DISP_EN: çıkış STD_LOGIC_VECTOR (3'ten 0'a); led_clk: çıkış STD_ bitiş sayacı; mimarisi Sayacın davranışı, updown_counter bileşenidir Port (present_state: out STD_LOGIC_VECTOR (3'ten 0'a); önceki_state: STD_LOGIC_VECTOR'da (3'ten 0'a); next_state: STD_LOGIC_VECTOR'da (3'ten 0'a); clk: STD_LOGIC'de; down_enable: STD'de up_enable: STD_LOGIC'de); bitiş bileşeni updown_counter; counter_clkDiv bileşeni Bağlantı Noktasıdır (clk: std_logic içinde; sclk: std_logic dışında); son bileşen counter_clkDiv; sseg_dec bileşeni Bağlantı Noktasıdır (ALU_VAL: std_logic_vector'da(7'den 0'a); İŞARET: std_logic'te; GEÇERLİ: std_logic'te; CLK: std_logic'te; DISP_EN: out std_logic_vector(3 std_logic_vector(3'ten 0'a: 0'a));; bitiş bileşeni sseg_dec; led_clkDiv bileşeni Bağlantı Noktasıdır (present_state: STD_LOGIC_VECTOR'da (3'ten 0'a); clk: STD_LOGIC'de; led_clk: STD_LOGIC çıkışında); bitiş bileşeni led_clkDiv; sinyal mevcut_durumu: STD_LOGIC_VECTOR (3'ten 0'a kadar):= "0000"; sinyal next_state: STD_LOGIC_VECTOR (3'ten 0'a kadar):= "0000"; sinyal önceki_durum: STD_LOGIC_VECTOR (3'ten 0'a kadar):= "0000"; sinyal Alu_Val: STD_LOGIC_VECTOR (7'den 0'a kadar); sinyal sclk: STD_LOGIC; Alu_Val(7'den 4'e kadar) <= "0000"; Alu_Val(3'ten 0)'a <= mevcut_durum; next_state(0) <= not(present_state(0)); next_state(1) <= present_state(0) xor present_state(1); next_state(2) <= (present_state(0) ve present_state(1)) xor present_state(2); next_state(3) <= (present_state(0) ve present_state(1) ve present_state(2)) xor present_state(3); önceki_durum(0) <= değil(şimdiki_durum(0)); önceki_durum(1) <= mevcut_durum(0) xnor mevcut_durum(1); Previous_state(2) <= (present_state(0) veya present_state(1)) xor present_state(2); önceki_durum(3) sclk, sonraki_durum => sonraki_durum, once_durum => onceki_durum, up_enable => up_enable, down_enable => down_enable, present_state => present_state); display: sseg_dec port haritası(ALU_VAL => Alu_Val, SIGN => '0', VALID => '1', CLK => clk, DISP_EN => DISP_EN, SEGMENTS => SEGMENTS); led_div: led_clkDiv bağlantı noktası haritası(clk => clk, present_state => present_state, led_clk => led_clk); clk_div: counter_clkDiv bağlantı noktası haritası(clk => clk, sclk => sclk); son Davranış;

Adım 4: Kısıtlamalar ve Montaj Oluşturma

kısıtlamalar

Basys 3 kartını düzgün bir şekilde kurmak ve programlamak için öncelikle bu adıma ekli olan kısıtlama dosyamızı kurmalıyız. Aşağıdaki ayarlar düzenlendi:

Düğmeler

  • T18, "up_enable" olarak değiştirildi (parlaklığı artırın)
  • U17, "down_enable" olarak değiştirildi (parlaklığı azalt)

7 segmentli ekran

  • W7, W6, U8, V8, U5, V5, U7, V7 bir ekranın her bir bölümünü temsil eder
  • U2, U4, V4, W4, görüntülenen her anodu temsil eder (en yüksek sayımız 15 olduğundan yalnızca 2 tanesi aktiftir)

PMOD Başlık JC

JC7, LED ampulün tellerinden birini ve diğer teli GROUND'a bağladığımız yerdir

Tüm bunları ayarladıktan sonra, tek yapmanız gereken bit akışınızı oluşturmak (yani Vivado gibi hangi yazılımı kullanırsanız kullanın), kartınızı programlamak ve patlama! Kendine bir çalışma tahtası aldın.

Not: Pin eşleştirmesi burada Basys 3 Veri Sayfasında bulunabilir.

toplantı

Adım 5: Dimmer Anahtarınızı Kullanma

Her şey yolunda giderse, tamamen işleyen bir dimmer sistemine sahip olmalısınız. Özetlemek gerekirse, üst düğmeye basmak parlaklığınızı artıracaktır (tamamen 15'e kadar), aşağı düğmesine basmak ise parlaklığınızı azaltacaktır (0'a kadar). Umarım artık rahatlamış olan görme yeteneğiniz için her şey yolunda gider!

Önerilen: