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...