Menekan baris tombol yang sama secara bersamaan


9

Saya merancang tombol di VHDL. Semuanya berfungsi dengan baik ketika hanya satu tombol yang ditekan. Saya memindai setiap kolom untuk menekan tombol di mesin keadaan dan ketika tidak ada tombol yang ditekan, yang merupakan kondisi pin4pin6pin7pin2 = "0000"saya beralih ke keadaan berikutnya untuk memindai kolom berikutnya. Jadi saya mengatur kolom pin3pin1pin5secara berurutan ke "001", "010"dan "100".

Saat memindai pin3pin1pin5sebagai "001"dan jika pin4pin6pin7pin2ini "0100"kemudian hanya "9" ditekan. Saya mendeklarasikan dalam VHDL pin4pin6pin7pin2sebagai input dan pin3pin1pin5sebagai port output. Ketika saya menekan 6 dan 9 pada saat yang sama pin6dan pin7sedang high. Tombol yang ditekan pertama dibaca, yang kedua diabaikan. Ketika saya menekan 3 dan 7 pada saat yang sama, yang pertama ditekan dengan beberapa ms sebelum menang dan tombol pertama dibaca, tombol kedua diabaikan, pin2dan pin4sedang high.

Inilah bagian yang sulit. Ketika saya menekan 4 dan 6 pada saat yang sama, saya berharap pin7akan hightetapi itu menjadi lowdan pin4pin6pin7pin2 = "0000", yang saya tidak mengerti bagaimana dan mengapa. Karena "0000"terdeteksi sebagai tidak ada tombol yang ditekan, mesin negara melompat dari negara ke negara. Sambil memegang 4 dan 6 jika seseorang mendorong dan meninggalkan 4 beberapa kali, itu terdeteksi sebagai 6 ditekan beberapa kali, yang merupakan bug besar . Saya akan senang jika Anda dapat membantu saya men-debug ini!

Hal yang sama terjadi dengan "1" dan "2", sama dengan "7" dan "8" hanya untuk tombol pada baris yang sama. Karena ini adalah proyek yang sedang berjalan saya tidak dapat menempatkan kode VHDL saya online :( Saya akan senang jika Anda dapat memberi saya tips untuk mengatasi ini!

masukkan deskripsi gambar di sini

Di bawah, saya tidak mengunggah kode saya ke papan tulis, tidak ada kode yang berjalan. Menghubungkan Pin5ke ground, satu tekan pada 1,2,4,5,7,8, *, 0 tidak menyalaPin3 LED tetapi jika saya menekan 6 dan kemudian 4 pada saat yang sama Pin3LED menyala dan Pin7LED masih menyala, tetapi ketika kode saya berjalan ini tidak terjadi. Mungkin saya menghubungkan sesuatu yang salah dan untungnya Pin7aktif, saya tidak tahu ...

masukkan deskripsi gambar di sini

Di bawah ini adalah skema papan keypad:

Skema


Bagaimana Anda memastikan bahwa menekan 4 dan 6 pada saat yang sama tidak membuat pin 3 dan 5 bersamaan?
fru1tbat

@ fru1tbat Bisakah Anda menguraikan sedikit lebih banyak? Tanpa mengunggah kode saya ketika papan tidak ada pada, saya menghubungkan pin5 ke tanah, kemudian pin5 LED menyala kemudian saya tekan "6" pin7 LED menyala kemudian saya tekan "4" dan "6" pada saat yang sama saat ini pin3 LED menyala dan pin7 LED masih menyala.
Anarkie

@Tut maksudmu saya harus menggunakan pull-up untuk baris dan pull up untuk kolom? Saya tidak dapat mengubah sirkuit. Juga tidak mengerti banyak dari komentar Anda :(
Anarkie

Agar lebih lengkap, saya akan memberikan jawaban. Akan sangat membantu jika Anda dapat memberikan resistor yang menunjukkan skematis, LED, driver kolom dan setiap inverter atau transistor yang mungkin ada di sirkuit. Apakah 4 baris dan 3 kolom terhubung langsung ke CPLD atau FPGA?
Tut

@Tut Keypad tidak terhubung langsung ke FPGA ada papan lain di antara, untuk menghubungkan berbagai papan ke FPGA dan saya menambahkan skema.
Anarkie

Jawaban:


4

Jawaban singkatnya:

Balikkan logika Anda. Drive baris pilih kolom dengan drain terbuka (atau kolektor terbuka) logika mana kolom yang dipilih ditarik rendah dan kolom yang tidak dipilih mengambang. Saat Anda melihat satu baris, penekanan tombol akan dideteksi oleh '0'. Tombol yang tidak ditekan akan terdeteksi oleh '1'.

Sekarang detailnya:

Seperti yang ditunjukkan EEIngenuity, ketika Anda menekan 2 tombol di baris yang sama, itu menghasilkan hubungan pendek antara kolom yang sesuai. Ini (dan masalah lain yang melibatkan beberapa penekanan tombol) biasanya diatasi dalam matriks keyboard dengan menambahkan dioda secara seri dengan setiap sakelar.

Karena menambahkan dioda bukan merupakan pilihan bagi Anda, Anda perlu mengapung output dari kolom yang tidak aktif Anda pilih untuk menghindari mencoba mengarahkan mereka ke polaritas yang berlawanan saat kolom aktif Anda pilih. Ini dilakukan dengan menggunakan logika saluran terbuka. Jika kolom Anda pilih diikat langsung ke CPLD atau FPGA, Anda harus dapat melakukannya dalam kode VHDL Anda.

Foto dalam pertanyaan Anda menunjukkan bahwa Anda memiliki resistor pull-up di setiap kolom dan setiap baris. Pull-up pada kolom tidak perlu, tetapi tidak akan melukai apa pun. Pull-up di setiap baris akan memastikan kondisi tinggi kecuali ditarik rendah oleh driver drain terbuka pada kolom yang dipilih (melalui saklar tertutup).

Saya harus membuat beberapa asumsi tentang rangkaian Anda karena Anda belum menyediakan skema lengkap atau kode VHDL Anda. Kamu bilang

ketika tidak ada tombol yang ditekan, yang merupakan kondisi pin4pin6pin7pin2 = "0000"

namun dari foto yang Anda berikan, resistor pull-up ditampilkan. Ini menyiratkan bahwa Anda sudah memiliki inversi logika di suatu tempat, mungkin dalam kode VHDL Anda atau (kurang mungkin) inverter antara baris Anda dan perangkat logika Anda (CPLD atau FPGA).

Edit:

Per komentar Anda, Anda menggunakan logika negatif dalam deskripsi Anda: "0000" menunjukkan keempat pin tinggi, dll. Karena itu, dengan asumsi kolom memilih dan sinyal baris langsung dari konektor 2 pada skema Anda ke FPGA, cukup ikuti petunjuk saya di atas dengan menggunakan logika saluran terbuka untuk output pilih kolom di FPGA Anda.

Saya bukan ahli VHDL, tetapi saya menemukan ini dari Xilinx :

Berikan buffer drain terbuka dengan menggunakan kode berikut:

VHDL:

dout <= 'Z' ketika din = '1' lain '0';

Perhatikan juga dalam skema Anda, semua LED ditampilkan dengan kabel terbalik. Anoda pergi ke resistor pembatas arus dan katoda pergi ke garis sinyal. Lampu LED ketika garis sinyal ditarik rendah.


Saya akan memindai skema menginstal driver pemindai
Anarkie

Anda benar tentang pin4pin6pin7pin2 = "0000"tidak ada penekanan tombol sebenarnya 1111. Dalam pertanyaan saya 1s harus 0, 0s seharusnya 1s, saya mencoba sedikit crypt pertanyaan, maaf untuk itu jika itu menyebabkan kesalahpahaman ...
Anarkie

Saya menambahkan skema.
Anarkie

terima kasih banyak untuk penjelasan Anda, setelah membaca jawaban Anda, saya punya beberapa ide tapi pertama-tama apa yang Anda maksud dengan "kolom mengambang", "perlu mengapung output", dengan mengapung maksud Anda: 110, 101, 011? Ini sudah saya lakukan, sebenarnya dalam kode saya ketika tombol ditekan semua tombol lain harus diabaikan Saya hanya tidak mengerti bagaimana LED mati dan pin7 menjadi tinggi (1), ketika kode sedang berjalan. Pokoknya jika saya mengerti benar adalah solusi Anda menyarankan saat saya memindai pin5, port keluaran "110", saya harus out <= 'pin3' when din='1' else '0';
Anarkie

1
Lihatlah tautan yang saya berikan: saluran terbuka (atau kolektor terbuka) . Kolom aktif dipilih dengan menggerakkan 0V pada baris kolom itu. Kolom-kolom yang tidak aktif TIDAK boleh digerakkan dengan 3.3V pada jalur itu, tetapi perlu diapungkan (dimasukkan ke dalam keadaan impedansi tinggi) yang secara efektif memutus saluran-saluran tersebut dari rangkaian. Jika Anda mencoba mengendarainya ke 3.3V, korsleting yang dibuat dengan menekan 2 tombol pada baris yang sama secara bersamaan, akan menyebabkan pertengkaran antara yang mencoba drive rendah dan yang lain mencoba drive tinggi.
Tut

2

Karena Anda menggunakan VHDL dan Anda memiliki input yang tidak sinkron, saya menulis jawaban ini untuk memastikan Anda mengambil tindakan pencegahan. Saya tidak yakin apakah ini masalah Anda, tetapi bisa saja.

Lihat pertanyaan yang saya ajukan beberapa waktu lalu: VHDL: menerima modul gagal secara acak saat menghitung bit

Sekarang, Anda mengatakan itu:

Karena "0000" terdeteksi sebagai tombol tidak ditekan, mesin negara melompat dari negara ke negara. Sambil memegang 4 dan 6 jika seseorang mendorong dan meninggalkan 4 beberapa kali, itu terdeteksi sebagai 6 ditekan beberapa kali, yang merupakan bug besar.

Yang agak mirip dengan apa yang saya hadapi. Saya memiliki masalah di mana mesin negara saya akan melewati negara, yang tampaknya mustahil.

Jika Anda membaca jawaban untuk pertanyaan yang ditautkan di atas, Anda akan melihat bahwa disarankan untuk menambahkan sinkronisasi ke baris input sebelum dimasukkan ke mesin negara Anda. Ini biasanya dilakukan dengan dua D Flip Flops secara seri:

masukkan deskripsi gambar di sini

Tidak memiliki input tombol Anda disinkronkan dengan HW Anda menyebabkan masalah yang sangat aneh, yang saya alami dengan proyek N64 saya. Menambahkan sedikit HW ini hampir seperti sulap.

Jadi, harap periksa dulu bahwa input Anda sedang disinkronkan.


Untuk mengimplementasikan Synchronizer pada jawabannya sepertinya tidak sulit, tetapi ketika saya membaca prosesnya, apa yang saya pahami async_inadalah tertunda dengan 3 siklus clock tetapi nilainya dan semuanya sama?
Anarkie

Perbedaan besar adalah bahwa sinyal Anda akan dikonversi dari asinkron ke sinkron. Apa yang terjadi di HW kadang-kadang dengan sinyal asinkron (seperti tombol Anda) adalah bahwa bit berada di "meta-stabilitas", ini menyebabkan kesalahan yang sangat aneh di HW. Menggunakan D Flip Flops memastikan bahwa stabilitas meta tidak terjadi dalam desain Anda. Saya juga skeptis dengan efektivitas ini, tetapi itu menyelesaikan masalah saya dengan sempurna.
Nick Williams

Saya mencobanya, patut dicoba tetapi tidak membantu :(
Anarkie

1

Ini pertanyaan yang menarik! Alasan Anda melihat rendah pada pin7 ketika Anda menekan key4 dan key6 adalah karena pin3 dan pin5.

Untuk menjelaskan lebih lanjut, pin3 dan pin5 tidak akan pernah tinggi pada saat yang sama - salah satunya akan menjadi jalan ke tanah (sesuai dengan desain Anda). Jadi, ketika Anda menekan tombol 4 dan tombol 6, Anda membuat jalur ke ground untuk pin7.

Lihat gambar:

Pin 7 melihat jalur ke ground.  Anda mengalami korsleting.


Saya menambahkan gambar ke pertanyaan saya dan pin7 terlihat masih tinggi ketika kedua tombol ditekan.
Anarkie

OP menjelaskan bahwa ia tidak menaikkan pin 3, 1 atau 5 TINGGI pada saat yang sama setiap saat. Dia mengurutkan kolom dengan: "001", "010", dan "100. Pin 3 dan 5 tidak pernah TINGGI secara bersamaan untuk memulai.
Nick Williams

1
Itulah poin yang coba dibuat @EEIngenuity - ada jalur yang jelas antara pin 3 dan 5, yang tidak akan pernah memiliki nilai yang sama, "jadi, ketika Anda menekan tombol 4 dan kunci 6, Anda membuat jalur ke ground untuk pin7. "
fru1tbat

1
@Anarkie Pada gambar Pin3 tidak terhubung ke GND atau VDD. Ini adalah simpul mengambang. Ini tidak membuat skenario hubungan pendek yang Anda miliki dalam uji coba awal. Coba sambungkan pin 3 ke VDD dan Pin5 ke GND dan ulangi tes ini.
Miron V

1
@ EIngenuity Anda benar sekali !!! Ya, ya ketika saya menghubungkan pin3 ke VDD, pin7 menjadi rendah !!! Jadi tolong bantu saya bagaimana saya bisa mengatasi masalah ini dan membuatnya bekerja :( Saya menggunakan VHDL dan juga kolega lain yang berada di proyek yang sama di tim yang berbeda, tidak menghadapi masalah ini jadi entah bagaimana dia menyelesaikannya tetapi saya tidak tahu caranya, tombol yang sama, papan yang sama!
Anarkie
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.