vhdl etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
vhdl etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

12 Kasım 2009 Perşembe

VHDL - Saklayıcı tasarımı

Okulda aldığım Bilgisayar Mimarisi dersinde verilen projenin bir kısmını, VHDL dilini öğrenmek isteyenler ya da benim gibi hayatında bir kez kulanmak zorunda bırakılanlar için yayınlamaya karar verdim. Yararlı olacağını düşünüyorum.
Bilgisayar Mimarisi - Proje
MAX-PLUS II' ye giriş
VHDL Donanım Tanımlama Dili
Max plus indirmek ve yardım


Soru-1 :Saklayıcı tasarımı

İşlemci içerisinde 32 bitlik A, B, AR ve IR, 1 bitlik C ve Z olmak üzere farklı saklayıcılar içermektedir.Genel n-bitlik saklayıcının blok gösterimi Şekil 5 de verilmektedir. Saklayıcının girişleri saat (clk), silme (clr) yükleme(ld) işaretleri ile n-bit giriş verisinden oluşmaktadır. Çıkıs ise sadece n-bitlik veri çıkışıdır. Buna göre 32 bitlik saklayıcıları VHDL kullanarak gerçekleyiniz.




library ieee;
use ieee.std_logic_1164.all;

entity IR_register is
port(
d: in std_logic_vector(31 downto 0);

ld: in std_logic;

clk: in std_logic;

clr: in std_logic;

do: out std_logic_vector(31 downto 0)

);

end IR_register;


architecture behaviour of IR_register is
begin
process(clk)
begin
if clk='1' then
if ld='1' and clr='0' then
do<=d;
elsif ld='0' and clr='1'then

do<= d xor d;

elsif ld='1' and clr='1' then

do<= d xor d;

end if;

end if;
end process;

end behaviour;








VHDL- Program sayacı tasarımı


Soru-2 : Program sayacının tasarımı
İşlemcinin en önemli birimlerinden oluşan program sayacı (PC- Program counter) blok olarak gösteriliyor.32 bit q çıkışı olan PC da saat(clk), silme (clr), 32 bit giriş (d), yükleme (ld) ve artırma (inc) girişleri vardır.Buna göre verilen blok yapısı kullanılarak VHDL gerçeklemesini yapınız.


library ieee;
use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;


entity PC_reg is

port(

d: in std_logic_vector(31 downto 0);

inc: in std_logic;
ld: in std_logic;

clk: in std_logic;

clr: in std_logic;

do: out std_logic_vector(31 downto 0)
);
end PC_reg;

architecture behaviour of PC_reg is
begin

process(clk)

begin

if clk='1' then

if inc='0' then

if ld='0' and clr='1' then

do<= d xor d;

elsif ld='1' and clr='0' then

do<= d;

elsif ld='1' and clr='1' then

do<= d xor d;

end if;

elsif inc='1' then

if ld='1' and clr='0' then

do<=d+4;

elsif ld='0' and clr='1' then

do<= d xor d;

elsif ld='1' and clr='1' then

do<= d xor d;
end if;

end if;

end if;

end process;

end behaviour;

VHDL-Aritmetik Lojik Ünitesi (ALU) Tasarımı

Soru-3 : Aritmetik Lojik Ünitesi (ALU) Tasarımı
32-bitlik ALU birimi 6 farklı işlem yapabilmektedir. ALU nun blok gösterimi verilmiştir. ALU' nun 32 bitlik iki giriş sinyalleri ile 3 bit kontrol için kullanılan girişi vardır. 32 bitlik çıkış ile birlikte iki durum (Zero, Carry) bayrağı vardır. ALU da yapılan işlemler tablo verilmektedir. Buna göre, ALU nun VHDL gerçeklemesini yapınız.




















library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;


entity ALU is

port
(
a: in std_logic_vector (31 downto 0);

b: in std_logic_vector (31 downto 0);
s: in std_logic
_vector (2 downto 0);
res: out std_logic_vector (31 downto 0);
z: out std_logic;
c: out std_logic
);
end ALU;


architecture behaviour of ALU is

signal
result : std_logic_vector(31 downto 0);

signal temp: std_logic_vector(32 downto 0);

begin

process(s)

begin


if s = "000" then
result <= a and b;

c<='0';

if result = (a xor a) then

z<='1';

else

z<='0';

end if;


elsif s="001" then

result <= a or b;

if result = (a xor a) then

z<='1';

else

z<='0';
end if;

c<='0';


elsif s="010" then

temp<=a + b;

if temp = (a xor a) then

z<='1';

else

z<='0';

end if;

if temp(32)='1' then

c<='1';

elsif temp(32)='0' then
c<='0';

end if;

result<=temp(31 downto 0);


elsif s="011" then

result<=a;

c<='0';
if result=(a xor a) then
z<='1';

else

z<='0';

end if;

elsif s="110" then

if a > b or a = b then

result<=a-b;
c<='0';

if a=b then

z<='1';

else

z<='0';

end if;

elsif a <b then
z<='0';

c<='1';
res<=(a+(not b)+1);

end if;


elsif s="111" then

result<=b;
if res = (b xor b) then
z<='1';
else
z<='0';
end if;
c<='0';
end if;

res <= result;

end process;

end behaviour;