Во-первых, при написании HDL или адаптации HDL для FPGA, это действительно окупается, чтобы понять возможности и ограничения вашей конкретной FPGA. Xilinx отлично справляется с документированием каждой модели FPGA. Глядя на блоки LUT4 и MUXF5, ваше семейство FPGA может быть Spartan 3? Изучая таблицы данных, вы можете увидеть, какие аппаратные конструкции очень эффективны для реализации, а какие требуют больше ресурсов. В целом, чем ближе аппаратная часть сопоставляется с тем, что на самом деле находится на чипе, тем быстрее она будет работать и меньше будет занимать область.
Например, Xilinx LUT также может использоваться в качестве регистра сдвига, что означает, что вам не нужно использовать триггеры в срезе. Это приводит к очень заметному улучшению, если вы убедитесь, что ваши регистры сдвига сопоставлены с LUT. XST старается изо всех сил с вашим HDL выводить эти эффективные сопоставления, но часто существуют глупые вещи, которые мешают этим эффективным сопоставлениям, такие как сигнал разрешения, проверяемый перед сигналом сброса. Убедитесь, что вы изучили выходные данные синтезатора, а также место и маршрут, чтобы определить случаи, когда вы можете улучшить отображение на вашей FPGA. В документации Xilinx приводятся примеры VHDL и Verilog, которые XST может использовать для определения более эффективных компонентов. Иногда проще просто создать экземпляр компонента напрямую. А для сложных компонентов есть UNIMACRO и мастер COREGEN, которые производят очень эффективное оборудование.
В качестве крайнего примера, микроконтроллер PicoBlaze был написан специально для использования преимуществ архитектуры Xilinx FPGA. Может быть полезно изучить исходный код PicoBlaze, чтобы увидеть примеры этого эффективного отображения.
Во-вторых, если ваш комбинационный логический путь слишком длинный, он ограничит вашу максимальную тактовую частоту. Помимо переписывания кода, чтобы лучше отобразить его на ПЛИС, или переписывания, чтобы исключить ненужные аппаратные ресурсы, вы также можете вставить триггеры (регистры) где-то в середине вашей комбинации комбинационной логики. В компьютерной архитектуре это называется конвейерной обработкой и приведет к увеличению количества циклов на инструкцию. Например, PicoBlaze использует два цикла на инструкцию. В Intel Pentium 4 было около 17 циклов на инструкцию. Если вы сообразительны, вы можете написать свой HDL так, что вы начнете обрабатывать одну инструкцию и одновременно закончите обработку последней. Это означает, что для выполнения каждой инструкции (задержки) все равно потребуется 2 такта, но вы сможете удалить одну инструкцию за цикл (пропускную способность). Большинство микроконтроллеров, таких как 8051 и PicoBlaze, связаны с задержкой, а большинство микропроцессоров, таких как архитектура x86, связаны с пропускной способностью.