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
Du könntest die Initialisierungssequenz incl. Steuersignale in ein konstantes Array stecken (das wird dann als ROM abgebildet) ...
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
... 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.
Gast
#1575055
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):
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
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...
okay, werd mich mal da rein arbeiten, thx
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.