Verilog HDL ile Sayısal Tasarım VII (Digital Design with Verilog HDL VII)

watch_later 4/27/2016
Halka Sayıcı (Ring Counter)
Bir halka sayıcı aslında bir binary-decimal kod çözücüdür. Sayıcı çıkışlarında girişindeki binary değerin kodu çözülerek ilgili decimal çıkış 1 yapılacaktır. Sayma işleminin her bir biti için bir flip-flop kullanılmalıdır.

Devrede flip-flop'ların girişleri önceki flip-flop çıkışlarına bağlanmıştır. Kurma ve silme girişi ile en düşük değerli flip-flop 1 değerine kurulurken diğer tüm flip-flop'lar sıfırlanır. Gelen tetikleme sinyali ile bir sonraki flip-flop girişinde 1 görüleceğinden, çıkış 1'e çekilecektir.



clock
X
Y
Z
T
0
1
0
0
0
1
0
1
0
0
2
0
0
1
0
3
0
0
0
1
4 Bit Halka Sayıcı Devre Simülasyonu
module ring_counter(Q,Clock,Resetn); 
input Clock,Resetn;
 output [3:0] Q;
 reg [3:0] Q; 
always @(posedge Clock or negedge Resetn)     
   if(!Resetn)         
        Q <= 4'b1000;     
   else         
        Q <= {Q[0],Q[3:1]};
        //Q[3]<=Q[0];
 //Q[2]<=Q[3];
        //Q[1]<=Q[2];
        //Q[0]<=Q[1]; 
endmodule
Johnson Sayıcı (Johnson Counter)
Johnson sayıcısı veya diğer adıyla dalgalı halka sayıcısı, senkron sayıcısının bir başka şeklidir. Yapısı halka sayıcısına benzer, fakat son flip-flop’tan birinci flip-flop’a yapılan geri besleme farklı yerlerden alınmıştır. Son flip-flop’un Q değil çıkışının, ilk flip-flop’un girişine bağlanmasıyla bir Johnson sayıcı devresi elde edilir.

Ayrıca halka sayıcısındaki 1. flip-flop’u ilk anda set ve diğerleri reset edilmişken, Johnson sayıcısında ilk anda tüm flip-flop’lar resetlenir. Yani tüm flip-flop çıkışları ilk anda 0’dır. Saymanın yeniden başlaması için sistemin tekrar resetlenmesi gerekir. Başlangıçta bütün flip-flop çıkışları 0’dır. Gelen ilk tetikleme darbesi ile en düşük değerli biti taşıyan flip-flop girişindeki 1 çıkışın 1’e çekilmesini sağlayacaktır. Gelen her tetikleme sinyali ile birlikte 1 en yüksek değerli bite kadar seri olarak kaydırılacaktır. En yüksek değerli biti taşıyan flip-flop çıkışının 1 olması ile birlikte Q çıkışı 0’a çekilecek ve en düşük değerli biti taşıyan flip-flop girişinde 0 görülecektir. Bundan sonra gelen her tetikleme sinyalinde çıkışlarda sırasıyla 0 görülecektir. Bu işlem en yüksek değerli biti taşıyan flip-flop çıkışında 0 görünceye kadar devam edecektir. Devre bu durumdan sonra başlangıç adımlarına geri dönecektir.

clock
X
Y
Z
T
0
0
0
0
0
1
1
0
0
0
2
1
1
0
0
3
1
1
1
0
4
1
1
1
1
5
0
1
1
1
6
0
0
1
1
7
0
0
0
1
4 Bit Jonhson Sayıcı Devre Simülasyonu
module johnson_counter(X,Y,Z,T,clock,Resetn);
 input clock,Resetn; 
output X,Y,Z,T; 
reg X,Y,Z,T;
always @(posedge clock or negedge Resetn)     
if(!Resetn)         
{X,Y,Z,T} <= 4'b0000;     
else       X <= ~T;
   Y <= X;
   Z <= Y;
   T <= Z;
endmodule
Yükselen Kenar Algılayıcı (Rising Edge Detector)

Yükselen Kenar Algılayıcı Devre Simülayonu
module rising_edge_detector (outputs, signal_in, clk);
  input signal_in, clk;
  output outputs; 
  wire outputs;
  reg signal_d;
   
always @ (posedge clk) 
begin 
       signal_d <= signal_in;     
end
assign outputs = (~signal_d) & signal_in;
endmodule
Düşen Kenar Algılayıcı (Falling Edge Detector)

Düşen Kenar Algılayıcı Devre Simülayonu
module falling_edge_detector (outputs, signal_in, clk);
  input signal_in, clk;
  output outputs; 
  wire outputs;
  reg signal_d;
   
always @ (posedge clk) 
begin 
       signal_d <= signal_in;      
end
assign outputs = (~signal_in) & signal_d;
endmodule
Sonlu Durum Makineleri (Finite State Machine(FSM))
Devre tasarımı durum dizi elemanlarının ardışık eylemlerine bağlı olduğu zaman, bir sonlu durum makinesi (FSM) oluşturulabilir.
FSM devre tasarımının kullanıldığı alanlar:
1. Sekans Algılayıcılar
2. İlginç Sayacılar
3. Trafik Işık Kontrolü
4. Veri-Yolu Kontrolü
5. Aygıt Arabirim Denetleyicisi
Tüm durum makineleri genel geri bildirim yapıya sahiptir. Kombinasyonel mantık devresini Next-State Logic uygular. Makinenin sonraki durum (next state) mevcut durumu (current state) ve diğer girişlerden oluşur. Memory(State Register) mevcut durumunu(current state) durum saklayıcıda tutar.
Sonlu Durum Makinesi İlkel Blok Devre Simülasyonu 
Moore Durum Makinesi (Moore State Machine)
Moore modelinde çıkış sadece şimdiki durumun bir fonksiyonudur. Çıkışlar bir saat yardımıyla eş zamanlanırlar.
next_state(t) = h(current_state(t), inputs(t))
outputs = g(current_state(t))

Moore Durum Makinesi Blok Devre Simülasyonu
Mealy Durum Makinesi (Mealy State Machine)
Mealy modelinde çıkış hem şimdiki durum hem de girişin bir fonksiyonudur. Çıkışlar girişler saat döngüsü (clock cycle) boyunca değişebilir.
Bir Mealy modeli devreyi eş zamanlamak için girişlerin saat ile eşzamanlı olması ve çıkışların da daima bir saat kenarından hemen önce örneklenmesi gerekmektedir.
next_state(t) = h(current_state(t), inputs(t))
outputs(t) = g(current_state(t), inputs(t))
Mealy Durum Makinesi Blok Devre Simülasyonu
FSM Verilog HDL kodu üç ana blok içerir:
1. Durum Kodlama (State Encoding)
2. Kombinasyonel Blok (Combinational Block)
3. Ardışıl Blok (Sequential Block) 
Durum Kodlama (State Encoding)
Birçok şifreleme şekli bulunmaktadır. Bunlardan bazısı listelenmektedir:
1. Binary(İkili) Kodlama
2. Bir Sıcak(One Hot) Kodlama
3. Bir Soğuk(One Cold) Kodlama
4. Gri(Gray) Kodlama
5. Johnson Kodlama
//Bir Sıcak Kodlama(One Hot Encoding) 
parameter [4:0] IDLE = 5'b00001; 
parameter [4:0] S0 = 5'b00010; 
parameter [4:0] S1 = 5'b00100; 
parameter [4:0] S2 = 5'b01000; 
parameter [4:0] S3 = 5'b10000; 
//Bir Soğuk Kodlama(One Cold Encoding) 
parameter [4:0] IDLE = 5'b11110; 
parameter [4:0] S0 = 5'b11101; 
parameter [4:0] S1 = 5'b11011; 
parameter [4:0] S2 = 5'b10111; 
parameter [4:0] S3 = 5'b01111; 
//İkili Kodlama(Binary Encoding) 
parameter [2:0] IDLE = 3'b000; 
parameter [2:0] S0 = 3'b001; 
parameter [2:0] S1 = 3'b010; 
parameter [2:0] S2 = 3'b011; 
parameter [2:0] S3 = 3'b100; 
//Gri Kodlama(Gray Encoding) 
parameter [2:0] IDLE = 3'b000; 
parameter [2:0] S0 = 3'b001; 
parameter [2:0] S1 = 3'b011; 
parameter [2:0] S2 = 3'b010; 
parameter [2:0] S3 = 3'b110; 
//Johnson Kodlama(Johnson Encoding) 
parameter [2:0] IDLE = 3'b000; 
parameter [2:0] S0 = 3'b100; 
parameter [2:0] S1 = 3'b110; 
parameter [2:0] S2 = 3'b111; 
parameter [2:0] S3 = 3'b011; 
parameter [2:0] S3 = 3'b001; 

Verilog HDL FSM Minimum İskeleti (FSM Minimum Skeleton)

module mod_name (outputs, inputs);
  input inputs;
  output outputs; 
  parameter size = sizes;
  reg [size-1: 0] current_state;
  reg [size-1: 0] next_state;
 
  // Durumlar dahil edilir.
  `define state_0 2'b00
  `define state_1 2'b01
   
always @ (current_state or the_inputs) //Next State Logic 
begin
    // Next-State denklemi için if veya case yapısı tanımlanır.
    // Atama işlemleri yapılır. 
  end
always @ (negedge reset or posedge clk) //State Resgister (Memory)
begin 
    if (reset == 1'b0) current_state <= state_0; 
    else                     current_state <= next_state;
  end
           //Output atamaları
endmodule
Sekans Algılayıcı (Sequence Detector)
Ardışık iki tane 0 ya da 1 içeren sekans algılayıcı tasarlansın.

Sekans Algılayıcı Devre Simülasyonu
module seq_detect (out_bit, clock, reset, in_bit);
  input clock, reset, in_bit;
  output out_bit;
  
  reg [2:0] state_reg, next_state;

  // State declaration
  parameter    reset_state =   3'b000;
  parameter    read_1_zero =   3'b001;
  parameter    read_1_one  =   3'b010;
  parameter    read_2_zero =   3'b011;
  parameter    read_2_one  =   3'b100;
  
  // state register
  always @ (posedge clock or posedge reset)
     if (reset == 1) 
        state_reg <= reset_state; 
     else  
        state_reg <= next_state;

  // next-state logic
always @ (state_reg or in_bit) 
    case (state_reg)
        reset_state: 
              if (in_bit == 0) 
                  next_state = read_1_zero; 
              else
                  next_state = read_1_one;
        read_1_zero: 
              if (in_bit == 0) 
                  next_state = read_2_zero; 
              else
                  next_state = read_1_one;
        read_2_zero: 
              if (in_bit == 0) 
                  next_state = read_2_zero; 
              else
                  next_state = read_1_one;              
        read_1_one: 
            if (in_bit == 0) 
                next_state = read_1_zero;
            else
                next_state = read_2_one;
        read_2_one: 
            if (in_bit == 0) 
                next_state = read_1_zero; 
            else
                next_state = read_2_one;
  default: next_state = reset_state;
  endcase

  //always blok da kullanılabilir çıkış için
  assign out_bit = ((state_reg == read_2_zero) || (state_reg == read_2_one)) ? 1 : 0;
endmodule


Frekans Bölücü (Frekans Divider)
Yukarı ve aşağı sayıcıların zaman diyagramlarına bakıldığı zaman her FF'nin giriş sinyal frekansını 2'ye bölme özelliği gösterdiğini görülebilir. clock 16 Hz ise FF1' in Q çıkışındaki frekans 8 Hz, FF2'nin Q çıkışındaki frekans 4 Hz, FF3'nin Q çıkışındaki frekans 2 Hz, FF4'ün Q çıkışındaki frekans ise 1 Hz dir. Genel olarak n bitlik bir binary sayıcının çıkış frekansı;
Fout = Fclock/2n dir.

Frekans Bölücü Çalışma Simülasyonu
Frekans bölücü tasarımında 50 MHz Frekansı Duty Cycle %50 iken 1 KHz frekansa ayarlansın.



module frequency_divider(clk_out,clk,rst);   
input clk,rst;      
output clk_out;
reg clk_out;      
reg [14:0] counter; //2^15      
always @(posedge clk or negedge rst)
      if(!rst)      
     begin           
       counter <= 15'd0;           
       clk_out <= 1'b0;      
     end      
     else  
     begin           
      if(counter==15'd25000)           
      begin                
       counter <= 15'd0;                
       clk_out <= ~clk_out;           
      end           
      else           
      begin                
        counter <= counter+1;
       //clk_out <= clk_out;           
      end 
     end
endmodule 





Bir sonraki yazımda görüşmek üzere...



sentiment_satisfied Emoticon