Проект Ziduino. Универсальный контроллер для ностальгирующих по Z80.

Категории раздела

Схемотехника [1]

Статистика


Онлайн всего: 1
Гостей: 1
Пользователей: 0

Каталог статей

Главная » Статьи » Схемотехника

ПДП на FT245BL

    В процессе работы над проектом встал вопрос тестирования схемы и отладки управляющего программного обеспечения на реальном железе.  В наше время подобные задачи решаются с минимальных затратами ресурсов при помощи средств виртуализации. Но в моём случае это потребовало бы больших временных затрат на изучение данных инструментов и создание виртуальной модели, которая без соответствующего опыта могла бы оказаться не достаточно точной. Таким образом было принято решение сразу реализовать устройство в железе.  И если безошибочно спроектировать не слишком сложную цифровую схему вполне возможно даже для новичка, то написать для неё управляющее программное обеспечение, которое сразу "просто заработает"  представляется крайне затруднительной задачей. Таким образом было решено сконструировать "виртуальное ПЗУ" - схему, эмулирующую работу реальной ПЗУ, "прошивка" в которую загружается через какой-либо интерфейс с ПК.

    Первая реализация была максимально простой и рассчитана для подключения через LPT-порт компьютера.

    По сути устройство представляет собой микросхему статической 8-разрядной памяти, доступ на запись для которой возможен только со стороны LPT-интерфейса. Со стороны микропроцессора память доступна только для чтения. Два 8-разрядных регистра 1533ИР23 позволяют формировать через LPT-интерфейс 16-битный адрес, а шинный буфер 1533АП6 осуществляет коммутацию шины данных статической памяти между процессорной шиной и интерфейсом с ПК.  Несколько элементов логики служат для переключения режимов доступа к памяти. Управляющее ПО путём изменения уровня на 1-ом контакте (сигнал STROBE) последовательно записывает в регистры верхнюю и нижнюю части адреса, затем, выставляя на 16-ом контакте интерфейса Centronix низкий логический уровень, вызывает запрос шины данных у микропроцессора (^BUSRQ). Как только от процессора приходит подтверждение освобождения шин (^BUSACK=0) производится включение выходов регистров адреса и соединение шины данных микросхемы статической памяти с шиной данных LPT-интерфейса в направлении, определяемом состоянием 14-го контакта интерфейса Centronix (AUTO_FD_XT).  Запись байта данных в микросхему памяти производится стробом через 17-й контакт интерфейса Centronix (SLCT_IN)

    Управляющая программа написана на языке Си и предназначена для запуска под ОС Linux. Для её корректной работы необходимо наличие root-полномочий. 

 Данная схема ПДП позволила на этапе макетирования произвести проверку работоспособности некоторых схемотехнических решений, не прибегая к многократной перепрошивке ПЗУ.  Через некоторое время стало очевидно, что для дальнейшей проработки управляющего ПО конструкции необходимо обеспечить возможность его дальнейшего оперативного обновления, но архаичный LPT-интерфейс в готовой конструкции был явно лишним элементом. Кроме того, из-за отсутствия данного интерфейса на современных ПК, возникали серьёзные затруднения с его использованием.  В результате было принято решение добавить в схему преобразователь USB<->LPT интерфейса. Непродолжительные поиски в интернете обнаружили интересное изделие компании FTDI, микросхему FT245BL. Чип представлял собой преобразователь интерфейса USB<->Parallel FIFO. На первый взгляд показалось, что этого будет достаточно, а схема потребует минимальной доработки, но при внимательном чтении даташита производителя обнаружилось, что прикрутить его к существующей конструкции задача нетривиальная.

  Наиболее неприятным открытием оказалось то, что данный чип не в состоянии самостоятельно управлять параллельной шиной. Более новые его модификации типа FT245RL уже имели режим синхронного 'bit-bang', который позволял выводить или принимать поток данных с заданной скоростью, но данный,  единственный на тот момент доступный мне чип имел только асинхронный bit-bang режим, что не позволяло обеспечить чтение данных из ОЗУ в ПК без дополнительных схемотехнических затрат.  

  Безусловно наиболее простым решением могло бы оказаться использование какого-нибудь микроконтроллера с USB-интерфейсом, но его применение сделало бы всю затею ещё более странной, чем она является.  Ведь подобный микроконтроллер будет обладать более широкими возможностями и производительностью, чем микропроцессор на котором базируется проект. И тогда возникает резонный вопрос, а зачем вообще вся эта сложная конструкция, если микроконтроллер, который используется для её связи с ПК обладает большими возможностями, чем она сама...

  Результатом непродолжительных поисков решения стало использование двух одновибраторов, формирующих задержки для стробов подтверждения чтения/записи данных и коммутатор на базе 4-х D-триггеров, осуществляющий функцию селектора потока данных. Таким образом скорость передачи данных стала определяться параметрами одновибратора и установлена близкой к предельной для FT245.   Задача чтения данных в ПК решена через формирование потока данных для записи без её фактического осуществления.  То есть, каждый цикл записи байта данных из ПК в микросхему статической памяти дополнительно запускает цикл чтения байта данных из того же адреса памяти и его передачу в ПК. В целях осуществления чистого чтения данных, без изменения содержимого статической памяти, предусмотрены команды управляющие разрешением / запретом записи в память.

  Ниже приведен фрагмент схемы, реализующий функцию ПДП через USB-интерфейс. 

  При появлении в выходном буфере FT245 байта данных для записи в параллельный порт, выход ^RXF переходит в состояние логического '0', запуская тем самым цикл записи данных, при условии, что в это время не производится передача данных в ПК (WR=0). В этом случае выход '1' IC8A переходит в состояние логической '1', приводя к запуску одновибратор IC18B. Запуск одновибратора производится, если выполняются условия: Процессорная шина еще не запрошена (^BUSRQ=1, соответственно передаваемый байт является управляющим или адресным и не должен записываться в микросхему памяти) или, если процессорная шина была ранее запрошена и уже подтверждена (^BUSACK=0) и при этом FT245 готов к приёму данных в буфер (^TXE=0,  режим чтения в ПК).

  Одновибратор IC18B формирует одиночный импульс строба записи данных длительностью около 80ns, который поступает на вход подтверждения записи ^RD FT245, а также на один из входов записи регистров адреса IC29,IC30 или процессорную шину WR, в зависимости от состояния коммутатора IC19. Кроме того, импульс строба инициирует запись состояния бита XD7 в регистр управления разрешением записи IC24B, при условии, если активен 3-й канал селектора IC19 (выход ^Q3)

  Если селектор IC19 находится в исходном состоянии (все выходы отключены), импульс строба с прямого выхода IC18B производит сброс триггера разрешения записи IC24B и триггера установки селектора IC24A в исходное состояние.

  Таким образом запись в порт последовательности из 4-х байт, с установленным в '0' младшим битом (#FE), позволяет выполнить синхронизацию потока данных, гарантировав перевод селектора IC19 в исходное состояние. (Вход CLR=0).

  Перевод селектора IC19 в исходное состояние также может быть выполнен активацией сигнала ^RESET, который установит выход Q триггера установки селектора IC24A в состояние логического '0', что в свою очередь переведёт в тоже состояние выходы Q1,Q2,Q3,Q4 селектора IC19

  Как только в поток данных поступит байт, младший бит которого установлен в '1' (#FF), сигнал сброса будет снят со входа CLR IC19 и начало нового цикла вывода данных из FIFO буфера FT245  (^RXF->'0') приведёт к записи логической '1' в первый триггер селектора IC19, разрешив тем самым через IC31A прохождение сигнала строба на вход синхронизации регистра младшего байта адреса IC29. С положительным перепадом сигнала строба, сформированным одновибратором IC18B, байт данных на выходах FT245 будет загружен в регистр IC29, при этом выходы адресных регистров будут оставаться в отключенном состоянии до тех пор, пока процессорная шина не окажется запрошена и подтверждена (^BUSACK=^BUSRQ='0')

  Появление следующего байта данных в потоке, положительным перепадом на входе синхронизации CLK IC19, вызовет перенос '1' с выхода Q1 триггера IC19 на выход Q2, тем самым через IC31D разрешив прохождение сигнала строба на вход синхронизации регистра старшего байта адреса IC30 

  Начало передачи третьего байта данных потока активирует выход Q3 селектора IC19. Появление логической '1' на данном выходе по положительному перепаду ^RXF (окончание цикла вывода данных), запускает одновибратор IC18A, формирующий строб чтения данных из памяти в ПК. Вместе с тем, активный уровень на выходе Q3 IC19, через IC8B вызывает запрос процессорной шины ^BUSRQ, а при его подтверждении сигналом ^BUSACK, включает выходы адресных регистров и через IC17C, IC8D выводит буфер IC23 из Z состояния. Также активный уровень на выходе Q3 блокирует работу одновибратора IC18B, если освобождение процессорной шины не подтверждено или FIFO буфер FT245 переполнен (^TXE=1)

  Строб чтения с выхода ^Q одновибратора IC18A запускает цикл чтения данных из микросхемы памяти, активируя сигнал процессорной шины RD и управляя направлением передачи данных  буфера IC23 через IC17B, а также формируя положительный импульс WR на входе записи данных в FT245. Стоит особо отметить, что данный цикл запускается не ранее, чем будет получено подтверждение освобождения процессорной шины сигналом ^BUSACK.   Это достигается за счет того, что сразу с активацией выхода Q3 селектора IC19 до подтверждения шины и готовности буфера FIFO блокируется работа одновибратора, тем самым фиксируя RD FT245 в состоянии '0', что приводит к удержанию сигнала ^RXF в состоянии '0' и откладывает запись '1' с выхода Q3 IC19 в триггер IC18A

  Активное состояние выхода Q3 селектора IC19 также разрешает запись бита XD7 шины данных в триггер управления записью IC24B.  Если в третьем цикле был передан байт данных, младший разряд которого содержал логическую '1' (#FF), то на выходе ^Q триггера IC24B установится '0', что в свою очередь через IC28C разблокирует строб записи для следующего цикла передачи данных.

  Появление четвертого байта данных, при его наличии в буфере FIFO, происходит сразу по завершению цикла считывания байта из памяти в ПК.  У селектора IC19 активируется выход Q4, что через IC8B продлевает захват процессорной шины сигналом ^BUSRQ и формирует строб записи в память через IC28C и IC28B

  Следующий байт данных из буфера FIFO определит состояние триггера IC24A  и начнется новый цикл.

  Таким образом управляющий поток данных выглядит следующим образом:

#FE #FE #FE #FE  - синхронизация потока,  устанавливает селектор в предопределенное состояние;

#FF - разблокировка селектора;

#LA - установка младшего байта адреса памяти;

#HA - установка старшего байта адреса памяти;

#FE - если необходимо только прочесть данные из памяти, либо #FF - если необходимо прочесть, а затем записать данные в память. (чтение осуществляется в любом случае);

#BD - сам байт данных, записываемый в память. В случае, если перед ним следовал код #FE, производится холостой цикл, данный байт игнорируется;

Далее следует повтор для следующего адреса памяти, начиная с разблокировки селектора (#FF).

Завершается передача данных кодом (#FE) - блокировка селектора.

  Сигнал ^TXE с выхода FT245 имеет связь со входом ^WAIT процессора, что позволяет обеспечивать синхронизацию при передаче данных из программного кода, выполняемого процессором Z80 в ПК и приостанавливает работу процессора в случае переполнения FIFO буфера FT245.  Строб записи в порт USB подаётся на входы 10 и 5  IC17C и IC17B соответственно.  Отрицательный импульс на этих входах включает буфер IC23 и устанавливает направление передачи данных от шины процессора к мосту FT245, вместе с тем являясь для него стробом записи.

Категория: Схемотехника | Добавил: sergey_nr (17.04.2017)
Просмотров: 784 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar

Вход на сайт

Поиск

Друзья сайта

  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • База знаний uCoz