DIGITAL PIANO - FPGA BOARD

by liquidbogeng25 in Circuits > Electronics

255 Views, 0 Favorites, 0 Comments

DIGITAL PIANO - FPGA BOARD

20230120_152803 (1).jpg

Pendahuluan


Latar Belakang

Saat ini, cukup banyak orang-orang yang ingin mempelajari berbagai alat musik dan salah satunya adalah piano ini. Tetapi dalam prosesnya untuk mempelajari memainkan piano, banyak orang yang menyerah dan menjadi tidak berminat untuk belajar karena faktor-faktor tertentu. Faktor yang pertama adalah masalah harga, dimana pada umumnya kisaran harga sebuah piano dapat dibilang cukup tinggi, sehingga peminatnya pun berkurang karena banyak yang berpikiran bahwa sangat disayangkan untuk mengeluarkan sejumlah uang hanya untuk mendapatkan alat musiknya saja. Faktor lainnya yang mempengaruhi hal ini adalah masalah kerumitannya, dimana orang yang baru pertama kali ingin belajar piano merasa kebingungan akan banyaknya not, chord, oktaf dan fitur-fitur lainnya dalam sebuah piano yang tentunya tidak dapat dikuasai semudah itu oleh seorang pemula.

Melihat masalah-masalah yang ada tersebut dalam pembelajaran piano bagi pemula, kami ingin membuat sebuah rancangan berupa digital piano yang bertujuan untuk memberikan alternatif lain kepada para pemula dengan piano digital yang lebih mudah dimengerti dan praktis, tanpa perlu mengeluarkan biaya yang besar untuk mulai mempelajari piano.

Dari tugas rancang yang kami buat, kami dapat menghasilkan piano yang dapat membantu pemula untuk belajar piano menggunakan produk kami yaitu digital piano yang lebih praktis untuk dimainkan dan dari segi harga lebih terjangkau daripada piano sebenarnya.


Rumusan Masalah

  • Bagaimana menghasilkan frekuensi suara yang sesuai dengan not asli?
  • Bagaimana membuat digital piano menggunakan FPGA Board?


Tinjauan Pustaka

Alat musik pada zaman sekarang sudah mendunia sehingga banyak sekali macam jenis alat musik yang sangat modern salah satunya yaitu digital piano. Digital piano yang dapat dibuat menggunakan teknologi zaman sekarang yaitu FPGA board Nexys A7-100t dapat membantu membuat digital piano menjadi lebih menarik.

Publikasi ilmiah Digital Piano Keyboard Design using FPGA Implementation for Beginner yang berasal dari International Conference on Technology, Engineering and Sciences (ICTES) 2020 membuat digital piano menggunakan FPGA board sebagai IC atau komponen utama yang membantu membuat digital piano. Desain prototipe harus dilakukan dalam lingkungan yang portabel dan mudah digunakan. Keyboard yang menampung 13 nada ditempatkan di depan di mana pengguna pemula dapat bermain dengan bebas di nada-nada utama. Prototipe ini juga memiliki penutup untuk melindungi papan dan sirkuit dari debu dan air untuk mencegah kerusakan pada prototipe. Piano digital yang dirancang pada FPGA, pengguna hanya perlu mencolokkan catu daya dan speaker eksternal ke prototipe ini. Kabel USB tipe B diperlukan untuk mengunggah Verilog ke dalam DE1-SoC. Koneksi internal untuk prototipe ini sangat sederhana karena pengguna dapat memutuskan dan menyambungkannya kembali. 

Publikasi ilmiah FPGA Piano Project yang berasal Department of Computer Science Lund University membuat digital piano menggunakan FPGA board dan juga disertai PMOD Amplifier untuk membantu memproses digital piano. Bagian utama dari perangkat keras adalah VGA, keyboard PS2, dan inti IP keluaran PWM. VGA adalah inti IP yang dibuat khusus, baik PS2 dan PWM adalah inti IP Xilinx. 

Dari kedua publikasi, dilihat perbedaan dalam membuat digital piano FPGA Board banyak cara dalam membuatnya dari menggunakan PMOD dan juga VGA. Digital piano yang dibuat oleh peneliti sekarang menggunakan PMOD Keypad sebagai alat bantu atau media untuk bermain piano sebagai tuts pada piano.


Tujuan

Tujuan dari penelitian tugas rancang ini adalah membuat piano digital yang lebih simpel. Digital piano yang kami buat memiliki fitur seperti not yang lebih sedikit daripada not piano yang asli.


Manfaat

Manfaat dari hasil penelitian yang dicapai adalah dapat membuat digital piano yang sangat efisien dan mudah untuk dibawa kemana mana untuk dimiliki oleh para pemula yang mau belajar maupun yang sudah terlatih.


Supplies

Landasan Teori


2.1 FPGA Board

FPGA atau Field-Programmable Array adalah sebuah IC digital yang  dapat diprogram ulang untuk mengkonfigurasi hardware-nya sesuai dengan pengaplikasian yang diinginkan untuk memenuhi kebutuhan yang spesifik tergantung pengguna. FPGA ini berbeda dengan IC lainnya karena memiliki fleksibilitas untuk diprogram dan diprogram ulang kembali via software untuk mengadaptasi kebutuhan sistem yang didesain menggunakan FPGA tersebut. 

Untuk menjalankan sebuah implementasi, FPGA memerlukan konfigurasi agar interkoneksi dan rangkaian logika pada FPGA tersebut dapat mengetahui peran apa yang harus dilakukan dalam pengaplikasian tertentu. Hal ini dilakukan menggunakan development software khusus yang biasa disediakan oleh supplier/perusahaan pembuat FPGA, dimana pengguna akan mendesain logika yang akan diimplementasikan ke dalam FPGA berupa HDL (Hardware Description Language).

Setelah implementasi HDL dilakukan, software akan melakukan kompilasi (compile) desain tersebut dengan melakukan sintesis dan kemudian menempatkan serta membuat rute untuk logikanya yang sedemikian rupa sesuai dengan hardware di FPGA. Setelah itu akan dibuat sebuah bitstream yang akan mengkonfigurasi FPGA tersebut dan setelah bitstream di download ke dalam FPGA, maka FPGA dapat menjalankan tugasnya sesuai dengan implementasi HDL yang dibuat.


2.2 Pmod 

Pmod atau Peripheral Module Interface adalah standar terbuka yang digunakan untuk menghubungkan periferal ke FPGA atau papan pengembangan lainnya. Ada 2 versi, versi 6-pin dan 12-pin, versi 6-pin memiliki 4 pin I/O digital, 1 pin daya, dan 1 pin ground. Versi 12-pin memiliki 8 pin I/O sinyal, 2 pin daya, dan 2 pin ground. Sinyal yang termasuk dalam versi 12-pin dibuat untuk menyediakan 2 koneksi dari 6 pin yang ditumpuk.

Secara umum, modul Pmod dapat dihubungkan langsung ke konektor pada papan pengontrol host yang disebut port host, atau ke papan pengontrol dengan kabel enam atau 12 pin. Dua modul periferal 6-pin dapat dihubungkan ke satu port host 12-pin menggunakan dua kabel breakout 12-pin ke 6-pin. Demikian pula, modul periferal 12-pin dapat dihubungkan ke dua port host 6-pin dengan kabel breakout 12-pin.

Modul Pmod ditenagai oleh host melalui power dan ground pin antarmuka. Antarmuka Pmod tidak dirancang untuk penggunaan frekuensi tinggi, tetapi dengan menggunakan konektor RJ45 dan kabel Pain Ethernet twisted pair, sinyal dengan frekuensi 24 MHz ditransmisikan dengan lancar pada jarak hingga 4 meter. Namun secara teoritis, sinyal di atas 100MHz dapat dicapai dengan port berkecepatan tinggi dengan koneksi langsung ke modul Pmod.


2.3 PMOD Keypad

PmodKYPD membuat array 16 tombol sesaat menggunakan 4 baris dan kolom melalui gerakan. Dengan menghubungkan baris kolom ke tegangan level logika rendah secara bergantian, pengguna dapat membaca tegangan level logika yang sesuai. Periksa setiap baris untuk menentukan tombol mana yang ditekan. Penekanan tombol secara bersamaan Anda juga dapat mencatatnya, tetapi Anda harus memeriksa setiap baris dan kolom satu per satu untuk memastikannya pengukuran tidak boleh terganggu dengan menekan tombol. PmodKYPD menggunakan protokol GPIO untuk berkomunikasi dengan host board. Setiap tombol adalah rangkaian pembagi tegangan sederhana. Resistor pull-up yang besar mempertahankan level logika tinggi ketika tombol tidak ditekan. Ketegangan pada setiap pin baris. Ketika pin kolom bergerak ke tegangan rendah level logika dan tombol yang sesuai ditekan untuk menyelesaikan rangkaian pembagi tegangan, pin baris membaca tegangan rendah level logika sebagai gantinya.

Metode Pelaksanaan

Cara kerja sistem

Cara kerja digital piano yang dibuat menggunakan FPGA Board sama seperti piano pada umumnya dimana tuts akan mengeluarkan suara dari output FPGA Board itu sendiri. Sistem piano digital yang menggunakan FPGA Board dan keypad PMOD akan bekerja dengan mengubah penekanan tombol fisik pada keypad menjadi sinyal digital yang dapat diproses oleh FPGA. FPGA kemudian akan menghasilkan sinyal audio yang sesuai untuk tombol yang ditekan, yang dapat dikeluarkan melalui speaker atau perangkat output audio lainnya. Keypad PMOD kemungkinan besar akan memiliki 16 tombol, tetapi kami menggunakan 15 nada yang dapat dimainkan dari C5, D5, E5, F5, G5, A5, B5, C6, D6, E6, F6, G6, A6, B6, C7. FPGA akan diprogram untuk mengenali ketika sebuah tombol ditekan dan menghasilkan sinyal audio yang sesuai untuk tombol tersebut. Selain itu, FPGA mungkin dapat menambahkan berbagai efek seperti reverb atau sustain pada output audio, tergantung pada implementasi spesifik sistem.


Blok Diagram

Screenshot 2023-01-25 162505.png

Dari USB masuk ke FPGA Board Nexys A7-100t sebagai power untuk menyalakan FPGA Board, setelah FPGA Board menyala didalam FPGA Board terdapat PMOD untuk menyambungkan keypad sebagai alat bantu pada digital piano. Setelah PMOD sudah terpasang, speaker akan disambungkan dengan audio jack(J8) pada FPGA Board.

Flow Chart

Button_E.png

Dari start untuk memulai proses, tetapi dicek terlebih dahulu apakah ada arus tegangan yang masuk sebagai power, jika ada sumber tegangan maka langsung bisa di on atau off, jika tidak ada tegangan maka proses akan langsung end. Pada switch on/off, jika switch off maka proses langsung end atau bisa diulang, sedangkan jika switch on maka lanjut ke proses selanjutnya ke button pada keypad. Pada button keypad, jika di tekan button 1 maka akan keluar C5 sedangkan jika tidak tekan maka tidak akan keluar suara C5. Jika button 2 di tekan maka akan keluar D5 dan sebaliknya jika tidak ditekan maka tidak akan keluar suara D5 hingga seterusnya sampai button E. Pada button D tidak akan keluar suara karena tidak ada input frekuensi pada code VHDL nya.

Schematic

20230120_152043.jpg

Pada skematik diatas dilihat terdapat 2 input yaitu clkin yang merupakan clock 100MHz dari board dan JB yang merupakan port pmod pada FPGA yang terhubung dengan keypad. Input JB akan masuk ke komponen decoder keypad yang terhubung dengan Row dan Column, input clkin terhubung dengan clk. Dari komponen decoder akan dikeluarkan output DecoderOut yang diteruskan ke komponen berikutnya yaitu PlayNoteVal yang terhubung dengan NotVal sebagai input yang meneruskan DecoderOut. Pada komponen PlayNoteVal juga menerima input clkin yang terhubung dengan clk1. Dari komponen PlayNoteVal akan dikeluarkan output audioout yang dihubungkan ke audiofix yang merupakan audio jack pada FPGA (J8).

Main Code

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity PianoKYPD is
Port (
clkin : in STD_LOGIC; -- clock board 100MHz
JB : inout STD_LOGIC_VECTOR (7 downto 0); -- Keypad disambungkan ke pmod JB
audiofix : out STD_LOGIC); -- output ke audio jack J8
end PianoKYPD;

architecture Behavioral of PianoKYPD is

component DecoderKYPD is
Port (
clk : in STD_LOGIC;
Row : in STD_LOGIC_VECTOR (3 downto 0);
Col : out STD_LOGIC_VECTOR (3 downto 0);
DecodeOut : out STD_LOGIC_VECTOR (3 downto 0));
end component;

component PlayNoteVal is
Port (
NotVal : in STD_LOGIC_VECTOR (3 downto 0);
clk1 : in STD_LOGIC;
audioout : out std_logic);
end component;

signal Decode: STD_LOGIC_VECTOR (3 downto 0);
begin

C0: DecoderKYPD port map (clk=>clkin,Row =>JB(7 downto 4), Col=>JB(3 downto 0), DecodeOut=> Decode);
C1: PlayNoteVal port map (NotVal=>Decode,clk1=>clkin, audioout=>audiofix);

end Behavioral;


Berikut diatas adalah main code VHDL utama untuk implementasi digital piano pada FPGA Nexys A7 100T. Dimana pada code ini hanya dilakukan port mapping untuk menggabungkan dua component lainnya yaitu DecoderKYPD.vhd dan PlayNoteVal.vhd dengan port input dan output utama.

DecoderKYPD merupakan komponen untuk membaca dan menentukan input pada button yang ditekan dari keypad yang dihubungkan melalui port pmod JB dan PlayNoteVal merupakan komponen untuk mengeluarkan output suara melalui jack audio J8 pada FPGA.

Component 1

FG8G497LD8TMROA.png
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity DecoderKYPD is
Port (
clk : in STD_LOGIC;
Row : in STD_LOGIC_VECTOR (3 downto 0);
Col : out STD_LOGIC_VECTOR (3 downto 0);
DecodeOut : out STD_LOGIC_VECTOR (3 downto 0));
end DecoderKYPD;

architecture Behavioral of DecoderKYPD is

signal sclk :STD_LOGIC_VECTOR(19 downto 0);
begin
process(clk)
begin
if clk'event and clk = '1' then
-- 1ms (sclk = 100KHz , clock divider = 100MHz/100KHz = 1000Hz , Periode = 1/1000Hz = 1ms)
if sclk = "00011000011010100000" then
--C1 (check kolom 1)
Col<= "0111";
sclk <= sclk+1;

-- check pin untuk baris 1-4 (sclk = 100.008, delay untuk melanjutkan scan kolom)
elsif sclk = "00011000011010101000" then
--R1
if Row = "0111" then
DecodeOut <= "0001"; --1
--R2
elsif Row = "1011" then
DecodeOut <= "0100"; --4
--R3
elsif Row = "1101" then
DecodeOut <= "0111"; --7
--R4
elsif Row = "1110" then
DecodeOut <= "0000"; --0

end if;
sclk <= sclk+1;
-- 2ms
elsif sclk = "00110000110101000000" then
--C2 (check kolom 2)
Col<= "1011";
sclk <= sclk+1;
-- check pin untuk baris 1-4
elsif sclk = "00110000110101001000" then
--R1
if Row = "0111" then
DecodeOut <= "0010"; --2
--R2
elsif Row = "1011" then
DecodeOut <= "0101"; --5
--R3
elsif Row = "1101" then
DecodeOut <= "1000"; --8
--R4
elsif Row = "1110" then
DecodeOut <= "1111"; --F

end if;
sclk <= sclk+1;
--3ms
elsif sclk = "01001001001111100000" then
--C3 (check kolom 3)
Col<= "1101";
sclk <= sclk+1;
-- check pin untuk baris 1-4
elsif sclk = "01001001001111101000" then
--R1
if Row = "0111" then
DecodeOut <= "0011"; --3
--R2
elsif Row = "1011" then
DecodeOut <= "0110"; --6
--R3
elsif Row = "1101" then
DecodeOut <= "1001"; --9
--R4
elsif Row = "1110" then
DecodeOut <= "1110"; --E

end if;
sclk <= sclk+1;
--4ms
elsif sclk = "01100001101010000000" then
--C4 (check kolom 4)
Col<= "1110";
sclk <= sclk+1;
-- check check pin untuk baris 1-4
elsif sclk = "01100001101010001000" then
--R1
if Row = "0111" then
DecodeOut <= "1010"; --A
--R2
elsif Row = "1011" then
DecodeOut <= "1011"; --B
--R3
elsif Row = "1101" then
DecodeOut <= "1100"; --C
--R4
elsif Row = "1110" then
DecodeOut <= "1101"; --D
end if;
sclk <= sclk+1;
--5ms
elsif sclk = "01111010000100100000" then
-- check semua kolom sekaligus
Col<= "0000";
sclk <= sclk+1;
-- check saat tidak ada pin baris yang aktif
elsif sclk = "01111010000100101000" then
--R1
if Row = "1111" then
DecodeOut <= "1101";
end if;
sclk <= "00000000000000000000";
else
sclk <= sclk+1;
end if;
end if;
end process;

end Behavioral;

Component yang pertama adalah berupa decoder untuk membaca input berupa tombol apa yang ditekan pada keypad.

Decoder dapat menentukan tombol mana yang ditekan pada keypad dengan mengatur dan mengecek setiap pin kolom yang memiliki logic low (0) . Dimana setelah Decoder mengatur pin kolom menjadi logic low, selanjutnya akan dicek pin baris apakah logicnya low atau tidak. Logic low pada pin baris menandakan bahwa tombol telah ditekan.

Hal tersebut dapat tentukan dengan melihat cara kerja keypad yang dimana setiap tombol ditempatkan pada rangkaian voltage divider sederhana. Saat tombol tidak ditekan, resistor pull-up mempertahankan tegangan logic high pada setiap pin baris. Saat pin kolom digerakkan ke tegangan logic low dan tombol pada kolom tersebut ditekan, maka rangkaian voltage divider tersebut akan menjadi sempurna sehingga pin baris akan memiliki nilai tegangan dengan logic low.

Baris dan kolom dinyatakan dalam 4 bit, dimana angka paling kiri menyatakan baris/kolom pertama hingga angka paling kanan yang menyatakan baris/kolom terakhir seperti yang bisa dilihat pada skematik rangkaian keypad.

Setelah Decoder memiliki nilai kolom dan baris tombol, dapat ditentukan nilai outputnya dalam hal ini adalah DecodeOut yang akan diteruskan ke PlayNoteVal.vhd. Decoder akan berganti kolom untuk mengecek logic low setiap 1 ms dalam siklusnya menggunakan serial clock, dimana pada 1ms dicek kolom 1, 2ms dicek kolom 2 dan seterusnya hingga terakhir pada 5ms untuk menentukan nilai output DecodeOut saat tidak ada button yang ditekan di semua kolom. Saat siklus terakhir dilakukan, serial clock akan kembali lagi ke 0 dan dilakukan siklus selama 5ms lagi.

Component 2

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity PlayNoteVal is
Port (
--output dari Decoder KYPD
NotVal : in STD_LOGIC_VECTOR (3 downto 0);
clk1 : in STD_LOGIC; -- clock dr board 100Mhz
audioout : out std_logic); -- output ke speaker
end PlayNoteVal;

architecture Behavioral of PlayNoteVal is
signal counter: integer := 0;
signal temp_out : STD_LOGIC := '0';
signal note : std_logic_vector(3 downto 0);
begin
process(clk1, note)
begin
if(rising_edge(clk1)) then
case note is
when "0000" => --untuk not c5
if (counter >= 191204) then --100MHz/191204 = 523Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "0001" => --untuk not d5
if (counter >= 170357) then --100MHz/170357 = 587Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "0010" => --untuk not e5
if (counter >= 151745) then --100MHz/151745 = 659Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "0011" => --untuk not f5
if (counter >= 143266) then --100MHz/143266 = 698Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "0100" => --untuk not g5
if (counter >= 127551) then --100MHz/127551 = 784Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "0101" => --untuk not a5
if (counter >= 113636) then --100MHz/113636 = 880Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "0110" => --untuk not b5
if (counter >= 101214) then --100MHz/101214Hz = 988Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "0111" => --untuk not c6
if (counter >= 95510) then --100MHz/95510 = 1047Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "1000" => --untuk not d6
if (counter >= 85106) then --100MHz/85106 = 1175Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "1001" => --untuk not e6
if (counter >= 75815) then --100MHz/75815 = 1319Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "1010" => --untuk not f6
if (counter >= 71581) then --100MHz/71581 = 1397Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "1011" => --untuk not g6
if (counter >= 63775) then --100MHz/63775 = 1568Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "1100" => --untuk not a6
if (counter >= 56818) then --100MHz/56818 = 1760Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "1101" => --untuk not b6
if (counter >= 50607) then --100MHz/50607 = 1976Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "1110" => --untuk not c7
if (counter >= 47778) then --100MHz/47778 = 2093Hz -> output
counter <= 0;
temp_out <= not temp_out;
else
counter <= counter +1;
end if;
when "1111" =>
temp_out <= '0';
counter <= 0;
end case;
end if;
end process;
audioout <= temp_out;

with NotVal select
note <= "0000" when "0001", --1 = c5
"0001" when "0010", --2 = d5
"0010" when "0011", --3 = e5
"0011" when "1010", --A = f5
"0100" when "0100", --4 = g5
"0101" when "0101", --5 = a5
"0110" when "0110", --6 = b5
"0111" when "1011", --B = c6
"1000" when "0111", --7 = d6
"1001" when "1000", --8 = e6
"1010" when "1001", --9 = f6
"1011" when "1100", --C = g6
"1100" when "0000", --0 = a6
"1101" when "1111", --F = b6
"1110" when "1110", --E = c7
"1111" when others;

end Behavioral;

Component kedua adalah PlayNoteVal.vhd yang digunakan untuk mengeluarkan output berupa suara not pada speaker dari DecodeOut yang berasal dari component decoder sebelumnya. Untuk mendapatkan frekuensi suara yang diinginkan, diperlukan sebuah pembagi frekuensi. Disini digunakan clock 100MHz dari board FPGA untuk mengimplementasikan pembagi frekuensi, dimana idenya diimplementasikan menggunakan counter yang terus bertambah hingga mencapai nilai yang ditentukan dan nilai pada sinyal temp_out akan ditoggle menjadi high saat counter mencapai nilai tersebut, counter juga kembali ke 0 dan melanjutkan hitungan kembali. Nilai dari temp_out akan disimpan untuk digunakan sebagai output pada speaker (audioout)


Process 1 untuk pembagi frekuensi

Pertama perlu dipastikan bahwa not hanya dapat dimainkan pada saat clock rising edge, sehingga pada if statement dipastikan untuk mengecek kondisi rising edge.

Kemudian untuk pembagi frekuensi digunakan salah satu contoh yaitu untuk mendapatkan not C5 yang memiliki frekuensi 523Hz, kita cukup membagikan clock 100MHz dengan frekuensi 523Hz sehingga didapat nilai 191204. Dari situ counter pembagi frekuensi akan menghasilkan frekuensi 523Hz setiap siklus 191204 hitungan. Setelah setiap frekuensi telah ditentukan untuk semua not yang ada dari C5 ke C7, setiap not harus diberikan nilainya masing-masing. Dimana untuk memberikan nilai pada tiap not digunakan switch case dengan nilai hexadesimal dari 0 ke 16, sehingga dapat ditentukan pada nilai not apa frekuensi mana yang akan dihasilkan.

Sebagai contoh saat nilai not 0 (0000), frekuensi untuk not C5 yang akan dihasilkan. Saat nilai not 8 (1000), frekuensi untuk not D6 yang akan dihasilkan dan seterusnya. Untuk nilai not 16 (1111), sengaja dibuat tidak mengeluarkan suara dimana temp_out tetap bernilai 0 untuk diberikan ke DecodeOut dengan nilai "1101", sehingga saat tidak ada button yang ditekan atau saat button dilepas suara akan hilang dengan sendirinya.


Select statement

Select statement digunakan untuk memberikan (assign) nilai output not ke button yang ditekan pada keypad. Dimana NotVal serta DecodeOut dimapping melalui sinyal Decode pada main code, sehingga NotVal akan meneruskan output DecodeOut dari component 1 sebagai input di component 2. Disini NotVal memilih sinyal yang akan ditetapkan ke sinyal target. Dalam contoh ini, ketika dipilih nilai NotVal 0001, output not adalah 0000 (C5) dan seterusnya hingga untuk nilai NotVal lainnya selain yang dituliskan (others) yaitu 1101, output not adalah 1111 (tidak ada suara).

Hasil Dan Pembahasan

FBBU52RLD8TMF3T.png

Dari hasil pengujian yang dilakukan, digital piano yang dibuat oleh peneliti berjalan dengan lancar dan mengeluarkan suara seperti piano pada umumnya, tetapi pada hasil pengujian peneliti mendapatkan hasil bahwa frekuensi not yang dihasilkan tidak sesuai dengan frekuensi not yang di input pada VHDL, dimana hasil pengukuran frekuensi output suara dari FPGA Board Nexys A7-100t menunjukkan frekuensi yang lebih rendah yaitu dari rentang not C4 hingga C6. Nilai frekuensi nya lebih rendah 1 oktaf dibandingkan dengan not yang di input pada code VHDL dari C5, D5, E5, F5, G5, A5, B5, C6, D6, E6, F6, G6, A6, B6 sampai C7.

Kesimpulan Dan Saran

Kesimpulan

Dari hasil pengujian terhadap rancangan digital piano menggunakan FPGA Nexys A7 - 100T, digital piano yang dibuat berjalan sesuai dengan yang diharapkan dimana tiap button pada PMOD Keypad digital piano dapat memainkan not yang sudah ditentukan dari code VHDL untuk masing-masing button.

Kami menemukan bahwa semua not yang ada pada masing-masing button pada Keypad itu tidak sesuai dengan not yang sudah peneliti tentukan, dimana frekuensi dari not nya berada 1 oktaf lebih rendah dibandingkan nilai frekuensi yang kami tentukan. Sebagai contoh not C5 menjadi C4 saat diukur, C6 menjadi C5, dan C7 menjadi C6.

Saran

Kami berharap untuk peneliti yang akan mengembangkan rancangan digital piano menggunakan FPGA Board yaitu Nexys A7-100t untuk implementasi digital piano yang lebih variatif dan fitur lebih lengkap, misalnya dapat menyediakan fitur ganti oktaf pada digital piano yang akan dibuat nanti.


Daftar Pustaka

Khairuddin, Asyraf. M. A.(2020). Digital Piano Keyboard Design using FPGA Implementation for Beginner. IOP Conference Series: Materials Science and Engineering.


Shademani, Amir.(Tanpa Tahun). Design of Embedded Systems Advanced CourseEDA385 - FPGA Piano Project Report. Department of Computer Science.


Anonim. (2020, November 29). Digilent Pmod™ Interface Specification. Digilent. 


Pmod Interface. (2022, August 25). Diakses pada 13 Januari, 2023, dari https://en.wikipedia.org/wiki/Pmod_Interface#~:text=Pmod%20interface%20


Anonim. (2019, July 10). Nexys A7™ FPGA Board Reference Manual. Digilent. 


Anonim. (2016, April 8). PmodKYPD™ Reference Manual. Digilent. 

Lampiran

lampiran 1.jpg
2231552.jpg
2231551.jpg
VIDEO DEMONSTRASI DIGITAL PIANO | DIGITAL SYSTEM
  1. Foto alat
  2. Foto tim
  3. Foto Pengambilan data


LINK VIDEO: https://drive.google.com/file/d/1t1bgX76OKbO91L5XbvJDP7LiNUbdLukx/view?usp=share_link

LINK POSTER: https://drive.google.com/file/d/1KIpoQhYW_ogsnWyOn7r69A80lEPV1Xdj/view?usp=share_link