Een basis component die vaak voorkomt is een multiplexer.
...
architecture Behavioral of ...
...
signal rotate_left : STD_LOGIC_VECTOR(7 downto 0);
signal rotate_right : STD_LOGIC_VECTOR(7 downto 0);
signal MUX_select : STD_LOGIC;
signal transformed : STD_LOGIC_VECTOR(7 downto 0);
...
begin
...
-- optie 1
transformed <= rotate_left when MUX_select = '0' else rotate_right;
-- optie 2
with MUX_select select
transformed <= rotate_left when '0',
rotate_right when others;
-- optie 3
PMUX: process(rotate_left, rotate_right, MUX_select)
begin
if MUX_select = '0' then
transformed <= rotate_left;
else
transformed <= rotate_right;
end if;
end process;
...
end Behavioral;
In het voorbeeld hierboven zijn er twee signalen rotate_left en rotate_right. Eén van beide wordt doorverbonden met het signaal transformed. Welke van beide mogelijkheden doorgegeven wordt, wordt bepaald door de waarde van het signaal MUX_select (‘0’: rotate_left en ‘1’: rotate_right). Note that select is a keyword.
Alle drie de opties zijn geldige VHDL constructies. Met de netlist (die gegenereerd wordt door de synthese-tool) in achterhoofd, is er geen verschil tussen de drie opties.
De derde optie vergt nog een extra woordje uitleg. Een process is een set van instructies, tussen begin en end die sequentieel uitgevoerd wordt. De vraag die zich dan stelt is: “Wanneer wordt deze lijst van instructies uitgevoerd ?”. Om dit te definiëren is er de sensitiviy list. Dit is een oplijsting van signalen die, wanneer ze veranderen van waarde, het proces triggeren.
Tenslotte dient er nog vermeld te worden dat een process een naam kan hebben. In het voorbeeld is dit: PMUX.
Merk op dat de regels tussen begin en end van het process eigenlijk niet-synthetiseerbaar zijn. In het geheel van het process, wordt het wel synthetiseerbaar.
Een tweede opmerking is er (bewust) een mismatch is tussen de schematic en de code, met name: de breedte van de signalen. Als er twee draden zijn die naar 1 draad moeten gaan, volstaat een 2-naar-1 multiplexer. Indien er echter 2 bussen zijn die naar 1 bus moeten gaan, zijn er meerdere multiplexers nodig. In het geval van een 8-bit bus, worden het acht 2-naar-1 multiplexers.
Q: Wat zijn de mogelijke waardes die MUX_select kan hebben ?
Dat is een simpele vraag en het eenvoudige antwoord hierop is: het maakt niet uit. “Waarom ?”, hoor ik je zeggen?
Laat ons even teruggaan naar het begin: