Hallo liebe Forengemeinde.
Ich möchte gerne fünf WS2812B mit einem FPGA ansteuern, leider gehe ich
glaube ich gerade die falsche Richtung. Ich glaube meine Denkweise ist
noch nicht die richtige. Hier erstmal meine Beschreibung.
1
entityWS2812Bis
2
Port(G7:inSTD_LOGIC;
3
G6:inSTD_LOGIC;
4
G5:inSTD_LOGIC;
5
G4:inSTD_LOGIC;
6
G3:inSTD_LOGIC;
7
G2:inSTD_LOGIC;
8
G1:inSTD_LOGIC;
9
G0:inSTD_LOGIC;
10
R7:inSTD_LOGIC;
11
R6:inSTD_LOGIC;
12
R5:inSTD_LOGIC;
13
R4:inSTD_LOGIC;
14
R3:inSTD_LOGIC;
15
R2:inSTD_LOGIC;
16
R1:inSTD_LOGIC;
17
R0:inSTD_LOGIC;
18
B7:inSTD_LOGIC;
19
B6:inSTD_LOGIC;
20
B5:inSTD_LOGIC;
21
B4:inSTD_LOGIC;
22
B3:inSTD_LOGIC;
23
B2:inSTD_LOGIC;
24
B1:inSTD_LOGIC;
25
B0:inSTD_LOGIC;
26
EN:inSTD_LOGIC;
27
CLK:inSTD_LOGIC;
28
LED_OUT:outSTD_LOGIC);
29
endWS2812B;
30
31
architectureBehavioralofWS2812Bis
32
signalled_data:std_logic_vector(23downto0);
33
sharedvariableled:std_logic;
34
begin
35
36
led_data(0)<=G0;
37
led_data(1)<=G1;
38
led_data(2)<=G2;
39
led_data(3)<=G3;
40
led_data(4)<=G4;
41
led_data(5)<=G5;
42
led_data(6)<=G6;
43
led_data(7)<=G7;
44
45
led_data(8)<=R0;
46
led_data(9)<=R1;
47
led_data(10)<=R2;
48
led_data(11)<=R3;
49
led_data(12)<=R4;
50
led_data(13)<=R5;
51
led_data(14)<=R6;
52
led_data(15)<=R7;
53
54
led_data(16)<=B0;
55
led_data(17)<=B1;
56
led_data(18)<=B2;
57
led_data(19)<=B3;
58
led_data(20)<=B4;
59
led_data(21)<=B5;
60
led_data(22)<=B6;
61
led_data(23)<=B7;
62
63
process(en,clk)
64
begin
65
ifrising_edge(clk)then
66
ifen='1'then
67
foriin0to23loop
68
ifled_data(i)='1'then
69
forain0to38loop
70
--if rising_edge(clk) then
71
led:='1';
72
--end if;
73
endloop;
74
forbin0to22loop
75
--if rising_edge(clk) then
76
led:='0';
77
--end if;
78
endloop;
79
else
80
forcin0to19loop
81
--if rising_edge(clk) then
82
led:='1';
83
--end if;
84
endloop;
85
fordin0to40loop
86
--if rising_edge(clk) then
87
led:='0';
88
--end if;
89
endloop;
90
endif;
91
endloop;
92
endif;
93
endif;
94
endprocess;
95
96
Led_Out<=led;
97
98
endBehavioral;
Ich hoffe ihr könnt mir helfen den richtigen weg zu finden.
mfg Mathias
Deine "Loops" innen haben keinerlei Bezug zu einer Variable oder einem
Ausgang.
Loops, Waits und alle ausdrücklichen zeitabhängigen Konstrukte sind
Dinge, die nur zur Compile-Zeit ausgeführt werden und die helfen sollen,
Vereinfachungen beim Programmieren vorzunehmen und sich gfs Zeit zu
sparen oder komplexe Gebilde einfach darzustellen.
Diese Zeitabhängigkeit gibt es in der späteren Hardware nicht. Wie auch?
Alles, was in VHDL - Logik eine "virtuelle Zeit" erzeugen soll, um zu
warten, etwas zu verzögern oder Ähnliches zu veranstalten, braucht einen
Bezug zu einem Takt, also eine Zählschaltung mit Start und
Abbruchbedingung.
Alles, was in VHDL - PHYSIK eine "reale Zeit" erzeugen soll, braucht
zeitabhängige Hardware, also ein physisches Delay, eine physische PLL,
eine physische LUT, die an den Nanosekunden herumschieben.
Mathias schrieb:> Ich glaube meine Denkweise ist noch nicht die richtige.
Eines sieht man ganz sonnenklar: du bist ein Softwerker.
Vergiss Schleifen vorerst gleich wieder, die tun nicht das, was du
erwartest.
Und ein Prozess wird nicht "von oben her abgearbeitet", sondern er ist
als Logik jederzeit komplett in der Hardware und wird parallel
ausgewertet.
Wenn du zeitliche Abläufe willst, dann brauchst du einen
Zustandsautomaten (FSM). Das ist halb so schlimm (schon ein Zähler ist
eine FSM), aber eben eine vollkommen andere Denkweise: VHDL hat kein P
im Namen, weil es eine HDL also eine HardwareBESCHREIBUNGssprache ist.
Und um etwas "beschreiben" zu können muss man sich selber (wenigstens in
Gedanken) ein Bild davon machen...
ALLES was du beschreibst muss sich mit Logik (LUTs) und Flipflops
abbilden lassen. Nur diese Komponenten hast du im FPGA zur Verfügung.
Ich glaube, es ist ein großes Problem, dass FPGAs mit Software-Code
programmiert werden. Wäre das nicht der Fall, käme keiner auf die Idee
beim FPGAs vom "Programmieren" zu reden.
Lothar M. schrieb:> Und um etwas "beschreiben" zu können muss man sich selber (wenigstens in> Gedanken) ein Bild davon machen...
Da liegt der Hase im Pfeffer! Die meisten an der HS lernen schon direkt
im 3. Semester VHDL, neben Python und C und sehen einfach die
Unterschiede nicht.
Softwareentwickler schrieb:> Wäre das nicht der Fall, käme keiner auf die Idee> beim FPGAs vom "Programmieren" zu reden.
Ob man das Programmieren nennen will, oder nicht, ist nicht wirklich der
Punkt. FÜr mich ist FPGA-Entwicklung sehr wohl Softwareentwicklung und
sehr wohl auch Programmieren. Klar, der Begriff "Programmieren" hat
diesbezüglich eine Begriffsverengung erfahren und wurde von den
Softwerkern belegt. Das muss aber nicht so bleiben :-)
Mithin ist das mehr Wortspiel als Sinnspiel, denn der Knackpunkt ist ein
ganz anderer:
Ich habe das bereits an mehreren Stelle geschrieben, daß es bei FPGAs
einen Wichtigen - und zwar den ENTSCHEIDENDEN Unterschied gibt:
Beim C-Compiler wird der Code nicht ausgeführt, sondern nur
interpretiert und in eine quivalente Form in Assembler / Maschinen-code
übersetzt. Dabei bleibt die Funktion des Codes, also das, was ausgeführt
werden soll, komplett erhalten. Bei C wird also eine Schleife von 1-100
in eben wieder eine Schleife übersetzt. Dann kommt später ein Prozessor,
der sich den Code ansieht und ihn ausführt. Es wird zwar oft anders
umgestzt, als kommandiert, aber es ist funktionell Dasselbe!
Beim VHDL-Compiler und auch beim Simulator wird der Code aber nicht
(nur) interpretiert, sondern zur Compile-Zeit ausgeführt! Das ist der
entscheidende Unterschied! Und um es noch deutlicher zu sagen: Er wird
NUR von der Software ausgeführt und nicht etwa vom FPGA, weil der FPGA
keinen Code interpretieren kann und auch nicht soll.
Eine Schleife wie oben läuft daher nur beim Comppilieren ab und baut
etwas oder erzeugt ein Zwischenergebnis, das irgendwo eingesetzt wird.
Z.B. kann man sich einen Sinuswert berechnen lassen, wenn man ihn
braucht, oder was aus einem file lesen. Direkt programmiert wird also
die Synthesesoftware und nicht die FPGA-firmware! Was da raus kommt,
hängt von der Beschreibung und den Randbedingungen ab. Der funktionelle
Ablauf im Quell-Code findet sich dort definitiv nicht wieder.
Kurz gesagt;
Die CPU-firmware ist ein reines Interpretationsergebnis und nur eine
modifizierte Form des Quellcodes, in der die Funktionen explizit
vorgegeben waren.
Die FPGA-firmware ist hingegen ein komplettes Analyse- und
Rechenergebnis der Synthesesoftware, wobei die Funktionen implizit
definiert wurden.
Ob man jetzt "Vorgeben" und "Definieren" als "Programmieren" oder
"Beschreiben" bezeichnen möchte und dort inhaltliche Abgrenzungen
eininterpretieren möchte, sei jedem selber überlassen.
Softwareentwickler schrieb:> Da liegt der Hase im Pfeffer! Die meisten an der HS lernen schon direkt> im 3. Semester VHDL, neben Python und C und sehen einfach die> Unterschiede nicht.
Um es dem Anfänger zu verklickern, was VDHL-Programmieren ist, verwende
ich gerne das Beispiel einer Arbeitsanweisung. Früher zu ABEL- und
Genrad-Zeiten war das nur eine einfache Vorschrift für einen virtuellen
Layouter. Da steht dann was drin wie : "Nimm die Gatter, klappere die
Eingänge ab und verbinde sie so und so mit den Ausgängen". Dabei wird
detailgenau und vollständig jede Leiterbahn bechrieben, wo wie man eine
CNC-Maschine programmiert. Irgendwann kamen dann Freiheitsgrade dazu und
der Layouter durfte vorher noch die Logik etwas optimieren und
vereinfachen :-)
Heute ist das eine komplette Abstraktionsebene höher:
VHDL ist eine Art Pflichtenheft für einen Elektronikentwickler geworden,
dem man das Eval-board hinlegt, die Funktionen (Mathematik, Timing,
Abläufe) vorschreibt und Randbedinungen für die Physik vorgibt und dann
nur noch in Einzelfällen detailgenau die Leiterbahnen bechreibt. In der
Regel werden nur logische und oftmals nur noch funktionelle
Verknüpfungen vorgegeben. Die Art der Umsetzung liegt dann komplett beim
Layouter, der inzwischen eine Art denkender Elektronikentwickler
geworden ist und Entscheidungen hinsichlich der Wahl der Resourcen sowie
der Konfiguration und der Platzierung derselnben trifft. Das Ergebnis
entzieht sich damit immer mehr der Betrachtung durch den
"Programmierer",
Wer da von Anfang an dabei war, der sieht diese Ebenen und kann damit
umgehen und die entsprechenden Schritte einordnen. Man kann bis zu einem
gewissen Punkt auch entscheiden, welche Abstraktionsebene der
Beschreibung in welchen Fällen die zielführendere ist oder die, welche
zu einer besseren Darstellung und Pflegbarkeit führt - bzw in
Einzelfällen Macken der tool chain umgeht :-)
Kurz gesagt:
Wer komplette Elektronikpflichtenhefte schreiben- sowie Chips einsetzen
und verbinden kann, der kann das Ganze dann auch leicht als
Anweisungskette in VHDL tun. Wer aber mit VHDL anfängt und sich das
Gebiet über diese abstrakte Sprache erarbeiten möchte, der hat ein
Problem.
Da hast du Recht! Eine Lösung dafür kann ich aber auch nicht bieten,
außer eben mit den basics anzufangen und dann am Ende mit abstrakten
Beschreibungen zu arbeiten. Das scheint aber in der Tat nicht der Fall
zu sein.
Wenn man sich die FPGA-Projekte an den Unis so ansieht (und auch das,
was hier im Forum oft so gefragt wird), dann stöpseln die Leute heute
offenbar ohne große Vorkenntnisse aus dem Stand ganze
Multiprozessorsysteme per SOPC-builder zusammen, während früher eine
komlette kleine RISC-CPU mit 10 Befehlen eine ganze Diplomarbeit war.
Ich bin nicht sicher, ob das so gut ist.