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

watch_later 4/22/2016
comment 3 Comments
Saklayıcılar (Registers)
Ardışıl devre analiz ve sentezi için saklayıcılar örnek oluşturur. Ayrıca daha büyük çaplı ardışıl devrelerin tasarımında kullanılabilirler. Flip-flop’lar tek bir bit tutarken saklayıcılar daha büyük miktarda veri tutabilmektedir. Saklayıcılar modern işlemci tasarımının merkezidir. Farklı tür saklayıcılar vardır.
Örneğin, iki bitlik sayıcı tasarımı için iki tane flip-flop kullanmak zorundayız.

Bir saklayıcı(register) bir flip-flop’un birden fazla bit saklayacak halde geliştirilmiş halidir. Saklayıcılar genellikle işlemcilerde geçici saklama yapmak için kullanılır(temporary storage). Ana hafızaya göre daha hızlı ve daha elverişlidir. Ayrıca saklayıcılar kompleks hesaplamaları hızlandırır. Temel saklayıcıların tasarımı oldukça basittir


Bir 4 bit saklayıcı:
Bu saklayıcıda D flip-floplar kullanılmıştır. Böylece flip-flop giriş denklemleri ile uğraşmadan veriyi tutulabilir. Tüm flip-flop’ların clock ve clear sinyali ortaktır.

Paralel 4 Bit Saklayıcı Devre Simülasyonu
module parallel_reg(Q3,Q2,Q1,Q0,D3,D2,D1,D0,clock,clear);
output Q3,Q2,Q1,Q0;
input  D3,D2,D1,D0,clock,clear;
reg    Q3,Q2,Q1,Q0;

always @(posedge clock or negedge clear)
  if(~clear)
    {Q3,Q2,Q1,Q0}<=4'b0000;
  else
  begin
    Q3 <= D3;
    Q2 <= D2;
    Q1 <= D1;
    Q0 <= D0;
  end
endmodule
Paralel Yükleme (Parallel Load)
D3-D0 girişleri her bir saat periyotunda Q3-Q0 çıkışlarına kopyalanır. Saklayıcıya bir Load(Enable) yükleme girişi eklenebilir.

Eğer Load = 0 ise, saklayıcı şimdiki değerlerini tutar.
Eğer Load = 1 ise, saklayıcı D3-D0 girişlerinden yeni bir değer alır.

Paralel Yükleme ile 4 Bit Saklayıcı Devre Simülasyonu
module parallel_reg(Q3,Q2,Q1,Q0,D3,D2,D1,D0,clock,clear,Load);
output Q3,Q2,Q1,Q0;
input  D3,D2,D1,D0,clock,clear,Load;
reg    Q3,Q2,Q1,Q0;
always @(posedge clock or negedge clear)
  if(~clear)
      {Q3,Q2,Q1,Q0}<=4'b0000;
  else 
 if(Load)
   begin
         Q3 <= D3;
          Q2 <= D2;
          Q1 <= D1;
         Q0 <= D0;
   end
endmodule
Ötemeli Saklayıcı (Shift Register)
Bir ötelemeli saklayıcı çıkışını her bir saat periyotunda öteler. SI girişi saklayıcıya ötelenecek yeni biti sağlayan giriştir. Örneğin, bir saat pozitif yükselen kenarlarında:

SI = 1
Q0-Q3 = 0110
ise sonraki durum aşağıdaki gibi olacaktır:
Q0-Q3 = 1011
Mevcut durumda Q3 (bu örnek için 0) sonraki periyotta kaybolacaktır.

Ötelemeli 4 Bit Saklayıcı Devre Simülasyonu
module shift_reg(serial_output,serial_input,clock);
output serial_output;
input  serial_input,clock;
reg    out3,out2,out1,out0;
  
assign serial_output=out3;
  
always @(posedge clock)
  begin
    out3 <= out2;
    out2 <= out1;
    out1 <= out0;
    out0 <= serial_input;
  end
endmodule
Evrensel Ötelemeli Saklayıcı (Universal Shift Register)
1. clear girişi ile saklayıcı sıfırlama işlevi
2. clock girişi
3. shift-right yani sağa kaydırma işlevi
4. shift left yani sola kaydırma işlevi
5. n sayıda giriş hattı ve paralel yükleme(parallel load) işlevi
6. n sayıda paralel çıkış hattı

s1
s2
Saklayıcı İşlemi
0
0
Değişiklik Yok
0
1
Shift Right
1
0
Shift Left
1
1
Paralel Yükleme
Evrensel Ötelemeli 4 Bit Saklayıcı Devre Simülasyonu
// 4-bit universal shift register
module Shift_Register_4_beh (  
 output reg [3: 0] O_par,   // Output
 input [3: 0] I_par,    // Paralel Input
 input s1, s0,     // Select Inputs
 MSB_in, LSB_in,    // Serial Inputs
 clock,                                                              
 clear);                    
 always @ ( posedge clock, negedge clear) 
if (clear== 0) 
 O_par <= 4'b0000;
else
case ({s1, s0})
 2'b00: O_par <= O_par;    // No Change
 2'b01: O_par <= {MSB_in, O_par[3: 1]};  // Shift Right
 2'b10: O_par <= {O_par[2: 0], LSB_in};  // Shift Left
 2'b11: O_par <= I_par;    // Parallel Load 
endcase
endmodule
Sayıcılar (Counters)
Sayıcılar n bitlik bir bilgiyi tutmanın yanısıra her saat çevriminde tuttukları değeri artıran veya azaltan ardışıl devrelerdir.
Genel olarak iki gruba ayrılır:
1. Senkron Sayıcılar
2. Asenkron Sayıcılar (Ripple Sayıcılar)
Yaptığı işe göre oldukça fazla kullanılan sayıcılar standart hale gelmiştir ve hazır devre olarak piyasada bulunmaktadır.
Senkron Sayıcılar (Synchronous Counters)
Senkron sayıcılarda tüm flip-flop’lara uygulanan ortak bir saat (clock) devresi yer almaktadır. Böylece tüm flip-flop’lar senkronize bir şekilde saatin her bir pozitif kenarında tetiklenmekte ve çıkış üretmektedir.

Mevcut Durum
Sonraki Durum
A3
A2
A1
A0
A3
A2
A1
A0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
1
0
0
0
1
0
0
0
1
1
0
0
1
1
0
1
0
0
0
1
0
0
0
1
0
1
0
1
0
1
0
1
1
0
0
1
1
0
0
1
1
1
0
1
1
1
1
0
0
0
1
0
0
0
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
1
1
1
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
1
1
0
1
1
1
1
0
1
1
1
0
1
1
1
1
1
1
1
1
0
0
0
0


4 Bit Senkron Sayıcı Devre Simülasyonu
module binary_counter(out4, out3, out2, out1, clk);
output out4, out3, out2, out1;
input  clk;
reg    out4, out3, out2, out1;

always @(posedge clk)
  begin
    out4 <= (out1 & out2 & out3) ^ out4;
    out3 <= (out1 & out2) ^ out3;
    out2 <= out1 ^ out2;
    out1 <= out1 ^ 1b'1;//out1 <= ~out1;
  end
endmodule

Verilog HDL'de ikili sayıcı oluşturmak için daha basit bir kod bloğu:

module binary_counter(out, clk);
output [3:0] out;
input  clk;
reg    [3:0] out;

always @(posedge clk)
    out <= out + 1;  
endmodule






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

Detaylı açıklamalarından dolayı teşekkür ederim emeğine sağlık

delete 23 Mayıs 2017 23:23
avatar

Değerli yorumun için teşekkürler.

delete 27 Mayıs 2017 09:19
avatar

İkinci yükselen kenar tetiklemeyi bulmayi jk flip flobuyla tasarladim ama kodu yazamıyorum yardımcı olabilir msiniz

delete 26 Ekim 2017 00:51



sentiment_satisfied Emoticon