Aynı tuş satırlarına aynı anda basma


9

VHDL'de bir tuş takımı tasarlıyorum. Yalnızca tek bir tuşa basıldığında her şey yolunda gider. Her sütunu bir durum makinesinde bir tuşa basmak için tarıyorum ve hiçbir tuşa basılmadığında, pin4pin6pin7pin2 = "0000"sonraki sütunu taramak için bir sonraki duruma geçmem şartıdır . Böylece sütun ayarlamak pin3pin1pin5sıralı olarak "001", "010"ve "100".

Tararken pin3pin1pin5olarak "001"ve eğer pin4pin6pin7pin2olduğunu "0100"sadece o "9" basılır. VHDL'de pin4pin6pin7pin2giriş ve pin3pin1pin5çıkış portları olarak beyan ederim . Aynı anda 6 ve 9 bastığınızda pin6ve pin7vardır high. İlk basılan tuş okunur, ikincisi yok sayılır. Aynı anda 3 ve 7 bastığınızda, ilk galibiyet önce birkaç ms ile preslenmiş ve ilk anahtar ikinci anahtar yok sayılır, okumak, bir pin2ve pin4vardır high.

İşte zor kısmı. Aynı anda 4 ve 6 bastığınızda, beklediğim pin7olmak highama olur lowve pin4pin6pin7pin2 = "0000"nasıl ve neden anlamıyorum, hangi. Çünkü "0000"bir herhangi bir tuşa basıldığında olarak tespit edilir, durum makinesi durumundan durumuna geçer. Biri 4'ü birkaç kez itip bırakırsa, 4 ve 6'yı basılı tutarken, birkaç kez 6 kez basıldığı algılanır, bu büyük bir hatadır . Bu hata ayıklama bana yardımcı olabilir sevinirim!

Aynı şey "1" ve "2" ile aynıdır, "7" ve "8" ile aynı satırdaki tuşlar için de geçerlidir. Bu devam eden bir proje olduğu için VHDL kodumu çevrimiçi olarak koyamam :( Bana bunun üstesinden gelmek için ipuçları verebilirseniz sevinirim!

resim açıklamasını buraya girin

Aşağıda, kodumu panoya yüklemiyorum, hiçbir kod çalışmıyor. Bağlama Pin51,2,4,5,7,8 zemine sağlam bir şekilde, tek bir basın *, 0 dönün gelmez Pin3Im sonra aynı anda 6 ve 4 basılarak değil, eğer LED Pin3ışığı yanıyor ve Pin7LED hala ama kodum çalışırken bu gerçekleşmez. Belki yanlış bir şey bağladım ve neyse ki Pin7açık, bilmiyorum ...

resim açıklamasını buraya girin

Tuş takımı panosunun şemaları aşağıdadır:

Şemalar


4 ve 6 tuşlarına aynı anda basmanın 3 ve 5 numaralı pinleri birlikte kısaltmamasını nasıl sağlıyorsunuz?
fru1tbat

@ fru1tbat Biraz daha fazla ayrıntı verebilir misiniz? Kartta hiçbir şey olmadığında kodumu yüklemeden, pin5'i yere bağlarım, sonra pin5 LED'i yanar, sonra "6" pin7 LED'i yanar sonra daha sonra "4" ve "6" tuşlarına basarım LED yanıyor ve pin7 LED hala yanıyor.
Anarkie

@Ama sıralar için pull-up kullanmalı ve sütunlar için pull-up kullanmalıyım? Devreyi değiştiremiyorum. Ayrıca yorumunuzdan fazla anlamadım :(
Anarkie

Daha eksiksiz olmak için bir cevap vereceğim. Dirençleri, LED'leri, sütun sürücülerini ve devrede olabilecek herhangi bir eviriciyi veya transistörü gösteren bir şematik sağlayabilirseniz yardımcı olacaktır. 4 sıra ve 3 sütun doğrudan bir CPLD veya FPGA'ya bağlı mı?
Tut

@ Tuş Tuş takımı doğrudan FPGA'ya bağlı değil Aralarında başka bir kart var, çeşitli panoları FPGA'ya bağlamak için şemaları ekledim.
Anarkie

Yanıtlar:


4

Kısa cevap:

Mantıklarınızı ters çevirin. Seçilen sütunun aşağı çekildiği ve seçili olmayan sütunların yüzdüğü açık drenaj (veya açık toplayıcı) mantığına sahip sütun seçme çizgilerini sürün . Bir satıra baktığınızda, bir tuşa basma '0' ile algılanacaktır. Basılmamış tuşlar bir '1' ile algılanacaktır.

Şimdi detaylar:

EEIngenuity'nin işaret ettiği gibi, aynı satırda 2 düğmeye bastığınızda, karşılık gelen sütunları arasında kısa devreye neden olur. Bu (ve birden fazla tuşa basmayı içeren diğer problemler) genellikle her bir anahtarla seri olarak bir diyot eklenerek klavye matrisinde giderilir .

Diyot eklemek sizin için bir seçenek olmadığından, aktif sütun seçiminiz olarak onları ters polariteye sürmeye çalışmaktan kaçınmak için aktif olmayan sütun seçimlerinizin çıkışlarını kaydırmanız gerekecektir. Bu, açık tahliye mantığı kullanılarak yapılır. Sütun seçimleriniz doğrudan bir CPLD veya FPGA'ya bağlıysa, bunu VHDL kodunuzda yapabilmeniz gerekir.

Sorunuzdaki fotoğraf, her sütun ve her satırda bir çekme direncine sahip olduğunuzu gösterir. Sütunlardaki pull-up'lar gereksizdir, ancak hiçbir şeye zarar vermez. Sütun seçimlerindeki açık-boşaltma sürücüsü tarafından aşağı çekilmedikçe (kapalı bir anahtar aracılığıyla) her sıradaki çekmeler yüksek bir koşul sağlayacaktır.

Tam bir şema veya VHDL kodunuzu sağlamadığınız için devreniz hakkında bazı varsayımlar yapmak zorunda kaldım. Diyorsun

hiçbir tuşa basılmadığında, bu durum pin4pin6pin7pin2 = "0000"

ancak sağladığınız fotoğraftan çekme dirençleri gösterilir. Bu, muhtemelen VHDL kodunuzda veya satırlarınız ile mantık aygıtınız (CPLD veya FPGA) arasında (muhtemelen daha az olası) invertörlerde bir yerde bir mantık tersine çevirmeniz olduğunu gösterir.

Düzenle:

Yorumunuza göre, açıklamalarınızda negatif mantık kullanıyorsunuz: "0000", dört iğnenin de yüksek olduğunu gösterir. Bu durumda, sütun seçimlerinin ve satır sinyallerinin doğrudan şemanızdaki konektör 2'den FPGA'ya gittiğini varsayarsak FPGA'nızdaki sütun seçme çıktıları için açık tahliye mantığı kullanarak yukarıdaki yönergelerimi izleyin.

Ben bir VHDL uzmanı değilim, ama bunu Xilinx'den buldum :

Aşağıdaki kodu kullanarak açık tahliye arabelleğini çıkarım yapın:

VHDL:

din = '1' diğer '0' olduğunda dout <= 'Z';

Ayrıca şemanızda tüm LED'lerin geriye doğru kablolu olarak görüntülendiğini unutmayın. Anotlar akım sınırlayıcı dirençlere ve katotlar sinyal hatlarına gider. Sinyal hatları aşağı çekildiğinde LED yanar.


Tarayıcı sürücüsünü yükleyen şemaları taramak üzereyim
Anarkie

pin4pin6pin7pin2 = "0000"Aslında hiçbir tuşa basma konusunda haklısınız 1111. Sorumda 1s 0, 0s 1s olmalı, soruyu biraz şifrelemeye çalıştım, yanlış anlamalara neden olursa bunun için üzgünüm ...
Anarkie

Şemaları ekledim.
Anarkie

açıklamalarınız için çok teşekkürler, cevabınızı okuduktan sonra bazı fikirlerim var ama önce "sütunlar yüzer", "çıktıları yüzdürmek gerekir" ile ne demek istiyorsun, şamandıra ile mi demek istediniz: 110, 101, 011? Bu zaten bir tuşa basıldığında aslında benim kodunda yapıyorum diğer tüm tuşlar göz ardı edilmelidir Sadece kod çalışırken LED kapanır ve pin7 yüksek (1), nasıl olur anlamıyorum. Her neyse, eğer doğru anladıysam, ben çözüm pin5, çıkış bağlantı noktaları "110", ben olmalıdır gerekirout <= 'pin3' when din='1' else '0';
Anarkie

1
Sağladığım bağlantıya bakın: açık tahliye (veya açık kollektör) . Etkin sütun, o sütun satırında 0V sürülerek seçilir. Aktif olmayan kolonlar bu hat üzerinde 3.3V ile çalıştırılmamalıdır, ancak bu hatların devreden etkili bir şekilde bağlantısını kesen yüzdürülmelidir (yüksek empedans durumuna getirilmelidir). Bunları 3.3V'a sürmeye çalışırsanız, aynı sıradaki aynı anda 2 düğmeye basılarak oluşturulan kısa devre, biri düşük hızda çalışmayı diğer yüksek hızda çalışmayı dener.
Tut

2

VHDL kullandığınız ve eşzamansız bir girişiniz olduğundan, önlem aldığınızdan emin olmak için bu yanıtı yazıyorum. Sorunun bu olup olmadığından emin değilim ama çok iyi olabilir.

Bir süre önce sorduğum bir soruya bakın: VHDL: bitleri sayarken alma modülü rastgele başarısız oluyor

Şimdi şunu söylüyorsun:

"0000" herhangi bir tuşa basılmadığından algılandığından, durum makinesi durumdan duruma atlar. Biri 4'ü birkaç kez itip bırakırsa, 4 ve 6'yı basılı tutarken, birkaç kez 6 kez basıldığı algılanır, bu büyük bir hatadır.

Hangi yüzleştiğime biraz benziyor. Devlet makinemin devletleri atlaması imkansız görünen bir sorunum vardı.

Yukarıda bağlantılı sorunun yanıtlarını okuduysanız, giriş makinenize durum makinenize beslenmeden önce bir senkronize edici eklemeniz önerilir. Bu genellikle seri olarak iki D Flip Flop ile gerçekleştirilir:

resim açıklamasını buraya girin

Düğme girişinizin HW'nizle senkronize edilmemesi, N64 projemle yaşadığım çok tuhaf sorunlara neden oluyor. Bu küçük parçayı eklemek neredeyse sihir gibiydi.

Bu yüzden lütfen önce girişlerinizin senkronize edilip edilmediğini kontrol edin.


Synchronizer'ı cevaba uygulamak zor görünmüyor, ancak süreci okuduğumda, anladığım şey async_in3 saat döngüsüyle gecikmeli ama değeri ve her şey aynı mı?
Anarkie

En büyük fark, sinyalinizin senkronize olmayandan senkronize hale gelmesidir. HW'de bazen asenkron sinyallerle (düğmeleriniz gibi) olan şey, bitlerin "meta-stabilite" de olmasıdır, bu HW'de çok garip hatalara neden olur. D Flip Flop'ların kullanılması, tasarımınızda meta istikrarın oluşmamasını sağlar. Bunun etkinliğinden de şüpheliydim, ancak sorunumu mükemmel bir şekilde çözdü.
Nick Williams

Denedim, denemeye değerdi ama yardım etmedi :(
Anarkie

1

Bu ilginç bir soru! Tuş 4 ve tuş 6'ya bastığınızda pin7'de düşük görmenizin nedeni pin3 ve pin5'ten kaynaklanıyor.

Daha açıklamak gerekirse , pin3 ve pin5 asla aynı anda yüksek olmayacaktır - bunlardan biri her zaman toprağa giden bir yol olacaktır (tasarımınıza göre). Böylece, 4 tuşuna ve 6 tuşuna bastığınızda, pin7 için toprağa giden bir yol oluşturursunuz.

Resme bakın:

Pim 7, toprağa giden bir yol görür.  Kısa devre var.


Soruma bir resim ekledim ve her iki tuşa da basıldığında pin7 yüksek görünüyor.
Anarkie

OP, herhangi bir anda pimi 3, 1 veya 5 YÜKSEK yükseltmediğini açıkladı. Sütunları "001", "010" ve "100" ile sıralar. 3 ve 5 numaralı pimler hiçbir zaman aynı anda YÜKSEK
Nick Williams

1
@EEIngenuity'nin yapmaya çalıştığı nokta budur - 3 ve 5 pinleri arasında hiçbir zaman aynı değere sahip olmayacak belirgin bir yol vardır. "
fru1tbat

1
@Anarkie Resimde Pin3 GND veya VDD'ye bağlı değil. Yüzen bir düğümdür. Bu, özgün denemenizde bulunan kısa devre senaryosunu oluşturmaz. Pin 3'ü VDD'ye ve Pin5'i GND'ye bağlamayı deneyin ve bu testi tekrarlayın.
Miron V

1
@EEIngenuity Kesinlikle haklısın !!! Evet, evet pin3'ü VDD'ye bağladığımda, pin7 azalır !!! Bu yüzden lütfen bu sorunun üstesinden nasıl gelebilirim ve çalışmasını sağlayabilirim :( VHDL'yi ve aynı projede farklı bir ekipte bulunan başka bir meslektaşımı kullanıyorum, bu problemle yüzleşmiyor, bu yüzden bir şekilde çözdü ama bilmiyorum, aynı tuş takımı, aynı tahta!
Anarkie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.