Diese werden für die zukünftige Berechung benötigt. Im Wechsel wird der Prozessor auf die beiden Speicherbereiche zugreifen, um das komplette Bild oder auch nur einen interessanten Bereich zu berechnen.
Hinweise zur Effizienzsteigerung
Durch Ablegen der Daten und Konstantenlisten (Alpha LUT, LUT) in verschiedene Sub-Bänke kann die Rechenzeit optimiert werden, denn nur auf unterschiedliche Sub-Bänke kann simultan mit nur einem Prozessorzyklus zugegriffen werden.
Die Ergebnisse der Berechnung werden in eine Tabelle des L2-Onchip-Speichers (Gelb) geschrieben (Sobel ROI). Beim späteren Lesen fallen aus diesem Speicher zusätzliche Prozessortakte an. Bevor nun die Hough-Transformation gestartet wird, löst der Prozessor erneut die Übertragung eines Bildes aus (neues Bild; Get new image). Auch an dieser Stelle müssen nur zwei Register im DMA-Controller beschrieben werden, um sicherzustellen, dass die Daten zur Verarbeitung des Folgebildes rechtzeitig zur Verfügung stehen.
Im nächsten Schritt wird die Hough-Transformation ausgeführt. Diese greift auf die Ergebnisse des zuvor ausgeführten Sobel-Filters zu. Neben einer Tabelle mit Konstanten für die Kreisermittlung (Circle LUT) greift der Prozessor auf den Hough-Raum zu (Hough Space), der im langsamen externen SDRAM-Speicher liegt. Da die berechneten Werte mit Werten im Hough-Raum akkumuliert werden müssen, muss der Prozessor die betreffende Speicherstelle zunächst lesen, mit dem Ergebnis akkumulieren und dann zurückschreiben. In diesem Falle wird nur jedes Lesen mehrere Prozessortakte benötigen – nicht aber das darauffolgende Schreiben!
Zudem muss man wissen, dass jeder Schreibvorgang von einem Rückschreibepuffer unterstützt wird. Liegen also zwischen Schreiboperationen genügend Zyklen (z.B. die Schreiboperationen, die für die Berechnung der folgenden Ergebnisse benötigt werden), so wird der Prozessorkern nicht auf die Vollendung des Schreibvorgangs warten, sondern fortfahren. So scheint es, als würde das Schreiben in den externen Speicher mit dem Takt des Prozessorkerns erfolgen.
Für die Ausführung des Blocks „Clustering“ werden die Daten aus dem Hough-Raum (Hough Space) zeilenweise ausgelesen und in den L1-Speicher bereitgestellt, und zwar mit Hilfe eines DMA-Kanals bei voller Prozessorgeschwindigkeit. Da es keinen Bedarf mehr für die Inhalte des Hough-Raums gibt, muss dieser für den nächsten Durchlauf zu Null gesetzt werden (Clear Hough Space) – ebenfalls mit Hilfe eines DMA-Kanals.
Anschließend greift die Kreisfindung auf die Ergebnisse des Blocks „Clustering“ und des Blocks „Sobel“ zu und ermittelt Kreisradien sowie die genaue Position. Da die Position der möglichen Schilder nun bekannt ist, können sie aus dem Originalbild mittels DMA-Kanal geladen werden. Dafür wird zunächst eine Region mit mehreren Schildern in den L2-Speicher übertragen. Aus dieser Region sind dann sukzessive Ausschnitte von einzelnen Schildern in den L1-Speicher zu laden. Außerdem sind für die Untersuchung der Schilder Vergleichsmuster notwendig.
Für die Erkennung von Verkehrszeichen werden mehrere Blöcke benötigt, die im Folgenden erläutert werden. Bild 4 stellt die Schritte grafisch dar.
Nach den grundsätzlichen Funktionen wird im Folgenden ein effizientes Software-Gerüst vorgestellt, das alle Elemente zu einen funktionstüchtigen System zusammenführt (Bild 5). Die Schild-Erkennung wird auf Prozessorkern 1 ausgeführt (Core A). Nach einer Initialisierungsphase aller benötigten Schnittstellen startet der Prozessor zuerst die Übertragung eines Bildes mittels Videoschnittstelle (PPI0) und dem zugehörigen DMA-Kanal. Dieses Bild wird in den externen SDRAM (Rot) mit dem Namen „frame 0“ geschrieben.
Im schnellen L1-Onchip-Speicher (Grün) ist der Speicherplatz für ein komplettes Bild nicht vorhanden. Aus diesem Grund liest ein weiterer DMAKanal das Bild zeilenweise aus dem SDRAM und legt es in den internen L1-Speicher ab (uiL1_buffer_A_ sub0). Mit Hilfe der ersten drei Zeilen kann der Prozessor nun mit der Berechnung des Sobel-Filters beginnen. Zeitgleich zur Berechnung wird der DMA-Kanal weitere Zeilen in einen zweiten Bereich des L1-Speichers übertragen (uiL1_buffer_A_sub1).