Использовать индексирование?
PROCESS
VARIABLE shift_count : INTEGER RANGE 0 TO 31;
BEGIN
IF rst = '1' THEN
res <= (others => '0');
ELSIF RISING_EDGE(clk) THEN
shift_count := to_integer(sel);
FOR I IN 0 TO 31 LOOP
IF I + shift_count < 32 THEN
res(I) <= din(I + shift_count);
ELSE
res(I) <= din(31); -- for logical shift right, use '0' instead
END IF;
END LOOP;
END IF;
END PROCESS;
Эта версия намного проще параметризовать в общий.
Помните, что VHDl - это поведенческое описание, оно не определяет мультиплексирование. Компилятор может генерировать различные проекты в зависимости от того, оптимизируете ли вы размер, скорость, разрешите конвейерную обработку и т. Д.
Обратите внимание, что 5 2: 1 мультиплексоры могут реализовать это в гораздо меньшей области, чем один 32: 1 мультиплексор. Если это не тот блок, который ограничивает вашу тактовую частоту, это может быть предпочтительнее.
Также обратите внимание, что ваш sel
ввод слишком широкий, он должен быть только 5 бит.