Ich würde gerne mehr Struktur in meine Programme bekommen. Gestern habe
ich an der Initialisierung von angeschlossener Hardware gesessen. Also
Sachen die an i2c oder spi hängen und am Anfang erst eingestellt werden
müssen.
Da hatte ich bis jetzt ewig lange statemachines. Ich versuche das über
ein record, wo die init-Daten übersichtlich drin sind und was von einer
viel kleineren statemachine benutzt wird.
Mein Problem ist aber, dass ich keine Ahnung habe, ob und wie ich die
Länge der init_daten automatisch an die vorgegebenen Konstanten anpassen
kann.
1
typet_init_datais
2
record
3
slv8_adr:unsigned(7downto0);
4
slv8_dat:unsigned(7downto0);
5
i_delay:integerrange0to100;--in clocks. ms wäre auch ne option?
Ich hoffe ihr versteht, was ich für ein Problem habe.
1
typet_init_datasisarray(0to2)oft_init_data;
soll nicht fest auf Länge 3 stehen sondern ich möchte das alles nur über
die Initialisierung des Record machen. Henne und Ei.
Gibt es da eine elegante und übersichtliche Methode?
Erste Frage, Simulation oder Synthese?
zu Gast schrieb:> Ich würde gerne mehr Struktur in meine Programme bekommen.
Naja mittels VHDL beschreibt man und programmiert nicht. Beim
Programmieren nutzt du den durch den Prozessorhersteller vorgegeben
Befehlssatz. Beim FPGA hingegen kannst du z.B. genau solch einen
Befehlssatz definieren.
zu Gast schrieb:> Ich hoffe ihr versteht, was ich für ein Problem habe.type t_init_datas> is array (0 to 2) of t_init_data;
Wer hindert dich daran einen kleinen Spezial Prozessor zu entwerfen.
Daten bekommt er aus einem ROM (IP Generator deines FPGAs) und dann
arbeitet die FSM genau diesen ROM ab und initialisiert Device für
Device.
Wie gut sind deine VHDL Kenntnisse, was waren deine Projekte bis jetzt?
Kenntnisse würde ich sagen über das Anfangsstadium hinaus, aber kein
Experte. Sonst würde ich ja auch so was nicht fragen müssen ;-)))
Aber auch so weit, dass die reflexartige Erwähnung von HDL und Software
nicht unbedingt hilfreich ist.
Es geht um die Sythese, denn ich will ja die angeschlossene Hardware
etwas übersichtlicher initialisieren.
Das ganze auch als unabhängig synthetisierbarer rtl Code.
type t_init_datas is array (natural range <>) of t_init_data;. Kannst du
das an meinem Beispiel etwas weiter konkretisieren? Denn damit habe ich
versucht ans Ziel zu kommen und bin gescheitert, denn muss ich nicht
trotzdem die Gesamtlänge im vorraus wissen?
zu Gast schrieb:> denn muss ich nicht> trotzdem die Gesamtlänge im vorraus wissen?
Nein, das ist ja gerade der Trick an der Sache.
Ändere mal Deinen Code in dieser einen Zeile und Du wirst sehen, er
funktioniert genauso wie vorher.
Und noch ein Tipp: An die Größe des Arrays kommst Du über das Attribut
'length', wie z.B.:
Hmm. Also nicht dass wir aneinander vorbeireden mal ganz konkret (s.u.):
:-)
Wenn ich bei
signal init_datas : t_init_datas(0 to 2) := ((slv8_adr=>x"00",
slv8_dat=>x"42", i_delay=>3), --0
(slv8_adr=>x"01", slv8_dat=>x"14", i_delay=>0), --1
(slv8_adr=>x"42", slv8_dat=>x"23", i_delay=>5) --2
);
nicht angebe wie groß das Array denn nun ist, gibt es "init_datas" does
not have an index constraint"
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
entityinitializeis
6
port(isl_clk:instd_logic;
7
isl_rst:instd_logic;
8
oslv8_data:outstd_logic_vector(7downto0);--hier nur auf leds nachher spi
9
isl_init_start:instd_logic;--initialisierung starten
Dass es mit Signalen so direkt nicht funktioniert, hatte ich auch noch
nicht gewusst ;-)
Aber da Du auf das Signal 'init_datas' sowieso nur lesend zugreifst,
kannst Du auch gleich die Konstante 'c_init_datas' anstatt verwenden.
Und noch eine Falle lauert: das Attribut 'length' gibt die Länge an; in
diesem Fall 3. Dein Indexsignal 'i_init_length' sollte also nur von 0
bis 'length' -1 laufen:
Sonst kann es passieren, dass Du auf das 4. Arrayelement zugreifst, was
jedoch nicht existiert. Die Synthese geht darüber in der Regel großzügig
hinweg, obwohl es ein undefiniertes Verhalten bedeutet. Die Simulation
ist da strenger; die haut Dir das, so wie es sich gehört, um die Ohren
;-)
Pat A. schrieb:> Dass es mit Signalen so direkt nicht funktioniert, hatte ich auch noch> nicht gewusst ;-)
Die können ja beliebige Breiten annehmen und Ich glaube, dass die
Synthese so viel Variable Information nicht handhaben kann. Das gibt es
ja auch noch an anderer Stelle, wo sie aussteigt und Deklarationen nicht
auflösen kann.