Hallo allerseits,
ich bin bzgl. VHDL und Ausnutzung der Features eher konservativ
unterwegs, haette da aber jetzt gerne mal ein Problem :o)
Ich habe verschiedene SPI-Interfaces mit identischen Chips oder
zumindest Protokoll-kompatiblen Chips, aber jeweils unterschiedlicher
Topologie:
* 2x ChipSelect mit 4-Kanal+AUX ADC
* 2x ChipSelect mit 3-Kanal ADC
* 4x ChipSelect mit 8-Kanal ADC
Also, die SPI-Master-FSM ist eigentlich immer die gleiche, aber die
Kommandosequenzen sind in den 3 Faellen halt unterschiedlich.
Dazu habe ich mir (anstatt eines Logikgrabes) eine LUT-basierte
FSM-Steuerung gebaut, sieht z.B. fuer einen der Faelle so aus (so im
Package definiert):
1 | type t_lut_cmd is array (0 to 39) of std_logic_vector (4+8+4-1 downto 0);
|
2 | constant c_lut_cmd1 : t_lut_cmd := (
|
3 | 0 => x"0_C0_F",
|
4 | 1 => x"0_C4_0",
|
5 | 2 => x"0_C8_1",
|
6 | 3 => x"0_C8_2",
|
7 | 4 => x"1_C0_F",
|
8 | 5 => x"1_C4_0",
|
9 | 6 => x"1_C8_1",
|
10 | 7 => x"1_C8_2",
|
11 | others => x"0_00_E"
|
12 | );
|
13 | constant c_lut_cmd2 ....
|
Es gibt also verschiedene Varianten dieser "lut_cmd" die im Package
definiert sind, halt noch mehrere 'constant' Eintraege. In meiner FSM
bzw. der zugehoerigen VHDL-Beschreibung muesste ich jetzt einfach nur
noch zwischen den 2/3/4/5/... "constant"-Zuweisungen umschalten koennen
und ich haette eine Logikbeschreibung, die aber durch die selektive
Initialisierung personifiziert.
In der VHDL-Beschreibung wuerde ich jetzt abhaengig von einem Parameter
oder sonstwas gerne einen der beiden folgenden Faelle deklarieren
koennen:
1 | signal lut_cmd : t_lut_cmd := c_lut_cmd1 -- erste Variante, oder
|
2 | signal lut_cmd : t_lut_cmd := c_lut_cmd2 -- 2. Variante, usw...
|
Preisfrage: Wie kann ich das machen? Mit 'generics' denke ich nicht.
Aber den Code einfach zu duplizieren und nur die Initialisierung aendern
(1 Character!) kanns ja nicht sein... Jede Aenderung in Zukunft muesste
ich dann in allen Varianten nachziehen...