В общем, мне кажется, неплохое описание.Тем не менее, я хотел бы указать на некоторые незначительные вещи (которые могут дать некоторые ответы на ваш 1-й вопрос).
1) Поскольку, как я вижу, сейчас ваш счетчик не содержит сброса (ни асинхронного, ни синхронного),В общем, вы не можете предсказать начальную точку своего подсчета (даже если, вероятно, это будут все 0 при запуске).На мой взгляд, было бы аккуратнее, если бы у вас был сигнал сброса.Я также заметил, что загрузка активируется независимо от того, включен счетчик или нет.У меня нет комментариев по этому поводу, так как это может быть спецификацией для вашего дизайна.Возможно, вы можете сжать код, переместив часть «if load» за пределы «if enable» (т.е. изменив порядок на сравнения).Чтобы улучшить удобочитаемость (особенно когда дизайн будет более сложным), я советую вам обозначить процесс.Это поможет вам определить различные части дизайна.Вы можете пропустить большую часть дополнительной типизации, если вы используете VHDL-режим emacs.Он имеет встроенные шаблоны, которые позаботятся о «скучной» части, связанной с кодированием.Я также вижу, что у вас есть значения по умолчанию для ваших входных портов.На мой взгляд, это не очень хорошая практика;они будут проигнорированы синтезатором, что приведет к IP, который может вести себя не так, как вы ожидаете.В общем случае не делайте предположений (в части тех, которые указаны) по внешним сигналам.Наконец, у меня есть комментарий о части сравнения.Это касается как вопросов 1), так и 2)
1-2). В процессе сравнения вы только что указали counter_value в списке чувствительности.Это означает, что процесс будет активирован только при изменении counter_value.Поскольку вы сравниваете его с сигналом (compare_match_value), который является входом для блока (следовательно, он может изменять значения), было бы лучше иметь его также в списке чувствительности.В противном случае сравнение не будет применено (т. Е. Процесс не будет активирован), когда вы измените compare_match_value.Инструменты Linting и синтезатор могут жаловаться на это (указав предупреждение как неполный список чувствительности).На самом деле, хорошей практикой является перечисление всех сигналов, которые могут измениться в списке для комбинаторных процессов.
Что касается самого сравнения, то, как вы его описали, абсолютно нормально, и у вас не будет непокрытых состояний.По сути, вы указали все возможные условия, поэтому никаких сюрпризов там нет.
3) Что касается вашего третьего вопроса, поскольку вы ориентируетесь на ПЛИС, вы можете «расслабиться» по этому поводу.FPGA имеют специальную структуру для быстрых арифметических операций и (если вы не используете их все), синтезатор будет использовать их для закрытия времени.Также в ASIC синтезатор, вероятно, выберет подходящую арифметическую структуру для закрытия времени.Если вы хотите быть в безопасности, вы можете добавить регистр на выходе блока сравнения.Это предотвратит создание длинного комбинаторного пути, особенно если ваш IP должен быть интегрирован с другими блоками.Конечно, этот дополнительный регистр добавил бы задержку в 1 такт, но это улучшит ваши общие временные характеристики.
Я надеюсь, что эти предложения могут быть полезны для вас и покроют (хотя бы частично) ваши сомнения.Продолжайте кодировать:)