Thursday, 18 September 2014

vhdl - How to create an n-bit multiplexer?


I'm needing to create a 4 bit, 16 input multiplexer. I know I could describe this as a long list of S => when "0000" etc.. but I think that's not very clean, and I'd like to opt for a generic n-bit multiplexer so I can reuse it later for more inputs or whatever.


How would you do this?



Answer



It's like this:


use ieee.numeric_std.all;

...
signal din :std_logic_vector (15 downto 0); -- must be "downto 0"
signal sel :std_logic_vector (3 downto 0);
...
dout <= din(conv_integer(sel));

Hope that helps!


Addition: If you'd need a multiple bit wide mux then...


type data_bus_array is array(7 downto 0) of std_logic_vector (31 downto 0);
signal din :data_bus_array;

signal dout :std_logic_vector (31 downto 0);
signal sel :std_logic_vector (3 downto 0);
...
dout <= din(conv_integer(sel));

This is where VHDL gets a little bit wordy, since sometimes it's not "compact" to fill in that data bus array just to do a simple mux. But, there you have it...


No comments:

Post a Comment

arduino - Can I use TI&#39;s cc2541 BLE as micro controller to perform operations/ processing instead of ATmega328P AU to save cost?

I am using arduino pro mini (which contains Atmega328p AU ) along with cc2541(HM-10) to process and transfer data over BLE to smartphone. I...