Это не совсем программа, это описание цифрового устройства со всякими триггерами и комбинационными устройствами. Поэтому сначала нужно продумать схему до уровня отдельных счетчиков, регистров и комбинационных устройств, и только потом писать код.
То, что из кода синтезируется схема, это понятно
. Вот только сообразить, что получится на выходе, не всегда удается. Один из предыдущих проектов был на XC9572XL - написал рабочий код, но при малейшей его модификации схема переставала синтезироваться, хотя был запас по макроячейкам, термам и регистрам. Причем происходило это совершенно непредсказуемо - "Если увеличить разрядность регистра cnt с 15 до 17 бит, будет задействовано на 2 регистра больше и на 6 термов меньше, а если поднять до 19 бит, то для синтеза внезапно не будет хватать 234 термов!". А на XC6SLX9 все работало без проблем, и, вроде, ячеек меньше занимало. CPLD очень требовательны к качеству кода.
По этой же причине, чтобы однозначно отделить комбинационные части устройства от последовательностных, в блоках always не стоит использовать блокирующие присваивания.
С этим есть проблемы. Во многих случаях важна последовательность команд, поэтому использую блокирующие присваивания. Но Квартус ругается на смешивание разных типов присваиваний, поэтому в итоге приходиться выдерживать все в одном стиле.
Ваш код пока не пробовал - сложновато для меня, нужно время, чтобы разобраться.