Изучаю ПЛИС и Verilog и никак не могу понять как работает шина данных процессора. Я пока представляю себе её так: есть 2 регистра шириной N бит, один из них адресный, второй - для данных. Процессор после декодирования команды кладёт в адресный регистр адрес памяти или периферии, а в регистр данных - данные. А каждый модуль периферии (включая контроллер памяти) следит за адресным регистром и если он равен диапазону адресов устройства, то забирает данные и что-то делает. В случае же если ядро хочет прочитать данные, то оно как-то это указывает (отдельным битовым регистром или же одним из битов адреса) и на следующем такте в регистре данных окажется то, что нужно.
Собственно не понятно:
1) Как периферия поймёт, что пришло время забирать адрес из шины адреса? Ведь логика периферии может начать сравнивать адрес перед тем, как логика ядра положит его (тем более что декодирование инструкции скорее всего будет сложнее, чем логика периферии). Проблему можно решить тем, что периферия работает по отрицательному фронту клока, а ядро по положительному, но это скорее всего не оптимальное решение.
2) Получается, что на чтение будет уходить 2 такта - на первом положили адрес, а на втором считали. Это опять же кажется не оптимальным.
Скорее всего я просто не понимаю банальных принципов работы ПЛИС, поэтому хочу чтобы меня ткнули в них носом.