Метастабы. Сигнал WR_EN асинхронен по отношению к клоку, а участвует в стейтментах с клоком.
- Code: Select all
if CLC'event and CLC = '0' then
if WR_EN = '1' then
SHIFT_OUT <= DI;
Вот это компилится в 8 триггеров. К каждому из них подведен клок, WR_EN. Последний идет по обычному (не глобальному) нетворку, а значит, что на разные триггеры он доходит с разной задержкой. С небольшой, но разной. А теперь представь, что WR_EN приходит в твои триггеры одновременно с клоком (ведь мы ж не знаем, откуда он там приходит, может его по модему с Марса в НАСА принимают). Получается, что одни триггеры его увидят до клока (и схавают), а другие его получат после клока. Понимаешь, да.
А теперь блядкат тебе советует сдвинуть клок. Ты двигаешь клок, WR_EN уезжает в сторону (про setup-ы/hold-ы я здесь даже не говорю, слова иностранные такие), но в результате кое-как укладывается в один период клока. Ежу ясно, что на соплях, потому что от любого чиха развалится.
Чтобы подобной хуйни не происходило, WR_EN надо застробировать на клок домена. Чтоб неважно с какой задержкой, но приходил он по расписанию. Это называется синхронный дизайн, детка.