Mengonversi file gambar ke format bitmap membuat cara termudah untuk membaca gambar menggunakan VHDL. Dukungan untuk format file gambar grafik raster BMP dibangun ke dalam sistem operasi Microsoft Windows. Itu membuat BMP menjadi format gambar yang cocok untuk menyimpan foto untuk digunakan di bangku tes VHDL.
Pada artikel ini, Anda akan belajar cara membaca file gambar biner seperti BMP dan menyimpan data dalam memori dinamis di simulator. Kami akan menggunakan contoh modul pemrosesan gambar untuk mengubah gambar menjadi skala abu-abu, ini akan menjadi perangkat kami yang sedang diuji (DUT). Terakhir, kami menulis output dari DUT ke gambar baru yang dapat kami bandingkan secara visual dengan aslinya.
Posting blog ini adalah bagian dari seri tentang penggunaan perpustakaan TEXTIO di VHDL. Baca artikel lainnya di sini:
Cara menginisialisasi RAM dari file menggunakan TEXTIO
File stimulus dibaca di testbench menggunakan TEXTIO
Mengapa bitmap adalah format terbaik untuk VHDL
Format file gambar yang paling umum di internet adalah JPEG dan PNG. Keduanya menggunakan kompresi, JPEG lossy sedangkan PNG lossless. Sebagian besar format menawarkan beberapa bentuk kompresi karena ini dapat secara dramatis mengurangi ukuran penyimpanan gambar. Meskipun ini baik untuk penggunaan normal, ini tidak ideal untuk membaca di bangku tes VHDL.
Untuk dapat memproses gambar dalam perangkat lunak atau perangkat keras, Anda harus memiliki akses ke data piksel mentah dalam aplikasi Anda. Anda ingin memiliki data warna dan luminansi yang disimpan dalam matriks byte, ini disebut grafik bitmap atau raster.
Sebagian besar editor gambar terkenal seperti Photoshop atau GIMP berbasis raster. Mereka dapat membuka berbagai format gambar, tetapi semuanya dikonversi ke grafik raster secara internal di editor.
Anda juga dapat melakukan ini di VHDL, tetapi itu akan membutuhkan upaya pengkodean yang cukup besar karena tidak ada solusi siap pakai untuk mendekode gambar terkompresi. Solusi yang lebih baik adalah mengonversi gambar input pengujian ke format bitmap seperti BMP secara manual atau dengan memasukkannya ke dalam skrip yang meluncurkan testbench Anda.
Format file gambar BMP
Format file BMP didokumentasikan dengan baik di Wikipedia. Format ini memiliki banyak varian yang berbeda, tetapi kami akan menyetujui beberapa pengaturan khusus yang akan membuatnya lebih mudah bagi kami. Untuk membuat gambar input kami, kami membukanya di Microsoft Paint yang sudah diinstal sebelumnya dengan Windows. Kemudian, kita klik File→Save as , pilih Simpan sebagai jenis:Bitmap 24-bit (*bmp; *.dib) . Beri nama file dengan akhiran .bmp dan klik simpan.
Dengan memastikan bahwa file dibuat seperti ini, kita dapat mengasumsikan bahwa header selalu merupakan varian BITMAPINFOHEADER dengan panjang 54 byte dengan format piksel RGB24 yang disebutkan di halaman Wikipedia. Selanjutnya, kami hanya akan peduli tentang beberapa bidang yang dipilih di dalam header. Tabel di bawah ini menunjukkan bidang header yang akan kita baca.
Offset (Des)
Ukuran (B)
Diharapkan (Hex)
Deskripsi
0
2
“BM” (42 4D)
bidang ID
10
4
54 (36 00 00 00)
Oset array piksel
14
4
40 (28 00 00 00)
Ukuran tajuk
18
4
Baca nilai
Lebar gambar dalam piksel
22
4
Baca nilai
Tinggi gambar dalam piksel
26
1
1 (01)
Jumlah bidang warna
28
1
24 (18)
Jumlah bit per piksel
Nilai yang ditandai dengan warna hijau adalah satu-satunya yang benar-benar perlu kita lihat karena kita tahu nilai mana yang diharapkan di bidang header lainnya. Jika Anda setuju untuk hanya menggunakan gambar dengan dimensi tetap yang telah ditentukan sebelumnya, Anda dapat melewati seluruh header dan mulai membaca pada byte offset nomor 54 dalam file BMP, di situlah data piksel akan ditemukan.
Namun demikian, kami akan memeriksa bahwa nilai-nilai lain yang terdaftar seperti yang diharapkan. Tidak sulit untuk melakukannya karena kita sudah membaca headernya. Ini juga memberikan perlindungan terhadap kesalahan pengguna, jika Anda atau salah satu kolega Anda memberikan gambar pengkodean yang salah ke testbench kapan saja di masa mendatang.
Kasus uji
Posting blog ini adalah tentang cara membaca gambar dari file di testbench VHDL, tetapi untuk kelengkapannya, saya telah menyertakan contoh DUT. Kami akan mengalirkan data piksel melalui DUT saat kami membaca gambar. Terakhir, kami menulis hasilnya ke file BMP keluaran lain yang dapat diperiksa di penampil gambar favorit Anda.
entity grayscale is
port (
-- RGB input
r_in : in std_logic_vector(7 downto 0);
g_in : in std_logic_vector(7 downto 0);
b_in : in std_logic_vector(7 downto 0);
-- RGB output
r_out : out std_logic_vector(7 downto 0);
g_out : out std_logic_vector(7 downto 0);
b_out : out std_logic_vector(7 downto 0)
);
end grayscale;
Kode di atas menunjukkan entitas DUT kami. Modul skala abu-abu mengambil data RGB 24-bit untuk satu piksel sebagai input dan mengubahnya menjadi representasi skala abu-abu yang disajikan pada output. Perhatikan bahwa piksel keluaran mewakili bayangan abu-abu yang masih berada dalam ruang warna RGB, kami tidak mengonversi BMP menjadi BMP skala abu-abu yang merupakan format berbeda.
Modul ini murni kombinasional, tidak ada input clock atau reset. Hasilnya segera muncul pada output ketika sesuatu ditugaskan ke input. Untuk mempermudah, konversi ke skala abu-abu menggunakan perkiraan titik tetap dari nilai luma (kecerahan) menurut sistem pengkodean ITU-R BT.2100 RGB ke luma.
Anda dapat mengunduh kode untuk modul skala abu-abu dan seluruh proyek dengan menggunakan formulir di bawah ini.
Gambar Boeing 747 yang Anda lihat di bawah ini akan menjadi contoh gambar input kami. Artinya, itu bukan gambar BMP sebenarnya yang disematkan di posting blog ini, itu tidak mungkin. Ini adalah representasi JPEG dari gambar BMP yang akan kita baca di testbench kita. Anda dapat meminta gambar BMP asli dengan meninggalkan alamat email Anda di formulir di atas dan Anda akan langsung menerimanya di kotak masuk Anda.