Sie müssen sowohl die Anzahl der Ausgänge als auch die Größe des Steuerarrays als Generics übergeben, es sei denn, Sie verwenden immer Potenzen von zwei.
Außerhalb Ihres (De-)Mux-Moduls (d. h. wenn Sie instanziieren), können Sie Code verwenden, um die Anzahl der Bits für den Steuerbus zu berechnen. Ich habe eine Funktion in einem gemeinsamen Paket, das ich verwende, um verschiedene Konfigurationskonstanten und Generics zu initialisieren, die an Code ähnlich wie Ihre (De-)Mux-Anwendung übergeben werden:
-- Berechnen der Anzahl der Bits, die zur Darstellung eines bestimmten Werts erforderlich sind
function NumBits(val: integer) return integer is
variable result: integer;
begin
if val=0 then
result := 0;
else
result := natural(ceil(log2(real(val))));
end if;
return result;
end;
...was es Ihnen ermöglicht, Dinge wie folgt zu tun:
constant NumOut: integer := 17;
signal CtrlBus: std_logic_vector(NumBits(NumOut)-1 downto 0);
my_mux: demux
generic map (
NumOut => NumOut,
NumCtrl => NumBits(NumOut) )
port map (
control => CtrlBus,
...
...