|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
ISA-8 SD-контроллер (SPI) на CPLD
Author |
Message |
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
|
16 Dec 2017 12:25 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Вообщем не сдается наш гордый варяг. Вчера весь день провозился с тремя строчками кода в верилоге безрезультатно. Добился того, что все отлично работает
out dx,al out dx,al out dx,al
выполняется
out dx,al in al,dx
выполняется
in al,dx in al,dx in al,dx
выполняется
in al,dx out dx,al
выполняется
Но когда инициализируется SD карта и идет чтение сектора в какой-то момент сдвигается 7 бит, вместо 8. И дальше опять по 8 бит. Оно даже умудряется при таком раскладе как-то работать, но так нельзя. При тестовых прогонах не могу достичь такого-же эффекта. Все работает как надо. Не могу закономерности выявить. Попробую на неделе еще раз подойти к устройству.
|
18 Dec 2017 01:29 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну я не гигантский спец в верилоге и прочих этих языках, но когда я тут начинал, и мне помогали все коллеги по форуму, обратил я внимание на одно замечание, что текст в верилоге - это не программа в привычном понимании, там многие вещи выполняются одновременно, если не сказано иное. Может быть, ты на этом спотыкаешься?
_________________ iLavr
|
18 Dec 2017 05:59 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Это у меня в начале тоже было такое, сейчас вроде "переключился". Однако конечно влияет полное отсутствие опыта и никаких средств отладки, кроме внешнего анализатора. Наверное начать было нужно все-таки со светодиода на нормальной отладке с нормальной ПЛИС.
|
18 Dec 2017 06:06 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Возможно, где-то быстродействия не хватает, хотя маловероятно. Можно попробовать на пониженной тактовой частоте
|
18 Dec 2017 07:57 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
У меня нечто похожее было когда визнет подключал по spi к спектруму. Вот здесь я об этом намекал viewtopic.php?p=141508#p141508Как оказалось - несоответствие времянок spi, не помню точно толи слишком рано, толи слишком поздно защёлкивался MOSI в рег. Чуть сдвинул и всё заработало.
|
18 Dec 2017 08:12 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Да ну не, как это? Там же цикл грубо говоря. Пока до семи не досчитает (счет от нуля), не снимется флаг занятости и не поднимется READY. То есть до семи он досчитывает. Начинает не с ноля? Потенциально вижу что-то такое, но картинка каждый раз рассыпается когда пытаюсь в уме прокрутить код. Сейчас там так | | | | Code: module MX2_CPLD( // Системные input Clk, // Входная частота 14.31818 МГц input Res, // Входной сигнал сброса, активный уровень лог.0 input nRD, // Вход строба чтения input nWR, // Вход строба записи input nCS, // Вход выбора контроллера input Adr, // Вход адреса данные/управление inout [7:0]Dat, // Шина данных inout Ready, // SPI output nSEL, // Выходной сигнал выбора карты output reg SCK, // Выход тактовой частоты SPI input MISO, // Вход данных SPI output MOSI, // Выход данных SPI output nRED, // Выход управления красным светодиодом input nINS // Вход датчика вставления карты ); // Внутренние регистры reg [1:0]Ctrl; // Регистр управления reg [7:0]Data; // Регистр данных reg [2:0]Bits; // Счетчик сдвигаемых бит reg RMISO; // Защелка сигнала MISO reg BUSY; // SPI занят передачей reg MRDY; // Признак записи/чтения порта при сдвиге reg BEGWR; // Признак начала записи в порт данных (спад nWR) reg BEGRD; // Признак начала чтения из порта данных (спад nRD) // Комбинаторика assign nSEL = ~Ctrl[0]; // Выбор карты assign nRED = ~Ctrl[1]; // Красная лампочка assign MOSI = Data[7]; // Выход MOSI SPI assign Dat[7:0] = (~nCS & ~nRD & ~Clk) ? (Adr) ? {~nINS,BUSY,4'h0,Ctrl[1:0]} : Data[7:0] : 8'hZZ; assign Ready = (MRDY) ? 1'b0 : 1'bZ; // Если была попытка чтения/записи в порт, удерживаем READY
// Синхронная логика always @(posedge Clk) begin // Запись в управление может происходить асинхронно if (~nCS & ~nWR & Adr) Ctrl[1:0] <= Dat[1:0]; // Сигнал сброса имеет приоритет вне зависимости от выбранной скорости if (Res) begin // Сброс действует на эти регистры Ctrl[1:0] <= 2'h0; Bits[2:0] <= 3'h0; BUSY <= 1'b0; SCK <= 1'b0; MRDY <= 1'b0; BEGWR <= 1'b0; BEGRD <= 1'b0; end else begin // Состояние SPI if (BUSY) begin // SPI работает if (SCK) begin // Сбрасываем такт SCK <= 1'b0; // Спад, поэтому сдвигаем Data[7:0] <= {Data[6:0],RMISO}; // Считаем биты Bits[2:0] <= Bits[2:0] + 3'h1; // Это был 7й бит? if (Bits[2] & Bits[1] & Bits[0]) begin BUSY = 1'b0; // Снимаем флаг занятости MRDY = 1'b0; // Переводим READY в hi-Z end; end else begin // Устанавливаем такт SCK <= 1'b1; // Это фронт, поэтому сэмплируем вход RMISO <= MISO; end end else begin // Обнуляем счетчик бит Bits[2:0] <= 3'h0; end // Запись в регистр данных (предварительная) if (~nCS & ~nWR & ~Adr & ~BEGWR & ~BEGRD) begin BEGWR <= 1'b1; // установим признак начала записи if (BUSY) // если SPI занят, положим сигнал READY вниз MRDY = 1'b1; end // Запись в порт данных окончательная (nWR переключился) if (nWR & BEGWR) begin BEGWR <= 1'b0; // сбросим признак начала записи Data[7:0] = Dat[7:0]; BUSY = 1'b1; end
// Чтение из порта данных (предварительное) if (~nCS & ~nRD & ~Adr & ~BEGRD & ~BEGWR) begin BEGRD = 1'b1; // установим признак начала чтения if (BUSY) // если SPI занят, положим сигнал READY вниз MRDY = 1'b1; else begin MRDY = 1'b1; Data[7:0] = 8'b11111111; BUSY = 1'b1; end end // Чтение из порта данных окончательное (nRD переключился) if (BEGRD & nRD) begin BEGRD = 1'b0; // сбросим признак начала чтения // остальное сделает синхронная логика end
end end
// Конец endmodule | | | | |
|
18 Dec 2017 08:18 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Не знаю как, в который уже раз, но поехало. Перед запуском SPI обождал один цикл, введя регистр. Какой-то отдаленной частью мозга понимаю, почему так, но объяснить не могу Неведомый рабочий код | | | | Code: module MX2_CPLD( // Системные input Clk, // Входная частота 14.31818 МГц input Res, // Входной сигнал сброса, активный уровень лог.0 input nRD, // Вход строба чтения input nWR, // Вход строба записи input nCS, // Вход выбора контроллера input Adr, // Вход адреса данные/управление inout [7:0]Dat, // Шина данных inout Ready, // SPI output nSEL, // Выходной сигнал выбора карты output reg SCK, // Выход тактовой частоты SPI input MISO, // Вход данных SPI output MOSI, // Выход данных SPI output nRED, // Выход управления красным светодиодом input nINS // Вход датчика вставления карты ); // Внутренние регистры reg [1:0]Ctrl; // Регистр управления reg [7:0]Data; // Регистр данных reg [2:0]Bits; // Счетчик сдвигаемых бит reg RMISO; // Защелка сигнала MISO reg BUSY; // SPI занят передачей reg MRDY; // Признак записи/чтения порта при сдвиге reg BEGWR; // Признак начала записи в порт данных (спад nWR) reg BEGRD; // Признак начала чтения из порта данных (спад nRD) reg PRESTART; // Комбинаторика assign nSEL = ~Ctrl[0]; // Выбор карты assign nRED = ~Ctrl[1]; // Красная лампочка assign MOSI = Data[7]; // Выход MOSI SPI assign Dat[7:0] = (~nCS & ~nRD & ~Clk) ? (Adr) ? {~nINS,BUSY,4'h0,Ctrl[1:0]} : Data[7:0] : 8'hZZ; assign Ready = (MRDY) ? 1'b0 : 1'bZ; // Если была попытка чтения/записи в порт, удерживаем READY
// Синхронная логика always @(posedge Clk) begin // Запись в управление может происходить асинхронно if (~nCS & ~nWR & Adr) Ctrl[1:0] <= Dat[1:0]; // Сигнал сброса имеет приоритет вне зависимости от выбранной скорости if (Res) begin // Сброс действует на эти регистры Ctrl[1:0] <= 2'h0; Bits[2:0] <= 3'h0; BUSY <= 1'b0; SCK <= 1'b0; MRDY <= 1'b0; BEGWR <= 1'b0; BEGRD <= 1'b0; PRESTART <= 1'b0; end else begin // Состояние SPI if (BUSY) begin // SPI работает if (SCK) begin // Сбрасываем такт SCK <= 1'b0; // Спад, поэтому сдвигаем Data[7:0] <= {Data[6:0],RMISO}; // Считаем биты Bits[2:0] <= Bits[2:0] + 3'h1; // Это был 7й бит? if (Bits[2] & Bits[1] & Bits[0]) begin BUSY = 1'b0; // Снимаем флаг занятости MRDY = 1'b0; // Переводим READY в hi-Z end; end else begin // Устанавливаем такт SCK <= 1'b1; // Это фронт, поэтому сэмплируем вход RMISO <= MISO; end end else begin // Обнуляем счетчик бит Bits[2:0] <= 3'h0; end // Запись в регистр данных (предварительная) if (~nCS & ~nWR & ~Adr & ~BEGWR & ~BEGRD) begin BEGWR <= 1'b1; // установим признак начала записи if (BUSY) // если SPI занят, положим сигнал READY вниз MRDY = 1'b1; end // Запись в порт данных окончательная (nWR переключился) if (nWR & BEGWR) begin BEGWR <= 1'b0; // сбросим признак начала записи Data[7:0] = Dat[7:0]; PRESTART <= 1'b1; end
// Чтение из порта данных (предварительное) if (~nCS & ~nRD & ~Adr & ~BEGRD & ~BEGWR) begin BEGRD = 1'b1; // onoaiiaei i?eciae ia?aea ?oaiey if (BUSY) // если SPI занят, положим сигнал READY вниз MRDY = 1'b1; else begin MRDY = 1'b1; Data[7:0] = 8'b11111111; PRESTART <= 1'b1; end end // Чтение из порта данных окончательное (nRD переключился) if (BEGRD & nRD) begin BEGRD = 1'b0; // сбросим признак начала чтения // остальное сделает синхронная логика end
if (PRESTART) begin PRESTART <= 1'b0; BUSY <= 1'b1; end end end
// Конец endmodule | | | | |
|
18 Dec 2017 10:28 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Если тебе не трудно - выложи конверсию кода в схему. Интересно взглянуть, как Квартус себе это представляет...
_________________ iLavr
|
18 Dec 2017 11:42 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Да мне не трудно, выкладываю, но схема мало-информативная, на мой взгляд. Так как аппаратная часть более менее устаканилась вроде, задумался о BIOS. newold86 - вы каким ассемблером собирали? Я собрал ваш биос wasm. Собрался более-менее. Думаю в идеале бы написать эмулятор SD карты и встроить куда-нибудь в эмулятор PCEm....
|
19 Dec 2017 10:36 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Я схемы от Quartus'а понимаю только в том случае, когда знаю совершенно определенно, в какое именно место нужно смотреть (если есть четко локализованная проблема, с которой нужно разобраться). В целях общего понимая картинки из Quartus'а в моей голове не помещаются... MASM6 - я вроде ничего там не применял компиляторно-зависимого, так как все подобные штучки давно забыл Как уже говорил, мой код нужно доделать, как минимум, в части пересчета CHS, так как сейчас все жестко завязано на конкретный образ диска http://zet.aluzina.org/images/9/9c/C.img.zip
|
19 Dec 2017 13:18 |
|
|
angry_troll
Doomed
Joined: 08 Apr 2013 04:04 Posts: 449 Location: 213.247.249.139
|
Имеет какой-то смысл смотреть только схемы "technology map", где ква раскладывает по ячейкам. А вот смотреть RTL viewer'ом (как на картинке выше) нет никакого смысла -- там ровно то же самое, что и в верилоге понаписали, только картинками. На что какбэ название и намекает - "RTL viewer".
_________________ привет засранцу лавру :)
|
19 Dec 2017 13:34 |
|
|
Vic3Dexe
Doomed
Joined: 16 Dec 2014 11:58 Posts: 370 Location: Киев
|
Соглашусь с обоими ораторами. Ежели просто посмотреть чего-ты-там-накодил в виде схемы - сие нечитабельно от слова совсем. А вот если есть некий неуловимый баг, то схема иногда очень четко дает понять, что у тебя лажа. Увы, сейчас примера картинки привести не могу, но надо было мне выполнить ротацию 8-битного регистра на бит влево по posedge. Угу, когда внимание акцентировано, понятно, что тут ошибка, и понятно где. Но когда глаз "замылен" - хоть застрелись, но ничерта не видно. Зато, когда смотришь в схему, видишь полнейшую бредятину. Какой именно смысл? Я спрашиваю, потому как сам тупил в ЭТО, но так и не понял, зачем мне это надо. Не, я знаю, что вроде можно как-то рулить фиттером, если очень надо обеспечить задержку от А до Б, но... у меня задач таких не было.
|
22 Dec 2017 05:31 |
|
|
angry_troll
Doomed
Joined: 08 Apr 2013 04:04 Posts: 449 Location: 213.247.249.139
|
Да вроде должно... (компильнуться) Ну самый прямой, что-то сложнее A+B можно написать мульёном разных способов, и какой-нибудь из них может плохо лечь на ячейки (особенно актуально для ФПГА, где [в недорогих] ячейки строго 4-входовые), например в случае приоритетных энкодеров или мультиплексора "много-в-1". Есть правда лажа с тем, что в больших дизайнах уже каша, но тем не менее, может оказаться полезным. Ещё вариант вспомнил. Допустим, допущена какая-то ошибка, из-за которой какие-либо выходы всегда 0 (или всегда 1). В технолоджи вьювере это сразу будет видно (выход будет подсоединён к константе и ещё в таких случаях куча логики обычно выпиливаeтся ква). Другое дело что причину этого ни один из этих вьюверов не сообщит, да. Ну и пожалуй соглашусь с тем, что лажа может быть и в ртл вьювере видна. Иногда
_________________ привет засранцу лавру :)
|
22 Dec 2017 07:08 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
На мой взгляд - всё вполне читабельно. Не хотел лишний раз здесь оффтопить, но спасибо Tronix-у, что не отказал. Меня как раз интересует, как эти системы представляют схемотехнически свой код. Мне лично это кажется полезным.
_________________ iLavr
|
22 Dec 2017 07:14 |
|
|
Who is online |
Users browsing this forum: No registered users and 2 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|