Цитата(Aluminium @ Jan 30 2007, 21:50)

Есть 16-разрядный мультиплексированный порт процессора. По нему можно в память процессора писать данные или грузить программу. Из него можно читать данные или код (последнее труднее, потому что код 24-разрядный).
...
Общая задача состоит в том, чтобы периодически писать по IAL адреса, а потом по #IRD и #IWR писать и читать данные. Иногда сбрасывать процессор.
Вот, теперь понятно. Почти такая же задача стоит и у меня. Я пришел вот к какому решению (правда у меня не процессор, а FPGA, но это в данном случае без разницы).
1. Есть режим записи/считывания служебной информации посредством порта управления/состояния (т.е. набор внутренних регистров). Один из этих регистров служит защелкой начального адреса для блока данных.
2. Есть режим записи/считывания блоков данных размером в ендпойнту (у меня величина блока данных - 512 байт с перспективой увеличения до 1024 байта, когда специалисты из Cypress'а дадут ответ, как это сделать. Пока они уже почти неделю чешут репу, задали парочку дурацких вопросов, короче, виляют как уж на сковородке в попытках уклониться от моих пожеланий :-)
3. Для разделения этих двух режимов я использую свободную ногу порта ввода/вывода микроконтроллера в CY7C68013A. Типа, "1" - пишутся/читаются управляющие данные, "0" - пишутся/читаются блоки данных.
4. Для канала управления используется режим записи/считывания одиночного слова (GPIF Waveforms: Single Word Write и Single Word Read), в котором старший байт - номер регистра, а младший байт - данные для записи в этот регистр. Для считывания регистра используется более хитрый метод из двух операций: сначала записывается номер регистра в специальный регистр номера, а затем считывается байт данных того регистра, номер которого мы только что записали.
5. Для канала блочной передачи данных используется режим записи/считывания посредством FIFO (GPIF Waveforms: FIFO Write и FIFO Read).
Таким образом представляется, что в твоем случае можно использовать вэйвформу Single Word Write для записи начального адреса, а вэйвформы FIFO Write, FIFO Read для последующего записи/считывания данных. Тогда можно развести сигналы так: IAL, #IRD и #IWR на выводы CTL0...2, а #IS включить постоянно или подать на свободный вывод порта ввода/вывода. В вэйвформе Single Word Write будут активизироваться сигналы IAL=1 и #IWR=0 для защелкивания адреса, а в вэйвформах FIFO Write и FIFO Read - IAL=0 и #IWR=0 или #IRD=0 для передачи данных.
Цитата(Aluminium @ Jan 30 2007, 21:50)

Да, испугался я при словах "техническое задание". :-)
:-)
Цитата(Aluminium @ Jan 30 2007, 21:50)

Про конфликты на шине. Меня еще n-лет назад учили, что аппаратура не должна позволять программе себя сжечь. Поэтому никогда раньше не делал, чтобы программист мог одновременно и чтение, и запись заделать. Поэтому всегда предпочитал управлять устройствами с шины, а не портами ввода-вывода. А сейчас не хочется разбираться и вспоминать, особенно когда почти все так и делают. Знаю, что современный КМОП так не сожжешь, так что вопрос философский, ищу себе оправдания.
Ерунда, не бери в голову. Во-первых, в подобной ситуации с нынешними микросхемами трудновато что-то сжечь (я еще ни разу не сталкивался, хотя ошибки неоднократно допускал). Во-вторых, как я понял, данные из твоего процессора выдаются только по сигналу #IRD, и хорошо, что этот сигнал инверсный (хорошо тем, что в неинициализированной системе он будет неактивным; нужно только не забыть поставить подтягивающий резистор на Vcc). Таким образом твоя задача упрощается до минимума: нужно просто не допускать одновременного появления обеих сигналов #IWR и #IRD.