nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 07:06



Reply to topic  [ 198 posts ]  Go to page Previous  1 ... 8, 9, 10, 11, 12, 13, 14  Next
ISA-8 SD-контроллер (SPI) на CPLD 
Author Message
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Tronix wrote:
А как понять, что чтение из порта произошло?

А зачем ?


16 Dec 2017 12:25
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Вообщем не сдается наш гордый варяг. Вчера весь день провозился с тремя строчками кода в верилоге безрезультатно. Добился того, что все отлично работает

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 бит. Оно даже умудряется при таком раскладе как-то работать, но так нельзя.
При тестовых прогонах не могу достичь такого-же эффекта. Все работает как надо.
Не могу закономерности выявить. Попробую на неделе еще раз подойти к устройству.

_________________
https://t.me/tronix_blog


18 Dec 2017 01:29
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Tronix wrote:
Вчера весь день провозился с тремя строчками кода в верилоге безрезультатно.

out dx,al
out dx,al
out dx,al

выполняется

out dx,al
in al,dx

Ну я не гигантский спец в верилоге и прочих этих языках, но когда я тут начинал, и мне помогали
все коллеги по форуму, обратил я внимание на одно замечание, что текст в верилоге - это не программа
в привычном понимании
, там многие вещи выполняются одновременно, если не сказано иное.
Может быть, ты на этом спотыкаешься?

_________________
iLavr


18 Dec 2017 05:59
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Lavr wrote:
многие вещи выполняются одновременно, если не сказано иное.
Может быть, ты на этом спотыкаешься?


Это у меня в начале тоже было такое, сейчас вроде "переключился". Однако конечно влияет полное отсутствие опыта и никаких средств отладки, кроме внешнего анализатора. Наверное начать было нужно все-таки со светодиода на нормальной отладке с нормальной ПЛИС.

_________________
https://t.me/tronix_blog


18 Dec 2017 06:06
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Tronix wrote:
Но когда инициализируется SD карта и идет чтение сектора в какой-то момент сдвигается 7 бит, вместо 8.

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


18 Dec 2017 07:57
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Tronix wrote:
Но когда инициализируется SD карта и идет чтение сектора в какой-то момент сдвигается 7 бит, вместо 8.

У меня нечто похожее было когда визнет подключал по spi к спектруму.
Вот здесь я об этом намекал viewtopic.php?p=141508#p141508

Как оказалось - несоответствие времянок spi, не помню точно толи слишком рано, толи слишком поздно защёлкивался MOSI в рег.

Чуть сдвинул и всё заработало.


18 Dec 2017 08:12
Profile ICQ
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
newold86 wrote:
Tronix wrote:
Но когда инициализируется SD карта и идет чтение сектора в какой-то момент сдвигается 7 бит, вместо 8.

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


Да ну не, как это? Там же цикл грубо говоря. Пока до семи не досчитает (счет от нуля), не снимется флаг занятости и не поднимется 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

_________________
https://t.me/tronix_blog


18 Dec 2017 08:18
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Не знаю как, в который уже раз, но поехало. Перед запуском 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

_________________
https://t.me/tronix_blog


18 Dec 2017 10:28
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Tronix wrote:
Перед запуском SPI обождал один цикл, введя регистр.

Если тебе не трудно - выложи конверсию кода в схему.
Интересно взглянуть, как Квартус себе это представляет...

_________________
iLavr


18 Dec 2017 11:42
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Lavr wrote:
Tronix wrote:
Перед запуском SPI обождал один цикл, введя регистр.

Если тебе не трудно - выложи конверсию кода в схему.
Интересно взглянуть, как Квартус себе это представляет...


Да мне не трудно, выкладываю, но схема мало-информативная, на мой взгляд.

Так как аппаратная часть более менее устаканилась вроде, задумался о BIOS. newold86 - вы каким ассемблером собирали? Я собрал ваш биос wasm. Собрался более-менее. Думаю в идеале бы написать эмулятор SD карты и встроить куда-нибудь в эмулятор PCEm....


Attachments:
sh2.png
sh2.png [ 30.75 KiB | Viewed 5728 times ]
sh1.png
sh1.png [ 87.57 KiB | Viewed 5728 times ]

_________________
https://t.me/tronix_blog
19 Dec 2017 10:36
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Tronix wrote:
Да мне не трудно, выкладываю, но схема мало-информативная, на мой взгляд.

Я схемы от Quartus'а понимаю только в том случае, когда знаю совершенно определенно, в какое именно место нужно смотреть (если есть четко локализованная проблема, с которой нужно разобраться). В целях общего понимая картинки из Quartus'а в моей голове не помещаются...

Tronix wrote:
newold86 - вы каким ассемблером собирали? Я собрал ваш биос wasm. Собрался более-менее. Думаю в идеале бы написать эмулятор SD карты и встроить куда-нибудь в эмулятор PCEm....

MASM6 - я вроде ничего там не применял компиляторно-зависимого, так как все подобные штучки давно забыл :)

Как уже говорил, мой код нужно доделать, как минимум, в части пересчета CHS, так как сейчас все жестко завязано на конкретный образ диска http://zet.aluzina.org/images/9/9c/C.img.zip


19 Dec 2017 13:18
Profile
Doomed

Joined: 08 Apr 2013 04:04
Posts: 449
Location: 213.247.249.139
Reply with quote
newold86 wrote:
Tronix wrote:
Да мне не трудно, выкладываю, но схема мало-информативная, на мой взгляд.

Я схемы от Quartus'а понимаю только в том случае, когда знаю совершенно определенно, в какое именно место нужно смотреть (если есть четко локализованная проблема, с которой нужно разобраться). В целях общего понимая картинки из Quartus'а в моей голове не помещаются...

Имеет какой-то смысл смотреть только схемы "technology map", где ква раскладывает по ячейкам.
А вот смотреть RTL viewer'ом (как на картинке выше) нет никакого смысла -- там ровно то же самое, что и в верилоге понаписали, только картинками. На что какбэ название и намекает - "RTL viewer".

_________________
привет засранцу лавру :)


19 Dec 2017 13:34
Profile
Doomed

Joined: 16 Dec 2014 11:58
Posts: 370
Location: Киев
Reply with quote
Tronix wrote:
Да мне не трудно, выкладываю, но схема мало-информативная, на мой взгляд.

newold86 wrote:
Я схемы от Quartus'а понимаю только в том случае, когда знаю совершенно определенно, в какое именно место нужно смотреть (если есть четко локализованная проблема, с которой нужно разобраться)

Соглашусь с обоими ораторами. Ежели просто посмотреть чего-ты-там-накодил в виде схемы - сие нечитабельно от слова совсем.
А вот если есть некий неуловимый баг, то схема иногда очень четко дает понять, что у тебя лажа.

Увы, сейчас примера картинки привести не могу, но надо было мне выполнить ротацию 8-битного регистра на бит влево по posedge.
Code:
alaways @(posedge CLK)
  some_reg <= {some_reg[6:1],some_reg[7]}; //да, я знаю, что это даже не компильнется, но мой баг был очень похож

Угу, когда внимание акцентировано, понятно, что тут ошибка, и понятно где. Но когда глаз "замылен" - хоть застрелись, но ничерта не видно.
Зато, когда смотришь в схему, видишь полнейшую бредятину.

angry_troll wrote:
Имеет какой-то смысл смотреть только схемы "technology map", где ква раскладывает по ячейкам

Какой именно смысл?
Я спрашиваю, потому как сам тупил в ЭТО, но так и не понял, зачем мне это надо.
Не, я знаю, что вроде можно как-то рулить фиттером, если очень надо обеспечить задержку от А до Б, но... у меня задач таких не было.


22 Dec 2017 05:31
Profile
Doomed

Joined: 08 Apr 2013 04:04
Posts: 449
Location: 213.247.249.139
Reply with quote
Vic3Dexe wrote:
Code:
alaways @(posedge CLK)
  some_reg <= {some_reg[6:1],some_reg[7]}; //да, я знаю, что это даже не компильнется, но мой баг был очень похож

Да вроде должно... (компильнуться) :)

Quote:
angry_troll wrote:
Имеет какой-то смысл смотреть только схемы "technology map", где ква раскладывает по ячейкам

Какой именно смысл?
Я спрашиваю, потому как сам тупил в ЭТО, но так и не понял, зачем мне это надо.
Не, я знаю, что вроде можно как-то рулить фиттером, если очень надо обеспечить задержку от А до Б, но... у меня задач таких не было.

Ну самый прямой, что-то сложнее A+B можно написать мульёном разных способов, и какой-нибудь из них может плохо лечь на ячейки (особенно актуально для ФПГА, где [в недорогих] ячейки строго 4-входовые), например в случае приоритетных энкодеров или мультиплексора "много-в-1". Есть правда лажа с тем, что в больших дизайнах уже каша, но тем не менее, может оказаться полезным. Ещё вариант вспомнил. Допустим, допущена какая-то ошибка, из-за которой какие-либо выходы всегда 0 (или всегда 1). В технолоджи вьювере это сразу будет видно (выход будет подсоединён к константе и ещё в таких случаях куча логики обычно выпиливаeтся ква). Другое дело что причину этого ни один из этих вьюверов не сообщит, да.

Ну и пожалуй соглашусь с тем, что лажа может быть и в ртл вьювере видна. Иногда :)

_________________
привет засранцу лавру :)


22 Dec 2017 07:08
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Vic3Dexe wrote:
Ежели просто посмотреть чего-ты-там-накодил в виде схемы - сие нечитабельно от слова совсем.

На мой взгляд - всё вполне читабельно. Не хотел лишний раз здесь оффтопить, но спасибо Tronix-у, что не отказал.
Меня как раз интересует, как эти системы представляют схемотехнически свой код. Мне лично это кажется полезным.

_________________
iLavr


22 Dec 2017 07:14
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 198 posts ]  Go to page Previous  1 ... 8, 9, 10, 11, 12, 13, 14  Next

Who is online

Users browsing this forum: No registered users and 7 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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.