Pendahuluan
Kami adalah siswa tahun pertama yang belajar Ilmu Komputer di Innopolis University dan kami ingin berbagi pengalaman kami dalam mengembangkan program Verilog untuk membuat enkoder putar paling keren (paling tidak, paling keras) yang pernah ada di papan FPGA.
Pada artikel ini, Anda akan menemukan kisah luar biasa tentang proyek kami, perangkat keras, perangkat lunak yang kami gunakan, dan beberapa teori latar belakang tentang rotary encoder dan membuat suara di buzzer FPGA. Terakhir, kami akan memberikan tautan ke repositori github tempat pembaca dapat mengakses kode sumber. Kami harap Anda akan menyukai proyek ini dan itu akan menginspirasi Anda untuk membuat sesuatu yang serupa.
Jadi, mari kita mulai!
Hardware dan Software

- Siklon IV FPGA dukungan perangkat untuk Quartus Prime
- Quartus Prime Lite Edition
- Encoder putar dari kit Arduino
- ModelSim * -Intel FPGA (hanya untuk debugging)
Sebuah cerita singkat
Beberapa waktu yang lalu di galaksi yang jauh, sekelompok siswa (kami) memutuskan untuk lebih dekat dengan perangkat keras. Kursus Arsitektur Komputer memberi kami peluang besar untuk membuat proyek di papan FPGA. Setelah beberapa diskusi, kami memilih untuk menerapkan sistem dengan rotary encoder. Kami menyelesaikan tugas itu tetapi itu tidak cukup untuk memuaskan keinginan kami, jadi kami memutuskan untuk meningkatkan proyek kami dengan mengubahnya menjadi alat musik menggunakan keyboard dan bel papan untuk memainkan catatan yang berbeda. Namun, ternyata port PS / 2 FPGA sudah mati.
Akhirnya, kita berakhir dengan menulis melodi sederhana yang dimainkan ketika tombol ditekan.
Kotak musik
Kita dapat membedakan satu nada dari yang lain dengan frekuensi gelombang suaranya. Oleh karena itu, untuk membuat bel memainkan not yang berbeda kita perlu membuatnya menghasilkan gelombang suara dengan frekuensi yang berbeda.
Kami memutuskan untuk bekerja dengan gelombang persegi karena sangat mudah diimplementasikan.
Gelombang persegi adalah sinyal yang mengubah kondisinya antara tinggi dan rendah. Ide utama dari gelombang persegi adalah bahwa waktu ketika sinyal pada kondisi tinggi dan waktu ketika sinyal pada kondisi rendah adalah sama. Untuk menghasilkan gelombang persegi Anda perlu menyalakan I / O, tunggu x jumlah waktu, matikan I / O, tunggu dari x jumlah waktu, dan ulangi tindakan tersebut sebanyak yang Anda butuhkan.

Foto ini diambil dari
sini .
Cyclone IV memiliki clock generator dengan frekuensi 50 MHz. Menggunakan definisi gelombang kuadrat, tidaklah sulit untuk mendapatkan rumus berikut:
x = (50 * 10 ^ 6) / (2 *
n )
di mana
n adalah frekuensi yang diinginkan dalam Hz dan
x adalah sejumlah siklus jam yang harus kita tunggu sebelum mengubah keadaan dari tinggi ke rendah dan sebaliknya.
Untuk membuat buzzer menghasilkan gelombang dengan frekuensi n Hz kami menerapkan pembagi jam.
Lebih lanjut tentang pembagi jam dan gelombang persegi dapat Anda baca di
sini .
Lain tetapi :
Karena kualitas buzzers yang rendah, tidak mungkin memainkan not dengan frekuensi rendah. Jadi, kami menggunakan yang dari F # dari 4 oktaf ke C # dari 5 oktaf.
Ini adalah diagram alur yang menunjukkan logika kotak musik.

Rotary encoder
Bagaimana cara kerja rotary encoder?
Itu adalah sesuatu yang terbuat dari lingkaran dengan pelat konduktor dan dua sensor analog.
Seperti yang dapat Anda lihat dari gambar ketika Anda memutar rotary encoder, salah satu sensor menyentuh pelat terlebih dahulu dan bergerak dari rendah ke tinggi. Jadi, pada saat itu kita bisa tahu, apakah kita memutar encoder searah atau berlawanan arah jarum jam. Idenya adalah sebagai berikut: kita akan melihat sensor B setiap kali ketika sensor A beralih dari rendah ke tinggi. Jika pada saat itu B dinyatakan, encoder diputar searah jarum jam, jika tidak, berlawanan arah jarum jam. Sekarang, dengan rotasi kata, kami bermaksud memutar encoder pada satu bagian.
(gambar itu dicuri dari howtomechatronics.com )Ini adalah diagram alur yang menunjukkan logika rotary encoder

Kami juga ingin menampilkan sudut rotasi ke tampilan 8-segmen. Encoder kami memiliki 20 segmen, jadi rotasi pada satu segmen sama dengan rotasi pada sudut 18 dan rumus yang kami gunakan adalah:
angle = (
jumlah rotasi mod 20) * 18
Material
Kode proyek kami ada di
sini .
Di sini dan di
sini adalah video dari rotary encoder dan kotak musik.
Penulis : Amina Miftahova, Kamil Kamaliev, Lev Svalov.