Stap 3: Geheugencontroller
Het RAM-geheugen bevat alle grafische bitmaps vereist door de verschillende modules van de GPU, alsmede bepaalde zones van de dummy-geheugen gebruikt door sommige algoritmen. Het is van cruciaal belang dat alle modules bereikbaar, indien nodig, zonder teveel afleiding tussen elkaar. Vooral de framebuffer moet toegang tot het RAM-geheugen periodiek te laden van een lijn van elk vlak voor het weergeven van en de timing is van cruciaal belang.
Gespecialiseerde grafische hardware bezitten meestal VideoRAMs (VRAM) met meerdere poorten van lezen/schrijven voor het vergemakkelijken van deze kwesties, maar de 16 MB Micron cellulaire RAM heeft slechts een enkele poort PSRAM interface en is vrij lastig met zijn gegevens vernieuwen cyclus botsingen. Daarom is er duidelijk behoefte aan een controller om te verlichten van het gebruik van dit apparaat en het geschikter te maken voor een grafische versneller.
Core functionaliteiten
De geheugencontroller biedt hetzij:
- asynchrone leestoegang,
- asynchrone schrijftoegang
- Burst leestoegang,
- Burst schrijftoegang.
Deze instructies worden uitgevoerd door het genereren van signalen zoals gespecificeerd in het gegevensblad van de cellulaire RAM (Zie timing van afbeeldingen).
Geheugenbus en Arbitraton
Wij hebben uitgevoerd een preventieve bus arbitrage logica voor de controleur geheugenbus. Hierdoor zouden tijdkritische modules toegang hebben tot de vereiste gegevens met gemak, maar het vereist dat alle van de lagere prioriteit modules moet klaar krijgen onderbroken tijdens een toegang. Er kunnen maximaal 5 externe modules die kunnen worden aangesloten op deze logica van de arbitrage.
De RAM controleur besturingselement en gegevens bus wordt gedeeld door de volgende onderdelen (geordend als prioriteit daalt):
- FrameBuffer;
- DMAController;
- BlockProcessingUnit
- PrimitiveGeneratorUnit
Elk van deze modules is verbonden met de RAM controleur geheugenbus en de multiplexing van de bus wordt gedaan door de logica van de arbitrage rond de controller. De geheugenbus bestaat uit de volgende signalen:
- INSTR [3:0]: geheugen instructie
- DATA_I [15:0]: gegevens van de module naar de RAM
- DATA_O [15:0]: gegevens uit het RAM naar de module
- ADDR [22:0]: adres van het beeld, baseren
- HCNT [15:0]: horizontale offset teller,
- VCNT [15:0]: verticale offset teller,
- PICLEN [15:0]: horizontale grootte van het beeld,
- HLEN [15:0]: horizontale grootte van het gebruikte blok (gedeelte van de afbeelding moet worden gelezen of weggeschreven),
Als INSTR een asynchrone instructie (lezen of schrijven), dan HCNT, VCNT is, worden PICLEN en HLEN-signalen niet gebruikt. Deze signalen worden gebruikt samen met burst instructies, lezen/schrijven van een regel of een rechthoekig gedeelte van de afbeelding.
Nauwkeuriger, tijdens een correct geconfigureerde burst-toegang, wordt de betreden adres volgorde gegeven door de volgende formule:
ADDR + HCNT + VCNT × PICLEN, met HCNT: 0 tot HLEN − 1, VCNT: 0 tot VLEN − 1
(Zie de afbeelding hierboven).
Deze weliswaar complexe geheugenbus is noodzakelijk om ervoor te zorgen de voorrang nemen op een operatie uitgevoerd door de toegang tot module; Deze HCNT en VCNT items toestaan modules te plannen van hun activiteiten als ze krijgen er voorrang op nemen of als CRAM verfrissing vereist is. Het laat ook heel gemakkelijk knippen van bitmaps die grondig door het blok Processing Unit (dit zal worden herzien in BPU sectie) wordt gebruikt.
Maar als gevolg van de complexiteit ervan, alle component die verbonden is met de geheugenbus zal moeten leggen van een heel complex algoritme (een paar items, één vermenigvuldiging voor het controleren van botsingen vernieuwen). Wij werken momenteel aan een nieuwe oplossing op basis van buffer synchronisatie te vereenvoudigen van de geheugen-interface.