Pengontrol Tampilan 7 Segmen Ganda VHDL untuk Pmod SSD – Integrasi FPGA yang Mudah
Pada artikel kali ini saya akan menyajikan modul VHDL yang dapat menampilkan angka dua digit pada Pmod SSD:Seven-segment Display dari Digilent. Layar ganda 7-segmen kompatibel dengan antarmuka Pmod, artinya Anda dapat menggunakannya tanpa penyolderan apa pun. Cocok dengan konektor Pmod, yang merupakan standar di banyak papan pengembangan FPGA.
Untuk menguji implementasi VHDL, saya menggunakan Lattice iCEstick, papan pengembangan FPGA berbiaya rendah dengan konektor Pmod. Selain iCEstick, Anda memerlukan Kabel Splitter Pmod 2x6-pin ke Dual 6-pin untuk mengkonversi dari konektor Pmod paralel pada iCEstick ke versi konektor in-series yang diharapkan oleh tampilan 7-segmen. Terakhir, saya sarankan untuk membeli kabel ekstensi USB tipe-A karena tidak praktis untuk menyambungkan iCEstick langsung ke port USB di komputer.
Cara kerja tampilan 7 segmen
Ada banyak tampilan 7 segmen yang berbeda di pasaran. Jumlah digit bervariasi di antara keduanya, begitu pula antarmuka fisik dan pinout. Solusi umum yang mencakup semua kemungkinan tampilan 7-segmen yang mungkin Anda temui mungkin tidak akan terlalu ramah pengguna. Namun, Anda dapat menggunakan kode yang disajikan dalam artikel ini sebagai dasar dan memodifikasinya sesuai kebutuhan Anda.
Gambar di atas berasal dari datasheet modul Digilent Pmod. Ini menunjukkan bagaimana tampilan 7-segmen terhubung ke pin Pmod. Pin ini dapat diakses langsung ke FPGA di iCEstick.
Tujuh pin masing-masing mengontrol satu segmen di layar. Dengan menggerakkan logika bernilai tinggi pada pin tersebut, segmen yang sesuai akan menyala di layar. Namun ada dua digit pada tampilan ini, dan kami hanya dapat mengontrol satu digit pada saat itu. Pin P4/C pada konektor J2 memilih satu atau digit lainnya. Ketika tegangan logika pada pin ini adalah '0' , digit kanan menyala, jika '1' , digit kiri diaktifkan.
Titik desimal “DP” tidak terhubung dan tidak dapat diakses.
Entitas
Kode di bawah ini menunjukkan entitas modul VHDL seg7 kami. Entitas memiliki port generik dengan konstanta bernama clk_cnt_bits . Ini menentukan panjang penghitung internal yang mengontrol kecepatan refresh tampilan, frekuensi pergantian antara digit kiri dan kanan.
Frekuensi pastinya tidak penting. Pilih panjang penghitung yang berkisar antara 50 hingga beberapa ratus Hertz. Rumus yang menentukan refresh rate adalah refresh_hz =2clk_cnt_bits / clk_hz .
entity seg7 is
generic (
-- refresh_hz = (2 ** clk_cnt_bits) / clk_hz
clk_cnt_bits : integer
);
port (
clk : in std_logic;
rst : in std_logic;
value : in integer range 0 to 99;
segments : out std_logic_vector(6 downto 0);
digit_sel : out std_logic
);
end seg7;
Selain jam dan reset, entitas memiliki satu sinyal input:nilai untuk ditampilkan pada tampilan 7-segmen. value sinyal adalah tipe bilangan bulat yang dibatasi pada rentang 0 hingga 99 karena ini adalah satu-satunya nilai angka yang dapat ditampilkan hanya dengan menggunakan dua digit.
Sinyal keluarannya adalah tujuh segmen sebagai vektor dan sinyal pemilih digit untuk memilih digit kiri atau kanan untuk menerangi.
Mewakili desimal berkode biner
Untuk mewakili digit yang ditampilkan pada tampilan kita akan menggunakan format yang dikenal sebagai desimal berkode biner (BCD). Meskipun representasi biner adalah cara paling efisien untuk menyimpan angka desimal, kami mengalami masalah saat mencoba membaginya menjadi digit kiri dan kanan untuk ditampilkan di layar. Kita tidak bisa membedakan angka desimal hanya dengan mengiris vektor yang digunakan untuk menyimpan angka tersebut.
subtype digit_type is integer range 0 to 9;
type digits_type is array (1 downto 0) of digit_type;
signal digit : digit_type;
signal digits : digits_type;
Seperti yang ditunjukkan pada kode di atas, kami mendeklarasikan subtipe bilangan bulat pada rentang 0 hingga 9 untuk mendeskripsikan nilai yang dapat diwakili oleh satu digit desimal. Kemudian, kami mendeklarasikan tipe array baru yang dapat menampung dua nilai BCD tersebut. digit sinyal menyimpan nomor yang sedang ditampilkan di sisi kiri atau kanan layar. Di sisi lain, digits sinyal berisi karakter desimal individual untuk dua digit, seperti yang akan terlihat oleh orang yang melihat layar.
Mengonversi desimal ke BCD
Masukan ke modul ini, value , adalah bilangan bulat pada rentang 0 hingga 99, representasi biner dari angka tersebut. Kita perlu mengonversi bilangan bulat tunggal ini menjadi dua bilangan bulat pada rentang 0 hingga 9, BCD.
Algoritme standar untuk ini adalah Double Dabble, juga dikenal sebagai shift-and-add-3 algoritma. Meskipun ini boleh digunakan, saya akan memilih solusi yang lebih pendek dalam kasus kami karena kami hanya memiliki dua digit untuk dipisahkan.
digits(1) <= value / 10;
digits(0) <= value - ((value / 10) * 10);
Dengan menggunakan pembagian bilangan bulat seperti yang ditunjukkan pada kode di atas, kita dapat mengisolasi angka desimal yang paling signifikan dan menetapkannya ke digits(1) sinyal. Untuk mengambil digit paling signifikan, kita dapat mengurangkan digit paling signifikan dari value sinyal, meninggalkan kita hanya dengan nomor untuk ditetapkan ke digits(0) sinyal.
Menghitung siklus jam
Menunda waktu dalam FPGA hanyalah masalah penghitungan siklus jam. Periode jam adalah satu-satunya interval waktu yang dapat diprediksi yang dapat Anda andalkan dalam kode VHDL Anda. Kode di bawah ini menunjukkan clk_count sinyal, yang kami gunakan untuk menghitung siklus jam. clk_cnt_bits generik menentukan berapa banyak bit yang dicadangkan untuk sinyal yang tidak ditandatangani ini.
signal clk_cnt : unsigned(clk_cnt_bits - 1 downto 0);
Kecepatan refresh tampilan yang tepat kurang penting, itu sebabnya saya memilih tipe yang tidak bertanda tangan di sini. Hal ini memungkinkan kita untuk memanfaatkan perilaku self-wrapping dari sinyal yang tidak ditandatangani. Yang harus kita lakukan adalah menaikkan penghitung pada setiap sisi jam. Kode di bawah menunjukkan proses sinkron dengan reset yang menangani hal ini.
COUNT_PROC : process(clk)
begin
if rising_edge(clk) then
if rst = '1' then
clk_cnt <= (others => '0');
else
clk_cnt <= clk_cnt + 1;
end if;
end if;
end process;
Bergantian antar angka
Sekarang kita memiliki pencacah yang berjalan bebas, kita dapat menggunakan bit paling signifikan (MSB) dari sinyal pencacah yang tidak ditandatangani untuk beralih di antara dua digit. MSB bergantian antara '0' dan '1' dengan siklus kerja 50%. Baris pertama kode di bawah ini menyetel digit_sel sinyal berdasarkan nilai MSB. Baris kedua mengimplementasikan multiplexer dengan MSB yang digunakan sebagai pemilih. Ini akan meneruskan nilai digit aktif dari digits array ke digit sinyal.
digit_sel <= clk_cnt(clk_cnt'high);
digit <= digits(0) when clk_cnt(clk_cnt'high) = '0' else digits(1);
BCD ke encoder 7 segmen
Langkah terakhir dari modul seg7 adalah menerjemahkan BCD yang disimpan di digit sinyal ke representasi visual pada tampilan 7-segmen. Kode di bawah menunjukkan proses yang mencapai hal ini dengan menggunakan pernyataan kasus.
Posisi dalam vektor setiap bit literal berhubungan dengan satu segmen pada tampilan. Indeks 0 sama dengan segmen A, indeks 1 adalah B, dan seterusnya, hingga indeks 6, yang mengontrol segmen G. Pemetaan segmen ke indeks vektor diperoleh dari lembar data untuk tampilan 7 segmen Digilent.
ENCODER_PROC : process(digit)
begin
case digit is
when 0 => segments <= "0111111";
when 1 => segments <= "0000110";
when 2 => segments <= "1011011";
when 3 => segments <= "1001111";
when 4 => segments <= "1100110";
when 5 => segments <= "1101101";
when 6 => segments <= "1111101";
when 7 => segments <= "0000111";
when 8 => segments <= "1111111";
when 9 => segments <= "1101111";
end case;
end process;
Keluarannya
Modul VHDL seg7 akan ditampilkan pada tampilan apa pun yang Anda tetapkan ke value sinyal masukan. Di testbench, kami menambah value sinyal sekali setiap detik. Kemudian, kita simulasikan sedikit lebih dari 100 detik sehingga kita dapat mengamati titik pembungkus value penghitung.
Bentuk gelombang di atas berasal dari ModelSim. Ini menunjukkan bagian pertama dari simulasi, di mana nilainya dihitung dari 0 hingga 15. Kita dapat melihat bahwa angka-angka di digits array juga menghitung. Yang (0) menghitung setiap kali value sinyal berubah, sedangkan puluhan (1) kenaikan pada setiap angka kesepuluh.
Anda dapat mengunduh proyek ModelSim, termasuk testbench, dengan menggunakan formulir di bawah ini.
Jika Anda menerapkan modul seg7 sebagai modul teratas pada FPGA, kemungkinan besar layar akan menampilkan “00” yang stabil. Itu karena '0' adalah nilai default paling umum yang diberikan pada sinyal yang tidak diinisialisasi di FPGA. Ketika value sinyal disetel ke semua nol, layar akan menampilkan hal itu.
Untuk menelusuri semua kemungkinan nomor masukan, saya membuat modul VHDL pembungkus yang menambah value sinyal sepuluh kali per detik. Saya kemudian membuat instance modul seg7 di bungkusnya sebelum saya mengimplementasikan desain pada Lattice iCEstick. Video Gif perulangan di bawah ini menunjukkan tampilan desain yang diterapkan pada tampilan 7 segmen.
Membeli SSD Pmod:Tampilan Tujuh Segmen
Tampilan 7 segmen yang digunakan dalam postingan blog ini berasal dari Digilent. Anda dapat membeli modul Pmod dari webshop Digilent, atau Anda bisa mendapatkannya dari salah satu dari banyak reseller. Pada daftar di bawah, saya telah menautkan ke halaman produk untuk dipajang di beberapa toko elektronik online yang menjual barang tersebut.
- Rajinan
- Kunci Digi
- Pengguna tikus
- RS Electronics (Inggris Raya)
(Buka halaman utama RS Electronics untuk memilih situs untuk negara Anda)
- Farnell (Inggris Raya)
(Buka halaman utama Farnell untuk memilih situs untuk negara Anda)
Harap dicatat bahwa jika Anda ingin menggunakan tampilan 7-segmen Digilent dengan Lattice iCEstick , atau papan pengembangan FPGA lainnya yang memiliki konektor Pmod 6×2-pin, Anda juga memerlukan kabel splitter. Kabel tersedia dari Digilent , Kunci Digi , Pengguna tikus , dan RS Elektronik .
Selain itu, semua komponen tersedia dari berbagai penjual di Amazon dan eBay.
Kursus VHDL menggunakan tampilan 7-segmen Digilent
Saya telah meluncurkan kursus VHDL dan FPGA baru untuk pemula. Dalam kursus ini, saya menggunakan tampilan 7-segmen dari Digilent dan papan pengembangan Lattice iCEstick FPGA untuk mengajarkan VHDL. Klik tautan di bawah untuk membaca lebih lanjut tentang kursus ini!
Jalur Cepat FPGA dan VHDL:
Praktek untuk Pemula Mutlak
Apakah Anda akrab dengan pemrograman tetapi baru mengenal VHDL?
Apakah Anda memerlukan pengenalan singkat tentang subjek asing ini?
Apakah jadwalmu padat dan tidak ada waktu lagi untuk belajar?
Pahami dasar-dasar pengembangan FPGA menggunakan VHDL dalam beberapa malam! Kursus ini diperuntukkan bagi para profesional TI dan pelajar yang membutuhkan pembahasan subjek secara cepat. Dengan kursus ini dan papan pengembangan Lattice iCEstick berbiaya rendah, Anda akan mengembangkan perangkat keras sebenarnya dalam hitungan jam.
Klik di sini untuk membaca lebih lanjut dan mendaftar:
Jalur Cepat FPGA dan VHDL:Praktik Langsung untuk Pemula