fpganedir.com'da ara

fpganedir mail

  * Periyot Hesaplama   

    * Simülasyon

Proje Tanımı:

Bu programımızda input olarak girilen bir sinyalin periyotunu bulacağız.

Projede neler yapacağız

Periyot Bulma

Sinyal periodu, input sinyalinin iki yükselen ucu (rising edge) arasındaki sistem clock sayısı ile sistem clock'unun periodu çarpılarak bulunabilir.

1

Input(giriş) sinyalinin perioduna Toutput,
Input sinyalinin iki yükselen ucu arasındaki sistem clock saysına N ;
System clockun  perioduna Tclk der isek ;

Tout= N x Tckl olur.

Programımızda, sistem clock'uğunu 50 Mhz (20 ns)olarak alacağız.

Programızda count ve N isminde iki değişken tanımlayacağız. Count, 0 dan   49 999 kadar sayıp tekrar 0 dönecek ve her 49 999 (20 ns * 50 000 = 1 ms ) ulaştığında N değişkenini bir artıracak ve Sinyal peryodumuz= N ms olacak.

Programızda 3 durum tanımlayacağız.

İdle :  Bu durumda programımız çıktı olarak hazır sinyali gönderecek ve başla (basla) komutunu bekleyecek.

Bekle: Basla sinyali  '1' ise program bekle durumuna geçecek ve peryodu ölçülecek sinyalin ilk yükselen ucunu bekleyecek. (Yükselen ucunu RTL edge detector yöntemini kullanarak detect edeceğiz.) Her hangi bir edge detect ettiğinde (sinyalin yükselen ucu geldiğinde) N ile sayıcı 0 lanıp,  program period durumuna geçecek.

Period Bu drumunda sinyalin ikinci yükselen ucu gelinceye kadar her 1 ms lik aralıklarla N 1 artıracağız. Ve yükselen uçta islem tamam sinyalini gönderdikten sonra idle durumuna geçecek.


1

 

VHDL KOD

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Period_counter is
       Port ( clk             :  in   STD_LOGIC;
                  reset        :  in    STD_LOGIC;
                  basla       :  in    STD_LOGIC;
                  sinyal       :  in    STD_LOGIC;
                  hazir         :  out  STD_LOGIC;
                  islem_t    :  out  STD_LOGIC;
                  output      :  out  STD_LOGIC_VECTOR (9 downto 0)  );
end Period_counter;

architecture Behavioral of Period_counter is
     type state_type is (IDLE,BEKLE,PERIOD);
     signal state, state_next: state_type;
     signal N,N_next: STD_LOGIC_VECTOR (9 downto 0);
     signal count,count_next : integer :=0;
     signal edge,edge_delay:STD_LOGIC;
begin
      process(clk,reset)
      begin
            if reset='1' then
                 state<= IDLE;
                 N<=(others=>'0');
                 count<=0; 
                 edge_delay<='0';
            elsif  clk= '1' and clk'event then
                 state<=state_next;
                 N<=N_next;
                 count<=count_next;
                 edge_delay<= sinyal;
            end if;
      end process;
      edge<= (not edge_delay) and sinyal;
      process(basla,state,count,N,edge,reset)
      begin
             hazir<='0';
             islem_t<='0';
             state_next<=state;
             count_next<=count;
             N_next<=N;
            case state is
                    when IDLE=>                       
                               hazir<='1';
                               if basla = '1' and reset = '0'  then                                            
                                       state_next<= BEKLE;
                               end if;
                     when BEKLE=>
                               if edge = '1' then
                                     count_next<= 0;
                                     N_next<="0000000001";
                                     state_next<=PERIOD;
                               end if;
                     when PERIOD=>
                               if edge = '1' then
                                     islem_t<= '1';
                                     state_next<=IDLE;
                               else
                                     if count=49999 then
                                             count_next<=0;
                                             N_next<= N+1;
                                     else
                                             count_next<= count+1;
                                     end if;                                                              
                               end if;
           end case;
    end process;
    output<=N;
end Behavioral;

 

Anasayfa | Fpga | VHDL | VHDL Sözlüğü | Embedded Sistem | Android | Sayısal Tasarım | Simulasyon | PCB | Örnekler | Forum | İletişim
Copyright © 2010-2013 FPGAnedir. All Rights Reserved.