Yaptığımız tasarımları bilgisayarda benzetim ortamında test ederken, tasarım tarafından işlenecek pek çok veri olabilir. Örneğin imge üzerinde çeşitli işlemler yapan bir tasarımı sınamak için imgenin de tasarlanan sisteme giriş olarak verilmesi gerekebilir. Böyle durumlar için VHDL bize dosyadan veri okuma ve yazma imkanı sunmaktadır.
VHDL ile dosyadan okuma ve yazma işlemi yapabilmek için kütüphane bildirim kısmına aşağıda verilen söz diziminin eklenmesi gerekmektedir. Bu söz dizimi ile birlikte dosya işlem komutları kullanılabilir hale gelmektedir.
use std.textio.ALL;
Tanımlanan veri yoluna ait dosyanın okuma modunda dosya değişkeninde açılmasına ilişkin söz dizimi aşağıda verilmiştir. Söz diziminde tanımlı text open söz dizimleri ile tanımlanan read_mode söz dizimi ile dosyanın okuma modunda açılıacağı tanımlanmaktadır.
file dosya : text open read_mode is VERI_YOLU;
Dosyadan okunacak olan satır, variable değişkeni olarak tanımlanmaktadır. satir değişkeni tanımlamaya ait söz dizimi aşağıda verilmiştir.
variable satir : line;
Dosyadan okuma işlemlerinde dosyanın sonuan gelinip gelinmediğinin kontrol işlemleri için aşağıdaki sözdizimi kullanılmaktadır.
if not endfile(dosya) then .. .. end if;
Dosyadan ilgili satırdan verilerin okunması işlemine ait söz dizimi aşağıda verilmiştir.
readline(dosya, satir); read(satir, data);
Dosya üzerine yazım işlemi de okuma işlemine benzer şekilde yapılabilmektedir. Bunun için ilk olarak yazılacak dosyanın tanımlanması gerekmektedir. Aşağıda bu işlem için gerekli söz dizimi verilmiştir.
file dosya : text open write_mode is VERI_YOLU;
Dosya açma işlemi gerçekleştirdikten sonra yazılacak verilerin düzenlenmesi, dosyaya yazmaya hazır hale getirilmesi gerekmektedir. Bunun için gerekli söz dizimi aşağıda verilmiştir.
write(satir, data); writeline(dosya, satir);
Örnek 1: Aşağıda sinüs örneklerinin var olduğu sin.txt dosyasında kayıtlı integer sayıların okunmasına ilişkin dosya_okuma_integer.vhd VHDL kodu verilmiştir. 4. satırda metin dosyasından okuma/yazma yapabilmek için kütüphane bildirimi yapılmıştır. Bu kod benzetim amacı ile kullanılacağından dolayı varlık içerisinde port tanımlaması yapılmamıştır.
12. satırda sinüs örneklerinin bulunduğu sin.txt dosyasına ait veri yolu tanımlama işlemi string tipinde VERI_YOLU_OKUMA constant veri nesnesi ile tanımlanmıştır. Okunan sinüs örnekerşnin yazılacağı dosya veri yolu 13. satırda tanımlanmıştır. 27. satırda sin.txt dosyası okuma modunda açılmıştır. 28. satırda sin.txt dosyası yazma modunda açılmıştır. 34. satırda dosyanın sonuna gelinip gelinmediğinin kotnrol işlemini yapan söz dizimi tanımlanmıştır. Dosyanın sonuna gelinmediği durumalrda ilgili satırda bulunan veriler dosyadan okunarak data değişkenine atanmaktadır. integer tipinde tanımlı data değişkeni 24 bit uzunluğunda tanımlı r_giris_data sinyaline tip dönüşümü yapılarak atanmaktadır. Aynı zamanda data değişkeninin sahip olduğu değer tekrar dosyaya yazılmaktadır. Dosyadan okuma işlemine ait benzetim çıktısı Şekil 1’de verilmiştir.
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use std.textio.ALL; entity dosya_okuma_integer is end dosya_okuma_integer; architecture Behavioral of dosya_okuma_integer is constant CLK_PERIOD : time := 150 ns; constant VERI_YOLU_OKUMA : string := "C:\sin.txt"; constant VERI_YOLU_YAZMA : string := "D:\sin.txt signal r_giris_data : std_logic_vector(23 downto 0) := (others=> '0'); signal in_clk : std_logic := '0'; begin process begin in_clk <= '1'; wait for CLK_PERIOD / 2; in_clk <= '0'; wait for CLK_PERIOD / 2; end process; process(in_clk) file dosya_okuma: text open read_mode is VERI_YOLU_OKUMA; file dosya_yazma: text open write_mode is VERI_YOLU_YAZMA; variable satir_okuma : line; variable satir_yazma : line; variable data : integer; begin if rising_edge(in_clk) then if not endfile(dosya) then readline(dosya_okuma, satir_okuma); read(satir_okuma, data); r_giris_data <= conv_std_logic_vector(data, r_giris_data'length); write(satir_yazma, data); writeline(dosya_yazma, satir_yazma); end if; end if; end process; end Behavioral;
Şekil 1 dosya_okuma_integer varlığı benzetim çıktısı
Sinüs örneklerinin bulunduğu sin.txt dosyasını oluşturmak için aşağıda verilen MATLAB kodu kullanılabilir.
clc, clear all, close all; sin_file = fopen('C:\sin.txt', 'w'); f_s = 10000; n_t = 1 / f_s : 1 / f_s : 2; f_1 = 10; A = 1 * sin( 2 * pi * n_t * f_1 ); D = round(2^20 * (A + 1)); figure, plot(A); figure, plot(D); for n_i = 1 : length(D) fprintf(sin_file, '%d\n', D(n_i) ); end
sin.txt dosyasına yazılan dataları okumak için aşağıda verilen MATLAB kodu kullanılabilir.
clc, clear all, close all; sin_file = fopen('D:\sin.txt', 'r'); sin_okunan = fscanf(sin_file, '%d')'; figure, plot(sin_okunan);
Örnek 2: Aşağıda karakter örneklerinin var olduğu karakter.txt dosyasında kayıtlı karakterlerin okunmasına ilişkin dosya_okuma_integer.vhd VHDL kodu verilmiştir. 4. satırda metin dosyasından okuma/yazma yapabilmek için kütüphane bildirimi yapılmıştır. Bu kod benzetim amacı ile kullanılacağından dolayı varlık içerisinde port tanımlaması yapılmamıştır.
12. satırda karakter örneklerinin bulunduğu karakter.txt dosyasına ait veri yolu tanımlama işlemi string tipinde VERI_YOLU constant veri nesnesi tanımlanmıştır. 26. satırda karakter.txt dosyası okuma modunda açılmıştır. 31. satırda dosyanın sonuna gelinip gelinmediğinin kotnrol işlemini yapan söz dizimi tanımlanmıştır. Dosyanın sonuna gelinmediği durumlarda ilgili satırda bulunan veriler dosyadan okunarak data değişkenine atanmaktadır. character tipinde tanımlı data değişkeni character tipinde tanımlı r_giris_data sinyaline atanmaktadır. Dosyadan okuma işlemine aiat benzetim çıktısı Şekil 2’de verilmiştir.
Şekil 2 dosya_okuma_karakter varlığı benzetim çıktısı
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use std.textio.ALL; entity dosya_okuma_karakter is end dosya_okuma_karakter; architecture Behavioral of dosya_okuma_karakter is constant CLK_PERIOD : time := 150 ns; constant VERI_YOLU : string := "C:\karakter.txt"; signal r_giris_data : character; signal in_clk : std_logic := '0'; begin process begin in_clk <= '1'; wait for CLK_PERIOD / 2; in_clk <= '0'; wait for CLK_PERIOD / 2; end process; process(in_clk) file dosya : text open read_mode is VERI_YOLU; variable satir : line; variable data : character; begin if rising_edge(in_clk) then if not endfile(dosya) then readline(dosya, satir); read(satir, data); end if; end if; r_giris_data <= data; end process; end Behavioral;