İmgede Konvulüsyon İşleminin FPGA Tabanlı Gerçeklenmesi

Bu yazıda, VHDL ile Sayısal Tasarım ve FPGA Uygulamaları kitabında benzetim uygulamalarında anlatılan 9.15 örneğindeki İmgede Konvolüsyon uygulamasının FPGA tabanlı gerçeklenmesi tanıtılmıştır. Uygulama MATLAB ile UART haberleşme vasıtasyıla görüntü dosyasının aktarılması ve FPGA tabanlı gerçeklenen konvolusyon işleminin FPGA’da gerçeklenmesinin sonucunda elde edilen yeni imge yine UART haberleşme ile MATLAB’a aktarılmaktadır. Aşağıda bu işlemlerin yapıldığı entity mimarisi gösterilmiştir.

Port ( 
		in_clk : in std_logic;
		in_rst : in std_logic;
		in_basla : in std_logic;
		in_rx : in std_logic;
		out_tx : out std_logic
	);

Konvolüsyon işleminin yapılmasında kullanılan alt devrelerin çağrılma işlemine ilişkin kodlar aşağıda verilmiştir. konvolusyon_imge alt modülü , VHDL ile Sayısal Tasarım ve FPGA Uygulamaları kitabının Bölüm 9.15’inde, UART_rx ve UART_tx alt modülleri ise Bölüm 10.5’inde verilmiştir. Konvolüsyon işlemi olarak yatay sobel seçilmiştir.

UART_rx_map : UART_rx
	Generic map( 
        CLK_FREKANS => 100000000, --100 MHz
        BAUDRATE => 115200
    )
    Port map(
        in_clk => in_clk,
        in_rst => in_rst,
        in_rx => in_rx,
        out_rx_data => r_rx_data,
        out_rx_tamam => r_rx_tamam
    );	
 
	UART_tx_map : UART_tx
	Generic map( 
        CLK_FREKANS => 100000000, --100 MHz
        BAUDRATE => 115200
    )
    Port map(
        in_clk => in_clk,
        in_rst => in_rst,
        in_tx_basla => r_tx_basla,
        in_tx_data => r_tx_data,
        out_tx => out_tx,
        out_tx_tamam => r_tx_tamam
    );
 
    konvolusyon_imge_map : konvolusyon_imge
    port map( 
        in_clk => in_clk,
        in_rst => in_rst,
        in_en => '1',
        in_basla => in_basla,
        in_data => r_rx_data, 
        in_data_vld => r_rx_tamam,
        in_kernel => YATAY_SOBEL,
        out_addr => open,
        out_addr_vld => open,  
        out_data => r_tx_data,
        out_data_vld => r_tx_basla,
        out_tamam => open                
    );

Uygulamanın gerçeklenmesini sağlayan MATLAB kodu aşağıda gösterilmiştir.

clc, clear all, close all;
 
Serial_Port = serial('COM6');
set(Serial_Port, ... 
    'BaudRate', 115200, ...
    'Parity', 'none', ...
    'Timeout', 1, ...
    'InputBufferSize', 1, ...
    'FlowControl', 'none', ...
    'StopBits', 1);
fopen(Serial_Port);
 
imge = imread('cameraman.tif');
imge = imresize(imge, 0.25);
figure, imshow((imge))
[satir sutun] = size(imge);
out = zeros(satir - 2, sutun - 2);
imshow(out)
 
n_t = 0;
for n_i = 1 : satir - 2
    for n_j = 1 : sutun
        for n_k = 0 : 2
%             fwrite(Serial_Port, imge(n_i, n_j));
%             out(n_i, n_j) = fread(Serial_Port);
            n_t = n_t + 1;
            fwrite(Serial_Port, imge(n_i + n_k, n_j));
 
        end
        if n_j > 2
            out(n_i, n_j - 2) = fread(Serial_Port);
        end
 
    end
end
figure, imshow(uint8(out))
fclose(Serial_Port)
delete(Serial_Port)
clear Serial_Port