FPGA FPGA ile RS232 Haberleşmesi(Transmitter) By Ahmet Memeşil Posted on 21 Ocak 2016 7 min read 5 0 4,421 Paylaş ! Facebook Paylaş ! Twitter Paylaş ! Google+ Paylaş ! Reddit Paylaş ! Pinterest Paylaş ! Linkedin Paylaş ! Tumblr Merhaba arkadaşlar, Bugün sizlere FPGA ile bilgisayar arasında RS232 haberleşme protokolünün transmitter katını anlatmaya çalışacağım.RS232 eski bir haberleşme yöntemi olmasına rağmen gönümüzde önemini hala korumaktadır. Projemizde deney setimizin RS232 portunu USB-RS232 dönüştürücü ile bilgisayara bağladıktan sonra 8 bitlik verileri deney setimizin SW(0) dan SW(7) ye kadar olan switchlerinden FPGA e göndereceğiz, gönderilen verileri REALTERM programını kullanarak anlık olarak bilgisayardan izleyebileceğiz. Projemizde sekiz bitlik data girişi, oluşturduğumuz modülü aktifleştirmek için enable, 50 MHz clock girişi, modülü resetlemek için reset girişi bulunacak çıkışlar ise seri olarak verilerin gönderildiği tx ve verinin gönderildiğini gösteren done çıkışından oluşacak. RS232 haberleşmede start bitinden sonra 8 bitlik bilgi, parity biti ve son olarak stop bitinden oluşmaktadır. (Projemizde parity biti kullanılmayacaktır.) İsteğe bağlı olarak 8 bit’den daha küçük veri paketleri gönderilebilinir fakat genel olarak 8 bit’lik haberleşme paketleri kullanıldığı için projemizde bizde 8 bitlik veri göndereceğiz. Yukarıdaki şekile baktığımızda veri yolu ilk olarak birden sıfıra düştüğü anda (start biti) alıcı taraf verinin gelmeye başlayacağını anlar, start bitinden sonra gelen 8 bit veri olarak alınır ve 8 bitin sonunda gelen bit sıfır olunca haberleşmenin bittiği anlaşılır. Bu haberleşme esnasında gönderici taraf ile alıcı tarafın bir biriyle senkron bir şekilde çalışması gerekmektedir. Alıcı ile gönderici arasındaki bu uyumu yakalamak için baudrate kavramını bilmek gerekir. Baudrate saniyede gönderilmesi gereken bit sayısını belirtmektedir. Projemizde 9600 baudrate kullanacağımız için deney setimizde ki 50MHz’lik sinyal ile haberleşme sistemimizin düzgün çalışması için uygun bir bekleme miktarı hesaplamamız gerekir bunun için bekleme=50Mhz/9600 işleminden yaklaşık olarak 5200 değerinde bir sayı elde ederiz bu değeri VHDL kodumuzda her bir bitin gönderilmesinden sonra bekleme miktarı olarak kullanacağız. Sistemimizin çalışma şeması yukarıdaki gibi olacak. VHDL KODU: [php] library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity rs232_txd is Port ( clk : in STD_LOGIC; reset : in STD_LOGIC; input : in STD_LOGIC_vector(7 downto 0); start : in STD_LOGIC; done : out STD_LOGIC; clean : out std_logic; —CTS çıkışı output : out STD_LOGIC ); end rs232_txd; architecture Behavioral of rs232_txd is constant bekleme:integer:= 5200;–baudrate sistemin bekleme süresi type state_type is (idle,starttx,sendtx,stoptx); signal state,state_next:state_type; signal N,N_next:integer; signal count,count_next:integer; signal data,data_next:std_logic; begin process(clk,reset) begin if reset = ‘1’ then state<= idle; count<= 0; data<=’1′; N<=0; elsif clk=’1′ and clk’event then state<=state_next; count<=count_next; data<=data_next; N<=N_next; clean<=’0′; end if; end process; process(state,count,data,N,start,reset) begin data_next<=’1′; count_next<=count; state_next<=state; N_next<=N; done<=’0′; case state is when IDLE=> if start= ‘1’ and reset=’0′ then state_next<=start_txd; end if; when starttx => count_next<=count+1; data_next<=’0′; if count = bekleme then count_next<=0; state_next<=send_txd; end if; when sendtx => count_next<=count+1; data_next<= input(N); if count = bekleme then if N= 7 then state_next<=stop_txd; N_next<=0; else N_next<=N+1; end if; count_next<=0; end if; when stoptx => count_next<=count+1; if count = bekleme then count_next<=0; done<=’1′; state_next<=idle; end if; end case; end process; output<=data; end Behavioral; [/php] Realterm programında bilgisayarın port 3 girişinden gelen bilgi. Projeyi gerçekleştirmede büyük katkısı olan FPGANEDİR.COM sitesi yazarlarına teşekkürü bir borç bilirim.