DIPLOMARBEIT - FG Mikroelektronik, TU Berlin
DIPLOMARBEIT - FG Mikroelektronik, TU Berlin
DIPLOMARBEIT - FG Mikroelektronik, TU Berlin
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