21.07.2013 Aufrufe

DIPLOMARBEIT - FG Mikroelektronik, TU Berlin

DIPLOMARBEIT - FG Mikroelektronik, TU Berlin

DIPLOMARBEIT - FG Mikroelektronik, TU Berlin

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Abbildung 94: Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/MEM CYCLES<br />

MEM_CYCLES<br />

Entry of <br />

A: -- MWE_ict:=’0’ when write access<br />

-- D_ict :=(write data) & (activate D_oe when write)<br />

-- RCA_ict:=(CAS address)<br />

-- CAS_lat:=(CAS mask) (not applied to RAM port yet)<br />

-- mark written bytes in CAS_DONE<br />

if MEM_READ=’1’ or MEM_GREAD=’1’ then<br />

MOE_ict:=’0’; -- memory read<br />

MWE_ict:=’1’;<br />

elsif MEM_GWRITE=’1’ and PRE_READ=’1’ then<br />

MEM_RMW:=’1’; -- memory read-modify-write cycle<br />

MOE_ict:=’0’;<br />

MWE_ict:=’1’;<br />

else<br />

MWE_ict:=’0’; -- memory write<br />

DOE_ict:=hi32; -- data lines as outputs<br />

end if;<br />

case MBW is<br />

when "00" =><br />

CAS_lat:="1110";<br />

RCA_ict(13 downto 2):=RAM_COL(13 downto 2);<br />

if CAS_MASK(3)=’0’ then<br />

RCA_ict(1 downto 0):="00"; -- byte U<br />

CAS_DONE(3):=’1’; -- done<br />

D_ict(7 downto 0):=RAM_D_W(31 downto 24);<br />

end if;<br />

if CAS_MASK(3 downto 2)="10" then<br />

RCA_ict(1 downto 0):="01"; -- byte H<br />

CAS_DONE(2):=’1’; -- done<br />

D_ict(7 downto 0):=RAM_D_W(23 downto 16);<br />

end if;<br />

if CAS_MASK(3 downto 1)="110" then<br />

RCA_ict(1 downto 0):="10"; -- byte M<br />

CAS_DONE(1):=’1’; -- done<br />

D_ict(7 downto 0):=RAM_D_W(15 downto 08);<br />

end if;<br />

if CAS_MASK="1110" then<br />

RCA_ict(1 downto 0):="11"; -- byte L<br />

CAS_DONE(0):=’1’; -- done<br />

D_ict(7 downto 0):=RAM_D_W(07 downto 00);<br />

end if;<br />

when "01" =><br />

RCA_ict(13 downto 1):=RAM_COL(13 downto 1);<br />

CAS_lat(3 downto 2):="11";<br />

if CAS_MASK(3 downto 2)/="11" then<br />

CAS_lat(1 downto 0):=CAS_MASK(3 downto 2);<br />

RCA_ict(0):=’0’; -- byte U+H<br />

CAS_DONE(3 downto 2):="11"; -- done<br />

D_ict(15 downto 00):=RAM_D_W(31 downto 16);<br />

else<br />

CAS_lat(1 downto 0):=CAS_MASK(1 downto 0);<br />

RCA_ict(0):=’1’; -- byte M+L<br />

CAS_DONE(1 downto 0):="11"; -- done<br />

D_ict(15 downto 00):=RAM_D_W(15 downto 00);<br />

end if;<br />

when others =><br />

RCA_ict(13 downto 0):=RAM_COL(13 downto 0);<br />

CAS_lat:=CAS_MASK;<br />

CAS_DONE:="1111"; -- all bytes done<br />

D_ict:=RAM_D_W;<br />

end case;<br />

-- address: | 0 1 2 3 | 4 5 6...<br />

-- bytes: | U H M L | U H M...<br />

-- CAS: | 3 2 1 0 | 3 2 1...<br />

-- data bits:| 31-24 23-16 15-08 07-00 | ...<br />

Subdiagram MEM_CYCLES: read or write RAM data<br />

RAM_ADDR: address of read/write access<br />

CAS_MASK: CAS mask<br />

RAM_D_W: write data from current FIFO buffer pos.,<br />

if necessary, up to 4 write cycles<br />

are performed (HBW=32, MBW=8).<br />

DATA_OUT: data read from the RAM<br />

read: when RAM_READ=’1’ (HOST) or RAM_GREAD=’1’ (GPU)<br />

write: when FIFO_IN/=FIFO_OUT (HOST)<br />

or (RAM_GWRITE=’1’ and PRE_READ=’0’) (GPU)<br />

rmw: when (RAM_GWRITE=’1’ and PRE_READ=’1’) (GPU)<br />

Entry of <br />

A: RCA_ict:=RAM_ROW;<br />

T2<br />

A: RAS_ict :=RAS_MASK;<br />

LAST_RAS:=RAS_MASK;<br />

ACS_ict :=ACS_MASK;<br />

LAST_ACS:=ACS_MASK;<br />

LAST_ROW:=RAM_ROW;<br />

C: ANY_CYCLE=’1’<br />

RAS1<br />

T11<br />

RAS2 CAS1<br />

T3<br />

T10 #0<br />

entry<br />

C: ANY_CYCLE=’1’<br />

and LAST_ROW=RAM_ROW<br />

and LAST_RAS=RAS_MASK<br />

and LAST_ACS=ACS_MASK<br />

T4<br />

T1<br />

T6 #1<br />

A: CAS_ict:=CAS_lat;<br />

if CAS_MASK="1111" then<br />

if MEM_GWRITE=’1’ and<br />

PRE_READ=’0’then<br />

GPU_WRITE_DONE:=’1’;<br />

-- request addr inc<br />

-- (diagr. GPU_FIFO_W)<br />

elsif MEM_GREAD=’1’ then<br />

GREAD_END:=’1’;<br />

-- read last data<br />

GPU_READ_DONE:=’1’;<br />

-- request addr inc<br />

-- (diagr. GPU_FIFO_R)<br />

end if;<br />

end if;<br />

Entry of <br />

A: RAS_ict:="1111";<br />

MWE_ict:=’1’;<br />

MOE_ict:=’1’;<br />

RCA_ict:=hi14;<br />

DOE_ict:=lo32; -- input mode<br />

cold_stb<br />

C: ANY_CYCLE=’1’<br />

-- if different ROW/RAS/ACS<br />

or PEN=’0’<br />

-- or timeout<br />

T7<br />

T12<br />

hot_stb<br />

T8<br />

C: ANY_CYCLE=’0’ and PEN=’1’<br />

A: MWE_ict:=’1’;<br />

DOE_ict:=lo32; -- input mode<br />

MOE_ict:=’1’;<br />

RCA_ict:=hi14;<br />

if MEM_READ=’1’ and READ_DONE=’1’ then<br />

MEM_READ:=’0’;<br />

end if;<br />

C: ANY_CYCLE=’1’ and LAST_ROW=RAM_ROW<br />

and LAST_RAS=RAS_MASK<br />

and LAST_ACS=ACS_MASK<br />

-- access same RAS address<br />

and PEN=’1’<br />

CAS2<br />

T5<br />

A: if CAS_MASK="1111" then<br />

CAS_DONE:="0000";<br />

if MEM_READ=’1’ then<br />

READ_DONE:=’1’;<br />

elsif FIFO_IN/=FIFO_OUT then<br />

FIFO_OUT:=(FIFO_OUT+1) mod 8;<br />

end if;<br />

end if;<br />

C: (ANY_CYCLE=’1’<br />

and (LAST_ROW/=RAM_ROW<br />

or LAST_RAS/=RAS_MASK<br />

or LAST_ACS/=ACS_MASK))<br />

-- access different RAS address<br />

or PEN=’0’<br />

A: if MEM_READ=’1’ and READ_DONE=’1’ then<br />

MEM_READ:=’0’;<br />

end if;<br />

CAS3<br />

RMW1<br />

T9 #0<br />

T15<br />

CAS_END Exit of <br />

A: CAS_ict:="1111";<br />

T13<br />

T16<br />

C: MEM_RMW=’1’<br />

A: MOE_ict:=’1’;<br />

-- and exit action of CAS3<br />

-- (read RAM data into DATA_OUT)<br />

Subdiag Actions of <br />

A: -- test only<br />

FIFOIN_ot :=FIFO_IN mod 8;<br />

FIFOOUT_ot :=FIFO_OUT mod 8;<br />

CAS_MASK_ot :=CAS_MASK;<br />

ANY_CYCLE_ot :=ANY_CYCLE;<br />

MEM_GWRITE_ot :=MEM_GWRITE;<br />

GPU_WNUM_ot :=GPU_WNUM mod 16;<br />

MEM_GREAD_ot :=MEM_GREAD;<br />

GPU_RNUM_ot :=GPU_RNUM mod 16;<br />

PRE_READ_ot :=PRE_READ;<br />

PRE_MASK_ot :=PRE_MASK;<br />

Exit of <br />

A: if MEM_READ=’1’ or MEM_GREAD=’1’<br />

or (MEM_GWRITE=’1’ and PRE_READ=’1’) then<br />

case MBW is<br />

when "00" =><br />

case RCA_ict(1 downto 0) is<br />

when "00" => DATA_OUT(31 downto 24)<br />

:=MD_in(7 downto 0);<br />

when "01" => DATA_OUT(23 downto 16)<br />

:=MD_in(7 downto 0);<br />

when "10" => DATA_OUT(15 downto 8)<br />

:=MD_in(7 downto 0);<br />

when "11" => DATA_OUT( 7 downto 0)<br />

:=MD_in(7 downto 0);<br />

end case;<br />

when "01" =><br />

case RCA_ict(0) is<br />

when ’0’ => DATA_OUT(31 downto 16)<br />

:=MD_in(15 downto 0);<br />

when ’1’ => DATA_OUT(15 downto 0)<br />

:=MD_in(15 downto 0);<br />

end case;<br />

when others =><br />

DATA_OUT:=MD_in;<br />

end case;<br />

end if;<br />

GREAD_END:=’0’;<br />

A: GPU_WRITE_DONE:=’1’;<br />

-- output modified data:<br />

case MBW is<br />

when "00" =><br />

case RCA_ict(1 downto 0) is<br />

when "00" => D_ict(7 downto 0):=RAM_D_W(31 downto 24);<br />

when "01" => D_ict(7 downto 0):=RAM_D_W(23 downto 16);<br />

when "10" => D_ict(7 downto 0):=RAM_D_W(15 downto 08);<br />

when "11" => D_ict(7 downto 0):=RAM_D_W(07 downto 00);<br />

end case;<br />

when "01" =><br />

case RCA_ict(0) is<br />

when ’0’ => D_ict(15 downto 00):=RAM_D_W(31 downto 16);<br />

when ’1’ => D_ict(15 downto 00):=RAM_D_W(15 downto 00);<br />

end case;<br />

when others =><br />

D_ict:=RAM_D_W;<br />

end case;<br />

T14<br />

RMW3<br />

RMW2<br />

A: MWE_ict:=’0’;<br />

-- write enable<br />

MEM_RMW:=’0’;<br />

Technische Universität <strong>Berlin</strong><br />

Institut für <strong>Mikroelektronik</strong><br />

Lukas Bauer<br />

Diplomarbeit<br />

Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />

Anhang D.2<br />

Seite 124

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!