Looking at your code, it might actually be a bit more readible to use a variable to cast the slice of rr to an integer before the case. Your case statement as it is currently would not work when N > 3, as you have a constant width on the zero expression. With the following code, it will work with all widths of rr, and will only synthesise to an apprirate width (to ensure this, you could constrain rr_int to the appropriate width, but it should fall out in synthesis).
PROCESS (rr)
variable rr_int : integer;
BEGIN
rr_int := to_integer( unsigned( rr(N)((N-1) DOWNTO 0) ));
CASE rr_int IS
WHEN 0 => SS0 <= 16#7E#; -- when N=3, this statement is fine
WHEN 1 => SS0 <= 16#30#; -- when N=3, B"1" should be seen as B"001"
END CASE;
END PROCESS;