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