Gut, schon mal keine Schleife... ;-)
> das mein FPGA zu klein wurde
Wundert mich nicht, denn die Texte hier wären besser in einem BlockRAM
aufgehoben:
1 | when 1 => LCD (639 downto 480) <= (pfeilrechts & space & P & O & S & T & minus & C & O & D & E & minus & T & R & A & C & E & R & space & pfeilrechts);
|
2 | LCD (479 downto 320) <= (space & space & T & R & I & G & G & E & R & space & E & N & G & I & N & E & space & space & space & space);
|
3 | LCD (319 downto 160) <= (space & space & B & U & S & minus & D & E & C & O & D & E & R & space & space & space & space & space & space & space);
|
4 | LCD (159 downto 0) <= empty;
|
5 | EN <= '1';
|
6 | when 2 => ...
|
7 | when 10004 | 10104 | 10204 | 10304 => ...
|
8 | when 100100 | 101100 | 102100 | 103100 | 100110 | 101110 | 102110 | 103110 | 100120 | 101120 | 102120 | 103120 | 100130 | 101130 | 102130 | 103130 => ...
|
Und dann müsste nur bei einem Wechsel der Displayseite die passende
Seite Zeichen für Zeichen und Takt für Takt aus dem RAM geladen werden.
Denn zur Versorgung eines Displays muss nicht der komplette Inhalt in 1
Taktzyklus berechnet und geändert werden können. So schnell kann das
Display es nicht darstellen und erst recht du nicht schauen.
Oder man könnte auch einfach die Displayseite direkt aus dem (DP)RAM ins
Display laden (so würde ich das machen). Und die Ermittlung der Adressen
von der Darstellung entkoppeln: du hast jetzt die entsprechenden
Adressen fest in dein Menü eingebaut, einfacher wäre es, die Adressen
abhängig von der Cursorpostition und der + oder - Taste zu berechnen,
und davon entkoppelt ins DP-RAM umzuwandeln, von wo aus sie dann von
einer ganz anderen "Funktion" im Display dargestellt werden.
Du musst also die Funktionen "Eingabe", "Datenhaltung+Änderung" und
"Display" voneinander entkoppeln. Sonst ist das Design nicht mehr
beherrschbar...
Sehr hilfreich wäre besonders auch eine weniger dezimale Nummerierung
der Seiten. Da muss der Synthesizer viel rechnen und optimieren (wenn er
es denn kann):
1 | -- hier
|
2 | if position /= 100000 and position /= 101000 and position /= 102000 and position /= 103000
|
3 | and position /= 100100 and position /= 101100 and position /= 102100 and position /= 103100
|
4 | and position /= 100110 and position /= 101110 and position /= 102110 and position /= 103110
|
5 | and position /= 100120 and position /= 101120 and position /= 102120 and position /= 103120
|
6 | and position /= 100130 and position /= 101130 and position /= 102130 and position /= 103130 then
|
7 |
|
8 | -- und da auch:
|
9 |
|
10 | when 100100 | 101100 | 102100 | 103100 | 100110 | 101110 | 102110 | 103110 | 100120 | 101120 | 102120 | 103120 | 100130 | 101130 | 102130 | 103130 =>
|
Wenn du die Nummerierung binär angegangen wärst, dann müsste er nur ein
paar Bits ausmaskieren und fertig. So muss er erst mal
Gemeinsamkeiten dieser Dezimalzahlen finden und dann einen möglichst
kompakten Term ausrechnen. Wehe, wenn du da nur 1 Seite dazuschreibst:
dann kann was viel Einfacheres oder auch was viel Komplizierteres
herauskommen. Das merkst du dann sofort am Timing...
BTW: welches FPGA hast du denn?