Hallo,
hab ein Quelltext für die Ansteuerung eines Displays geschrieben. Dabei
ist mir aufgefallen, dass dieser durch die Statemachine sehr lang ist.
Kann man die Sache auch irgendwie verkürzen und vereinfachen, oder geht
das nicht anders?
THX for your ideas
... und das mit einem Integer-Index schrittweise nacheinander
abarbeiten. Wie der Zugriff auf so ein ROM funktioniert, kannst du an
meinem DDFS-Beispiel sehen:
http://www.lothar-miller.de/s9y/categories/31-DDFS
Auf diese Art sollte der Quelltext auf eine Bildschirmseite zu
reduzieren sein ;-)
BTW:
LCD_RW hängt statisch auf '0', das reicht, wenn es einmal gesetzt wird.
Allerdings würde ich das Toggeln des LCD_E abseits abhandeln.
Hab jetz einfach mal ein array programmiert, synthetisiert wird das
schon, aber es kommen folgende Warnungen:
WARNING:Xst:790 - "C:/Users/Millers/Documents/Xilinx Projekte/display_01
- Kopie/array/array/daten.vhd" line 34: Index value(s) does not match
array range, simulation mismatch.
WARNING:Xst:1710 - FF/Latch <DOUT_int_1> (without init value) has a
constant value of 0 in block <test_RAM>. This FF/Latch will be trimmed
during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <DOUT_int_2>
(without init value) has a constant value of 0 in block <test_RAM>. This
FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <DOUT_int_3>
(without init value) has a constant value of 0 in block <test_RAM>. This
FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <DOUT_int_5>
(without init value) has a constant value of 0 in block <test_RAM>. This
FF/Latch will be trimmed during the optimization process.
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <DOUT_int_7>
(without init value) has a constant value of 0 in block <test_RAM>. This
FF/Latch will be trimmed during the optimization process.
Woran könnte das denn liegen? Hab schon ein paar Sachen ausprobiert,
aber irgendwie will die Sache nicht so laufen...
> conv_integer(ADDR_int)
ADDR_int kann mit 3 Bits die Werte von 0 bis 7 annehmen. Nimm doch als
Index einen integer range 0 to 4, dann passt das besser zum array.
> others => (x"00")
Die Klammern kannst du hier weglassen.
> ROM: process (takt, ADDR_int)
Hier reicht takt aus, der Prozess muß nicht neu berechnet werden, wenn
sich ADDR_int ändert.
> (x"11", x"50", others => x"00")
Mit diesen Intitialwerten sind natürlich DOUT_int_2, 3, 5 und 7 immer 0.
Das sagt dir der Synthesizer mit den Warnungen...
Okay, jetzt hab ich es gerafft. Funktioniert jetzt ohne Warnungen.
Wie kann ich denn die jeweiligen Adressen des array in der Statemachine
ansprechen und auf die Ausgänge zuweisen und dadurch den Quelltext
verkürzen?
Nimm mal diesen Code, leg mit einer simplen Testbench einen 50MHz-Takt
an, und sieh dir an, was herauskommt (als Tipp: mindestens 15 ms laufen
lassen):
if(index=31)thenen<='0';endif;-- fertig, kein enable mehr ausgeben
73
endprocess;
74
75
dout<=ram(index)(dout'range);
76
rs<=ram(index)(8);
77
rw<='0';
78
79
endBehavioral;
Wenn du das dann so in etwa nachvollzogen hast, ist deine Frage
automatisch beantwortet ;-)
BTW: die ganzen Hex-Werte müssen noch an das Display angepasst werden...
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.