Comments 22
Чтобы конечный автомат был понятнее, предпочтительнее использовать двухблочную Moore FSM с выходными регистрами.
В одном блоке происходит переключение между стейтами согласно управляющим сигналам, во втором - логика стейтов, в т.ч. формирование управляющих сигналов для стейт машины.
Это обеспечивает более контролируемое поведение при синтезе, позволяет избегать латчей, ну и так проще контролировать состояния и наворачивать большое количество логики.
p.s. даже в случае одноблочной fsm best practices считается прописывать default state на случай сбоя/недостаточного покрытия тестами и более прогнозируемого поведения. Машина в таком случае хотя бы имеет шанс восстановиться.
сегодня мы продолжим исследование FPGA плат и напишем полноценный контроллер SD карт (правильней их называть SDHC, потому что карты формата SD давно не продаются). Причем мы создадим полноценный контроллер задействующий все возможности шины SD, а не жалкий SPI аналог.
имхо статью надо начинать с краткого описания того чем же жалок spi для sd-карт
И забавно слышать о жалкости SPI при:
Данные приходится записывать на частоте 400 килогерц иначе карточка зависает.
Проблема скорее всего схемотехническая, в китайском шилде. Наблюдаю там трехногий элемент, который скорее всего понижайка 5в -> 3.3в для нужд ардуино. Причем максимально дешевый, на шилды другое не ставят... При записи карта потребляет хорошо так относительно чтения, питание просаживается, карта зависает.
Даже самый дешёвый XC6206 выдаёт ток до 300 мА, чего вполне достаточно для MicroSD.
Если я не ошибаюсь, то в статье используется вот этот модуль. Даташит сходу на него не нашел.
Глянул пример использования этого модуля, и там, во-первых, только SPI, во-вторых, частота там около 5 МГц.
400 кГц и менее используется обычно только для этапа инициализации карты, дальше скорость апают.
На шилде нет преобразователя. Там только сборки резисторов, и транзистор, который отвечает за зажигание светодиода. Но возможно вы правы по поводу питания. Шилд питается от FPGA карты, возможно она не вывозит, тем более между шилдом и платой тонкие провода, наверно на них падает напряжение.
Потому что как я говорил на высоких частотах запись иногда проходила, а иногда зависала, и добиться стабильного результата удалось только снизив частоту.
Кстати эти шилд не для Arduino, а для вот такой Китайской штуковины

Возможно у меня не очень качественная карта. Я думаю что и в режиме SPI она-бы зависала при таких-же частотах.
А зачем?
Если человек не знает, почему SPI жалок, ему эту статью врадли получится оценить.
имхо статью надо начинать с краткого описания того чем же жалок spi для sd-карт
Ну может слово не подходящее. А так данные передаются по 4 линиям, а SPI только по 1. Данные не защищены CRC, а здесь защищены.
Можно ещё вспомнить, что достаточно продвинутые контроллеры и карты умеют работать на намного больших частотах (кажется, 200 МГц могут поддерживать). Правда, там уже нужны преобразователи уровней, поскольку высокие частоты не на 3,3, а на 1,8.
Схема проста все линии подтянуты к 3.3В, и есть транзистор отвечающий за светодиод вот и вся схема. Длины проводов я конечно-же не измерял, как получилось припаять так и получилось я думаю они не длиннее платы а плата 8 сантиметров, так что вряд-ли они работают в режиме длинной линии все таки тут не гигагерцы. Я думаю что проблема в толщине этих проводов, как написали выше когда карта пишет данные она потребляет большие токи. Чтение ведь проходит нормально на всех частотах.
Первый листинг заканчивается словом endmodule, а начинается весьма абстрактным блоком always без всякого понимания для читающего, что там происходит и как те абстрактные слова превращаются в сигналы интерфейса.
Шина команд CMD.
Я вижу линию
Было бы интересно посмотреть на диаграммы переходов состояний. Из кода мало чего можно понять.
А зачем в данном случае более громоздкий побайтовый табличный CRC, если весь обмен всё равно идёт последовательно? Прицепить на каждую линию по LFSR с тактированием от CLK и пусть себе считают побитово.
я так понимаю, чтобы не заморачиваться проще все клоки на 400кгц завести?
я про эти:input wire clk_400k,
input wire clk_Write,
input wire clk_Read,
и второй вопрос, модуль готов для того чтобы скопировать к себе и читать-записывать данные с sd-карты? или нужна дополнительная обвязка с расчетом контрольной суммы и управлением процессом передачи?
Ну если все клоки завести на 400кгц он будет медленней работать. Все контрольные суммы модуль подсчитывает сам. Если сумма не совпадет то вместо SD_Complite будет активирована SD_Fail. Адреса модуль перечисляет сам, так что только буфер надо подготовить.
Создание полнофункционального (не-SPI) контроллера SD карт на FPGA чипе