nabbla (nabbla1) wrote,
nabbla
nabbla1

Category:

Мучаем 5576ХС4Т - часть 'h3B - торжественно отключаем Ethernet!

[Оглавление (ссылки на остальные части)]Часть 0 - покупаем, паяем, ставим драйвера и софт
Часть 1 - что это вообще за зверь?
Часть 2 - наша первая схема!
Часть 3 - кнопочки и лампочки
Часть 4 - делитель частоты
Часть 5 - подавление дребезга кнопки
Часть 6 - заканчиваем кнопочки и лампочки
Часть 7 - счетчики и жаба
Часть 8 - передатчик UART
Часть 9 - Hello, wolf!
Часть 'hA - приёмник UART
Часть 'hB - UART и жаба
Часть 'hC - полудуплексный UART.
Часть 'hD - МКО (МКИО, Mil-Std 1553) для бедных, введение.
Часть 'hE - приёмопередатчик МКО "из подручных материалов" (в процессе)
Часть 'hF - модуль передатчика МКО
Часть 'h10 - передатчик сообщений МКО
Часть 'h20 - работа с АЦП ADC124s051
Часть 'h21 - преобразование двоичного кода в двоично-десятичный (BCD)
Часть 'h22 - Bin2Bcd с последовательной выдачей данных
Часть 'h23 - перемножитель беззнаковых чисел с округлением
Часть 'h24 - перемножитель беззнаковых чисел, реализация
Часть 'h25 - передаём показания АЦП на компьютер
Часть 'h26 - работа над ошибками (быстрый UART)
Часть 'h27 - PNG и коды коррекции ошибок CRC32
Часть 'h28 - передатчик изображения PNG
Часть 'h29 - принимаем с ПЛИС изображение PNG
Часть 'h2A - ZLIB и коды коррекции ошибок Adler32
Часть 'h2B - ускоряем Adler32
Часть 'h2C - формирователь потока Zlib
Часть 'h2D - передаём сгенерированное PNG-изображение
Часть 'h2E - делим отрезок на равные части
Часть 'h2F - знаковые умножители, тысячи их!
Часть 'h30 - вычислитель множества Мандельброта
Часть 'h31 - ускоренные сумматоры
Часть 'h32 - ускоренные счётчики (делаем часы)
Часть 'h33 - ускоряем ВСЁ
Часть 'h34 - ускоренные перемножители
Часть 'h35 - умножители совсем просто
Часть 'h36 - уравновешенный четверичный умножитель
Часть 'h37 - ускоренные счётчики, работа над ошибками
Часть 'h38 - передатчик байтов SPI
Часть 'h39 - приказываю: спи! (по SPI)
Мучаем 5576ХС4Т - часть 'h3A - передатчик сообщений SPI
Часть 'h3B - торжественно отключаем Ethernet!


Сейчас наконец получим на один из входов ПЛИС тактовую частоту 33,33 МГц с Ethernet-контроллера, а также вежливо попросим его отключиться, чтобы уменьшить энергопотребление, всё-таки 0,2 ампера при 5 вольтах - это как-то многовато.

При включении питания, этот контроллер посылает нам тактовую частоту 4 МГц. Именно от неё сработает наш модуль SPI, отправит все необходимые посылки - и частота на этом же выводе поднимется до 33 МГц, причём, как обещается - без "мусора" и переходных процессов.

Чтобы проверить это, мы поставили два светодиодика. Тот, что слева, будет работать от частоты, поделённой в 4 млн. раз, т.е он должен мигать раз в секунду. Тот, что справа - ещё в 8 раз медленнее. После того, как мы нажмём на кнопку и пошлём пачку сообщений по SPI, светодиод слева начнёт мигать с частотой примерно 8 Гц, а тот, что справа - примерно 1 Гц. Если так оно и будет, значит Ethernet-контроллер выполнил наши указания.

На видео мы наблюдаем именно это, а также снижение потребления платы с 0,17 ампер до 0,13..0,14 ампер.




Вот принципиальная схема "модуля верхнего уровня" - в центре композиции наш передатчик SPI, к нему делитель частоты в 4 раза, с 4 МГц до 1 МГц (что даёт частоту SPI 500 кГц, решили слегка перестраховаться!). Ещё один делитель понижает этот 1 МГц до 100 Гц, для модуля подавления дребезга контактов ButtonDebounce. Далее, со 100 Гц мы понижаем до 2 Гц и подаём на T-триггер (модуль toggle), чтобы получить мигающий светодиодик. А также эти 2 Гц подаём на делитель частоты ещё в 8 раз и снова на T-триггер, для второго мигающего светодиодика.



Но самое главное здесь было определить все-все подключённые к ПЛИС устройства: подать nCS = 1 на оба моих АЦП, чтобы они перешли в режим малого потребления, "притянуть на землю" все сигнальные выводы, которые иначе повисли бы в воздухе, и наоборот, указать как входы выводы rxd от виртуального COM-порта и от RS-485 (там в отсутствие передачи будет сидеть единичка, а если бы мы не указали эти пины как входные, то попытались бы их скоммутировать на ноль).

Обязательно надо было также указать все 4 вывода, куда подаётся тактовая частота: два "глобальных тактовых входа" clk и ETH_CLK_global и ещё два обычных I/O (YetAnotherClk и ETH_CLKout), куда разработчики отладочной платы тоже присоединили выходы тактовой частоты, "на всякий случай". У меня в начале этой эпопеи очень долго ничего не работало, потому что через такой вход I/O тактовая частота тупо "закорачивалась" на землю, но не до конца - что-то оставалось, поэтому как-то иногда шевелилось, а потом переставало. Ну а ларчик открывался просто!

Итак, как видим, схема вполне рабочая.

Наконец, в дальнейшем нам надо будет запускать её просто при подаче питания, не дожидаясь, когда кто-нибудь нажмёт на кнопочку :)
Вообще, определить нужный момент бывает весьма нелегко - всё зависит от того, сколько времени уходит на инициализацию ПЛИС и на инициализацию Ethernet-контроллера. Если ПЛИС оклемается раньше и сразу же отправит посылки, то их может никто и не принять - контроллер будет только собираться с мыслями!

Но у нас скорее обратная ситуация: ПЛИС загружается с Flash-конфигуратора буквально по 1 проводу, процесс этот весьма небыстрый, полсекунды уходит только так! Поэтому когда мы наконец включимся, Ethernet нас уже ждёт.

Для этой ситуации я написал вот такой вот идиотский модуль:
module POR (input clk, output por);

	reg [2:0] SR = 3'b100;
	
	assign por = SR[0];
	
	always @(posedge clk) begin
		SR <= SR >> 1;
	end
endmodule


POR означает Power-on Reset. Его назначение - выдать синхронный единичный импульс, когда ПЛИС уже инициализировалась и начала работу.
(если поставить всего один регистр, который инициализируется в единицу, а по положительному фронту становится нулём, синтезатор решает, что значение перед самым первым тактовым импульсом его вообще никак не волнует, и выкидывает всю схему нафиг. А такую схему о 3 регистрах он вроде бы "признаёт").

Подключаем его вместо кнопки на вход start SPI-передатчика - и наслаждаемся жизнью :)


PS. Поэкспериментировал с другими тактовыми частотами. Как оказалось, ПЛИС замечательно работает и от 50 кГц, что меня даже несколько удивило. Иногда бывает, что частота ограничена не только сверху, но и снизу, но здесь явно не этот случай! По кр. мере, Ethernet-контроллер формирует хорошие, крутые фронты. Если взамен поставить мультивибратор на 2 штуках МП25, результат может получиться иной :) (у самых простых мультивибраторов есть "родовая черта" - при открытии транзистора фронт резкий, а вот при закрытии он затягивается, поскольку через нагрузочный резистор перезаряжается ёмкость! Хотя, добавив ещё диод и резистор, можно от этого избавиться. Не знаю, зачем мне эти знания...)
Tags: ПЛИС, работа, странные девайсы
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 12 comments