Я пытаюсь создать мультиплексор с общим количеством операторов case. В настоящее время мой код выглядит так:
В этих примерах data_array и selector являются входными данными, data — выходными данными, а ширина мультиплексора равна 4.
process(all)
begin
case? selector is
when "1---" => data <= data_array(3);
when "01--" => data <= data_array(2);
when "001-" => data <= data_array(1);
when "0001" => data <= data_array(0);
when others => data <= (others => '-');
end case?;
end process;
Есть ли способ получить общее количество операторов case? Или есть аналогичная функция, которую я мог бы использовать?
Я мог бы решить эту проблему, используя генерацию кода для создания соответствующего количества операторов case, но мне было интересно, есть ли функция VHDL (-2008), которую я мог бы использовать для решения этой проблемы.
Я переписал мультиплексор, чтобы использовать цикл for, но, к сожалению, мой инструмент реализации не очень хорошо справляется с этим. Логика, которая выводится, не оптимальна и довольно плоха с точки зрения времени.
В этом примере GENERIC_WIDTH — это ширина мультиплексора.
process(all)
begin
data_v := (others => '0');
for i in 0 to GENERIC_WIDTH-1 loop
if selector(i) then
data <= data_array(i);
end if;
end loop;
end process;
Я ориентируюсь на устройство Xilinx, использующее Vivado 2017.3. Результаты реализации показывают, что использование оператора case дает более эффективную логику (с точки зрения WNS и логической глубины), чем использование цикла for.
exit;
послеdata <= data_array(i);
? Я ожидаю, что это даст тот же результат, что и ваш первый пример. Кроме того, предполагая, что вашselector
имеет диапазонdownto
, ваш цикл for также должен использовать диапазонdownto
, чтобы соответствовать соответствующему оператору case. - person scary_jeff   schedule 30.11.2017GENERIC_WIDTH:=4
? - person JHBonarius   schedule 01.12.2017GENERIC_WIDTH
на большое число, использование ресурсов и задержка станут большими. Это неизбежно. - person JHBonarius   schedule 01.12.2017