¸Sekil 1’de 16-bit kaydedici, multiplexer, toplayıcı/çıkarıcı ve kontrol birimi(sonlu durum makinesi) bulunan sa-yısal bir sistem gösterilmi¸stir. 16-bit data sisteme DIN giri¸sinden girer. Bu data 16-bitlik multiplexer aracılı˘gıyla kaydedicilere(R0, . . . , R7 ve A) aktarılır. Multiplexer aynı zamanda bir kaydedicinin içindeki datayı ba¸ska bir kaydediciye kaydetmek içinde kullanılabilmektedir. ¸Sekilde multiplexerın çıkı¸sı bus olarak adlandırılmı¸stır. Bu-nun sebebi genellikle bir datayı sistemin içinde bir yerden di˘gerine ta¸sıyan birimlere bus denilmesidir.
Toplayıcı yada çıkarıcı multiplexerın çıkı¸sının A kaydedicisine kaydedildi˘gi zaman i¸sleme girer. A kaydedi-cisine bir data kaydedildi˘ginde ikinci 16-bitlik sayı bus’a gelir i¸slem yapıldıktan sonra sonuç G kaydedikaydedi-cisine kaydedilir. Daha sonra G kaydedicisindeki data di˘ger kaydedicilere yollanabilir.
AddSub
Control unit FSM
¸Sekil 1: A digital system.
Sistem kontrol birimi sayesinde her bir saat döngüsünde farklı bir i¸slem yapabilir. Kontrol birimi gelen veriyi tanımlar ve hangi kaydediciye kaydedilece˘gini belirler. Örnek olarak, e˘ger kontrol birimi R0 kaydedicisindeki datanın A’ya yazılmasına karar verdiyse bir sonraki saat döngüsünde data A’ya yazılır.
Böyle sistemlere genellikle i¸slemci denir. Tablo 1’de bu çalı¸smada tanımlanan i¸slemcinin sahip oldu˘gu ko-mutların listesi verilmi¸stir. Operation kolonu komutları ve ve bu koko-mutların argumanlarını göstermektedir. RX
← [RY] RY kaydedicisindeki datanın RX kaydedicisine kaydedilece˘gini belirtmektedir. mv (move) komutu bir kaydediciden di˘gerine datanın ta¸sınması için kullanılmaktadır. mvi komutu ise D sabitini kaydediciye ta¸sımak için kullanılmaktadır.
Kod ˙I¸sletilen fonksiyon
mv Rx,Ry Rx ← [Ry]
mvi Rx,#D Rx ← D
add Rx, Ry Rx ← [Rx] + [Ry]
sub Rx, Ry Rx ← [Rx] − [Ry]
Tablo 1. Komut seti
Her komut IR kaydedicisine 9-bitlik IIIXXXYYY ¸seklinde kodlanarak kaydedilir. Burada III kısmı komu-tun ne oldu˘gunu, XXX kısmı RX kaydedicisinin hangisi oldu˘gunu, YYY kısmı ise RY kaydedicisinin hangisi oldu˘gunu i¸saret eder. Komut için 2-bitlik kod yeterli olmasına kar¸sın i¸slemciye daha sonra ba¸ska komutlarda ekleyece˘gimiz için 3-bit kulandık. Bu yüzden ¸Sekil 1’de gösterildi˘gi gibi DIN giri¸sinin 9-biti IR kaydedicisine ba˘glanmı¸stır. mvi komutu için YYY kodlarının bir anlamı yoktur ve mvi komutu IR kaydedicisine yazıldı˘gında DINgiri¸sine gelen 16-bitlik veri i¸sleme alınır.
Soplama yada çıkarma gibi i¸slenmesi sırasında çoklu atama yapılan komutlar tamamlanmaları için birden çok saat döngüsüne ihtiyaç duyarlar. Kontrol birimindeki sonlu durum makinesi bir sonraki komuta geçmeden i¸slemdeki komutun tamamlanmasını sa˘glamak için saati komtrol etmektedir. ˙I¸slemci bir komutu i¸slerken Run sinyali verilir ve komut tamamlandı˘gında ise Done sinyali verilerek komutun bitti˘gi haber verilir. Tablo 2’de Tablo 1’deki komutların kontrol sinyalleri gösterilmi¸stir. Burada T0 anında IRinkontrol sinyali olmasına kar¸sın tabloda T0 anı verilmemi¸stir.
T1 T2 T3
(mv): I0 RYout, RXin, Done (mvi): I1 DINout, RXin,
Done
(add): I2 RXout, Ain RYout, Gin Gout, RXin, Done (sub): I3 RXout, Ain RYout, Gin, Gout, RXin,
AddSub Done
Tablo 2. Komut seti/zaman ili¸skisi.
Uygulama I
¸Sekil 1’deki i¸slemciyi verilog dilini kullanarak a¸sa˘gıdaki gibi tasarlayıp gerçekleyin:
1. Yeni bir proje olu¸sturun.
2. ˙Istenen verilog dosyasını olu¸sturun, projenize ekleyin ve derleyin. Olu¸sturmanız gereken verilog kodunun iskelet yapısı ¸Sekil 2’de verilmi¸stir.
3. Simulasyonu çalı¸stırarak devrenizin davranı¸sını gözlemleyin. Düzgün tasarlanmı¸s devrenin simulasyon çık-tısı ¸Sekil 3’teki gibi olmalıdır. Bu ¸sekilde 30. ns’de DIN giri¸sine (2000)16verisi verilmi¸stir. Yani mvi R0,
#D komutu verilmi¸stir, 50. ns’de ise giri¸se verilen 5 verisi R0 kaydedicisine yüklenmi¸stir. 90. ns’de mv R1,R0, 110. ns’de add R0,R1 ve 190. ns’de ise sub R0,R0 komutları verilmi¸stir. Burada simulasyon çıktı-sının DIN giri¸sini 4 basamaklı 16lık sayı olarak ve IR kaydedicisindeki veriyi 3 basamaklı 8lik sayı olarak gösterdi˘gine dikkat edin.
4. Bir modül daha olu¸sturarak giri¸s ve çıkı¸sları FPGA kartına uygun ¸sekilde ayarlayın. SW15−0anahtarlarını DIN giri¸sine, SW17 anahtarını Run giri¸sine, KEY0 butonunu Resetn giri¸sine ve KEY1 botununuda Clock giri¸sine ba˘glayın. Bus çıkı¸sını LEDR15−0ledlerine ve LEDR17ledinide Done çıkı¸sına ba˘glayın.
5. pin assignment dosyasını projenize ekleyin. Devrenizi derleyip FPGA kartına yükleyin.
6. Anahtarların konumlarını de˘gi¸stirerek i¸slemcinizin davranı¸sını test edin.
module proc (DIN, Resetn, Clock, Run, Done, BusWires);
input [15:0] DIN;
input Resetn, Clock, Run;
output Done;
output [15:0] BusWires;
parameter T0 = 2’b00, T1 = 2’b01, T2 = 2’b10, T3 = 2’b11;
. . . declare variables assign I = IR[1:3];
dec3to8 decX (IR[4:6], 1’b1, Xreg);
dec3to8 decY (IR[7:9], 1’b1, Yreg);
¸Sekil 2a. ˙I¸slemci kodu için iskelet yapı.
// Kontrol SDM durumları always @(Tstep_Q, Run, Done) begin
case (Tstep_Q)
T0: // Bu adımda giri¸steki veri yüklenir.
if (!Run) Tstep_D = T0;
else Tstep_D = T1;
T1: . . . endcase end
// Kontrol SDM çıkı¸sları
always @(Tstep_Q or I or Xreg or Yreg) begin
. . . ilklendirmeleri yap.
case (Tstep_Q)
T0: // Giri¸si DIN-e kaydet begin
IRin = 1’b1;
end
T1: //Bu adımdaki sinyalleri tanımla case (I)
. . . endcase
T2: //Bu adımdaki sinyalleri tanımla case (I)
. . . endcase
T3: //Bu adımdaki sinyalleri tanımla case (I)
. . . endcase endcase end
// Kontrol SDM kaydedicileri
always @(posedge Clock, negedge Resetn) if (!Resetn)
. . .
regn reg_0 (BusWires, Rin[0], Clock, R0);
. . . di˘ger kaydedicileri ve toplama çıkarma birimini olu¸stur.
. . . bus-ı tanımla.
endmodule
¸Sekil 2b. ˙I¸slemci kodu için iskelet yapı.
module dec3to8(W, En, Y);
input [2:0] W;
input En;
output [0:7] Y;
reg [0:7] Y;
always @(W or En) begin
if (En == 1) case (W)
3’b000: Y = 8’b10000000;
3’b001: Y = 8’b01000000;
3’b010: Y = 8’b00100000;
3’b011: Y = 8’b00010000;
3’b100: Y = 8’b00001000;
3’b101: Y = 8’b00000100;
3’b110: Y = 8’b00000010;
3’b111: Y = 8’b00000001;
endcase else
Y = 8’b00000000;
end endmodule
module regn(R, Rin, Clock, Q);
parameter n = 16;
input [n-1:0] R;
input Rin, Clock;
output [n-1:0] Q;
reg [n-1:0] Q;
always @(posedge Clock) if (Rin)
Q <= R;
endmodule
¸Sekil 2c. ˙I¸slemci için altmodüller.
¸Sekil 3. ˙I¸slemci simülasyon sonuçları.
Uygulama II
Bu uygulamada ¸Sekil 4’deki bir sayıcı ve bir hafıza birimi eklenmi¸s i¸slemciden olu¸san devreyi tasarlayacaksı-nız. Sayıcı hafıza biriminin adreslerini elde etmek için kullanılacak ve devrenizde PClock (i¸slemci için) ve MC-lock(hafıza için) olmak üzere iki ayrı saat kullanılacaktır.
Counter
n
Resetn MClock
Memory
addr data 16
Processor
16
DIN
Bus
Resetn Run
Done
Run
Bus Done
PClock
¸Sekil 4. ˙I¸slemciye hafızanın ve sayacın ba˘glanması.
1. Yeni bir proje olu¸sturun.
2. ˙I¸slemci, sayıcı ve hafıza birimini birle¸stiren bir verilog dosyası olu¸sturun. Hafıza birimini ROM: 1-PORT LPM modülünü kullanarak 16-bitlik 32 kelime kapasitesine sahip olacak ¸sekilde olu¸sturun. Sihirbazın 4.
ekranı ¸Sekil 5’te verilmi¸stir. Hafıza birimi sadece okuma için oldu˘gundan senkron sadece okunabilir hafıza (senkron ROM)olarak adlandırılır. Hafıza birimlerinin adresleri yüklemek için bir kaydedici kullandı˘gına dikkat edin. Bu kaydedici FPGA’lerin hafıza kaynaklarının tasarımından dolayı gereklidir.
˙I¸slemcinin komutlarını hafıza birimine yazmak için öntanımlı de˘gerleri hafızaya kaydetmelisiniz. Bu si-hirbaza memory initialization file (MIF) tanımlayarak yapılabilir. ¸Sekil 6’da MegaWizard Plug-in Mana-ger aracının ilgili ekranı gösterilmi¸stir. Bu ekranda projemizle aynı klasörde olu¸sturaca˘gımız inst_mem.mif dosyasını ekliyece˘giz. Quartus II On-line Help’ten MIF dosyalarının formatı hakkında bilgi edinebilir ve i¸slemciniz için yeteri kadar kod içeren bir MIF dosyasını olu¸sturabilirsiniz.
3. Simulasyonu çalı¸stırarak i¸slemciniz ile ROM devrenizin do˘gru haberle¸sti˘ginden emin olun.
4. Projenize pin assignment dosyasını ekleyin, SW17anahtarını Run giri¸sine, KEY0butonunu Resetn giri¸sine, KEY1butonunu MClock giri¸sine ve KEY2butonunu PClock giri¸sine ba˘glayın. LEDR15−0ledlerini bus
çıkı-¸sına ve son olarak LEDR17ledine Done çıkı¸sına ba˘glayın.
5. Devrenizi derleyin ve FPGA kartına yükleyin.
6. Giri¸sleri de˘gi¸stirerek devrenizin davranı¸slarını gözlemleyin.
¸Sekil 5. 1-PORT ROM için ayarlar.
¸Sekil 6. Öntanımlı de˘gerlerin hafızaya kaydedilmesi.