Pull to refresh

Comments 31

Чтобы конечный автомат был понятнее, предпочтительнее использовать двухблочную 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.

Уже полтора десятка лет есть QSPI и вовсю растёт OctalSPI.

P.S.@deema35, какова схема переходничка? Хотя-бы - номиналы резисторов, на фото - не видно. И длина проводков до платы FPGA? Искать и включать какое-нибудь On Chip Termination - пробовали?

Схема проста все линии подтянуты к 3.3В, и есть транзистор отвечающий за светодиод вот и вся схема. Длины проводов я конечно-же не измерял, как получилось припаять так и получилось я думаю они не длиннее платы а плата 8 сантиметров, так что вряд-ли они работают в режиме длинной линии все таки тут не гигагерцы. Я думаю что проблема в толщине этих проводов, как написали выше когда карта пишет данные она потребляет большие токи. Чтение ведь проходит нормально на всех частотах.

Уже полтора десятка лет есть QSPI и вовсю растёт OctalSPI.

а sd-карты разве их поддерживают?

Ветка про то, чем SPI хуже SD. В частности - названа ширина шины.

Следует уточнить принципиальную разницу: сравниваются не сами интерфейсы xSPI и SDIO, а режим SPI который обязаны поддерживать все SD карточки против родного интерфейса SDIO этих же карточек. Так вот, режим SPI у карточек только 1 битный, хоть и очень быстрый по частоте SCK. Если же сравнивать чисто xSPI и SDIO как интерфейсы, то даже QSPI уже не только догоняет, но и иногда обгоняет SDIO.

а QSPI не помогает в этой ситуации?

ну да, примерно это и хотелось бы видеть в статье

по моему мнению хорошая статья должна иметь завязку, действие и финал:

  • обозначение того, что мы делаем;

  • описание того, зачем нужно то, что мы делаем;

  • описание того, почему мы делаем именно так;

  • и, наконец, «рецепт», описание самих действий.

почему-то часто вторым и третьим пунктами пренебрегают (а иногда и первым). я не говорю, что должно быть много текста, обычно 1-2 предложений достаточно (например, первый пункт у вас раскрыт уже в названии статьи).

Первый листинг заканчивается словом endmodule, а начинается весьма абстрактным блоком always без всякого понимания для читающего, что там происходит и как те абстрактные слова превращаются в сигналы интерфейса.

Было бы интересно посмотреть на диаграммы переходов состояний. Из кода мало чего можно понять.

В логе теста есть все переходы.

А зачем в данном случае более громоздкий побайтовый табличный CRC, если весь обмен всё равно идёт последовательно? Прицепить на каждую линию по LFSR с тактированием от CLK и пусть себе считают побитово.

я так понимаю, чтобы не заморачиваться проще все клоки на 400кгц завести?
я про эти:
input wire clk_400k, input wire clk_Write, input wire clk_Read,

и второй вопрос, модуль готов для того чтобы скопировать к себе и читать-записывать данные с sd-карты? или нужна дополнительная обвязка с расчетом контрольной суммы и управлением процессом передачи?

Ну если все клоки завести на 400кгц он будет медленней работать. Все контрольные суммы модуль подсчитывает сам. Если сумма не совпадет то вместо SD_Complite будет активирована SD_Fail. Адреса модуль перечисляет сам, так что только буфер надо подготовить.

WP - write protect на этом контакте будет ноль если активирован переключатель защиты от записи. Я кстати никогда не встречал микро SD карты с подобным переключателем

Может потому что физический переключатель-ползунок (Write-protect Switch) предусмотрен стандартом только для полноразмерных SD (в т.ч. для полноразмерных адаптеров для тех же микро/мини SD)

Я обновил статью и добавил раздел про BMP заголовок.

Sign up to leave a comment.

Articles