FPGA FPGA ile RS232 Haberleşmesi(Receiver) By Ahmet Memeşil Posted on 24 Ocak 2016 6 min read 0 0 3,246 Paylaş ! Facebook Paylaş ! Twitter Paylaş ! Google+ Paylaş ! Reddit Paylaş ! Pinterest Paylaş ! Linkedin Paylaş ! Tumblr Merhaba arkadaşlar, Çizgi market sponsorluğunda tarafımıza gönderilen FPGA ile çalışmalarımız devam ediyor.FPGA kitine buradan ulaşabilirsiniz. Önceki paylaşımlarımızda RS232 haberleşme projemizin gönderici (transmitter) katını tasarlamıştık. Şimdi projemizin alıcı (receiver) katını tasarlayacağız. Bu projemizde realterm programını kullanarak bilgisayarın seri portundan (USB) gelen bilgileri USB-RS232 çevirici yardımıyla deney setimizin RS232 girişine bağlayıp gelen verileri set üzerinde bulunan ledler yardımıyla izleyeceğiz. Gönderici katında verileri göndermeden önce start biti olarak 1 den 0 a düşen sinyal oluşturmuştuk, alıcı kısmında ise verilerin gelmeye başladığını yine 1 den 0 a düşen sinyali bekleyeceğiz. Start biti geldikten sonra gelen 8 tane bit veri olarak saklanacak daha sonra gelen bit sıfır olduğunda stop biti olduğu anlaşılacak ve haberleşme tamamlanacak. Gelen verilerin periyodu yine gönderici katında olduğu gibi haberleşmenin baudrate hızına bağlıdır. Alıcının ve vericinin senkron biçimde çalışa bilmesi iki tarafında baudrate hızını bilmesi gerektirir. RECEIVER VHDL kod: [php] library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity rs232receiver is Port ( clk : in STD_LOGIC; temizle : out std_logic; reset : in STD_LOGIC; input : in STD_LOGIC; aktif : in STD_LOGIC; done : out STD_LOGIC; output : out STD_LOGIC_VECTOR (7 downto 0)); end rs232receiver; architecture Behavioral of rs232rx is constant bekleme:integer:=5200;— 50M/9600 type durum_type is (idle_rxd,start_rxd,receive_rxd,stop_rxd); signal durum,durum_next:durum_type; signal data,data_next: std_logic_vector(7 downto 0); signal x,x_next:integer; signal start_bit,stop_bit:std_logic; signal data_receive,input_next:std_logic; signal counter,counter_next:integer; begin process(clk,reset) begin if reset= ‘1’ then durum<=idle_rxd; data<=(others=>’0′); x<=0; input_next<=’0′; counter<=0; elsif clk=’1′ and clk’event then —değişkenlerin atanması durum<=durum_next; — bir sonraki durum x<=x_next; counter<=counter_next; input_next<=input; temizle<=’0′; —veri alabilir RTS. end if; end process; data_receive<= input_next and (not input); —dusen kenar tespiti (start biti başlangıcı) process(aktif,data_receive,x,data,durum,counter,reset) begin durum_next<= durum; x_next <=x; data_next<=data; counter_next <=counter; done<=’0′; case durum is when IDLE_RxD => if aktif = ‘1’ and data_receive=’1′ and reset=’0′ then durum_next<=start_rxd; end if; when START_RxD=> counter_next<=counter +1; if counter = bekleme/2 then if input= ‘0’ then durum_next<= receive_rxd; else durum_next<= idle_rxd; end if; counter_next<=0; end if; when RECEIVE_RxD=> counter_next<=counter +1; if counter = bekleme then data_next(x)<=input; counter_next<=0; if n= 7 then x_next<=0; durum_next<=stop_rxd; else x_next<=x +1; end if; end if; when STOP_RxD=> counter_next<=counter +1; if counter = bekleme then counter_next<=0; if input= ‘1’ then done<=’1′; end if; durum_next<=idle_rxd; end if; end case; end process; output<=data; — alınan veriyi çıkışa ata end Behavioral; [/php] REALTERM programından gönderilen bilgi Çıkışta alınan “11001000” bilgisi.