your "make_binary" function is redundant for your code as it is now. As unsigned and std_logic_vector are closely related types (they are both arrays of std_logic) you can convert from one to the other using a simple type case:
my_slv <= std_logic_vector(my_us);
my_us <= unsigned(my_slv);
it also does some X01 conversion, there already exists a function for this, called to_X01.
my_slv <= to_X01(my_slv);
But why do you want to have only 'X' and 0 or 1? the 'U' value lets you know in simulation that something hasnt been initialised properly. and how are you going to cope with 'Z' when you need to build a tri-state driver?
It seems you're re-writing code that already exists, and you probably dont need to use them anyway.