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 pin3pin1pin5
secara berurutan ke "001"
, "010"
dan "100"
.
Saat memindai pin3pin1pin5
sebagai "001"
dan jika pin4pin6pin7pin2
ini "0100"
kemudian hanya "9" ditekan. Saya mendeklarasikan dalam VHDL pin4pin6pin7pin2
sebagai input dan pin3pin1pin5
sebagai port output. Ketika saya menekan 6 dan 9 pada saat yang sama pin6
dan pin7
sedang 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, pin2
dan pin4
sedang high
.
Inilah bagian yang sulit. Ketika saya menekan 4 dan 6 pada saat yang sama, saya berharap pin7
akan high
tetapi itu menjadi low
dan 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!
Di bawah, saya tidak mengunggah kode saya ke papan tulis, tidak ada kode yang berjalan. Menghubungkan Pin5
ke 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 Pin3
LED menyala dan Pin7
LED masih menyala, tetapi ketika kode saya berjalan ini tidak terjadi. Mungkin saya menghubungkan sesuatu yang salah dan untungnya Pin7
aktif, saya tidak tahu ...
Di bawah ini adalah skema papan keypad:
sumber
Jawaban:
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
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 :
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.
sumber
pin4pin6pin7pin2 = "0000"
tidak ada penekanan tombol sebenarnya1111
. Dalam pertanyaan saya 1s harus 0, 0s seharusnya 1s, saya mencoba sedikit crypt pertanyaan, maaf untuk itu jika itu menyebabkan kesalahpahaman ...out <= 'pin3' when din='1' else '0';
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:
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:
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.
sumber
async_in
adalah tertunda dengan 3 siklus clock tetapi nilainya dan semuanya sama?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:
sumber