Цитата(justontime @ Dec 19 2017, 21:01)
Пытаюсь поделить немерено разросшуюся FSM на несколько частей, в т.ч. выделить кусок в нечто типа функции (не в смысле понятия функции в HDL, а просто как узел, используемый из разных частей схемы).
Как правильно организовывать взаимодействие между несколькими FSM ? Флагами, или есть более красивый/правильный способ ?
И что делать, если две FSM должны управлять одними и теми же сигналами ? Например, есть автомат, производящий довольно сложный процесс инициализации устройства по SPI. Этот автомат должен использовать отдельную FSM для передачи байтов в устройство, но при этом и сам основной автомат хочет иногда подергать сигналы SPI.
Как правильнее поступать в подобных случаях ? У меня все работает, но нагромождение флагов и прочей фигни делает код нечитаемым даже для меня
P.S. Вообще пишу на VHDL, но вряд ли это сильно зависит от конкретного языка - скорее, интересует общий подход...
Вообще, идея в том, что бы ГЛАВНОМУ автомату никогда не хотелось самому подергать SPI. Он все делает через стоящие ниже по иерархии автоматы. Т.е. каждый автомат выполняет четко свою задачу и не лезет на другие уровни иерархии.
Главный - забирает посылку (запрашивает данные, формирует суперкадр). Средний - формирует кадры (откусывает по кадру от суперкадра, сформированного главным). Нижний - рабоает на уровне бит (роняет CS, выставляет клок, данные).
При этом каждый из них полностью завершен и очень глуп:
Нижний просто передает 1 кадр по SPI. Он не знает, сколько кадров всего, как часто передаются и т.д. Просто получает старт-передает-отдает сигнал завершения передачи.
Средний просто управляет первым. Он не знает размер посылки, умеет только забирать кусок и скармливать нижнему.
Главный формирует посылку и рулит средним.
А если главный автомат в обход среднего и нижнего захочет подергать SPI - это приведет к дикой путанице и усложнению. В идеале - растащить автоматы по разным модулям, что бы в одном модулей было не более 1 автомата. Пусть даже эти модули и будут мизерными по размеру.
Взаимодействие можно организовать по флагам-состояниям автоматов. Допустим, главный щелкает из wait->start->wait_end. Здесь состояние start будет командой среднему начать обработку посылки.