nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 19 Apr 2024 19:00



Reply to topic  [ 198 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7, 8 ... 14  Next
ISA-8 SD-контроллер (SPI) на CPLD 
Author Message
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
newold86 wrote:
Повторюсь:


Пишу только в порт данных, потом задержка 100 мс. Проверил - все ровным счетом то же самое, большинство 0xFF, байта 3 нормальных (из 10ти).

_________________
https://t.me/tronix_blog


06 Dec 2017 08:34
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Таймер запускается все десять раз(в логе видно, клок идёт)
А вот байт не всегда защёлкивается ...хм... во время.
Т.е. Либо поздно либо рано защёлкивается, когда на шине ничего нет.
Скорее всего поздно.


06 Dec 2017 09:38
Profile ICQ
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Похоже на то. Менял ради интереса Data[7:0] <= Dat[7:0]; на Data[7:0] <= ~Dat[7:0]; - теперь идут в основном нули и пара-тройка инверсных "хороших" байт. То есть код то работает, но с шины защелкивается 0xFF.
Перемахнул nRD и nWR местами, теперь nWR идет на Ded. input 1 а nRD на обычный пин IO. Результата не принесло.
Тормозная CPLD :(

_________________
https://t.me/tronix_blog


06 Dec 2017 09:56
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
Tronix wrote:
.Тормозная CPLD :(

Думаю, что ровно наоборот - слишком быстрая. Скорее всего, запись происходит на грани появления/исчезновения какого-то сигнала.
Хотелось бы увидеть остальную схему - декодирование адреса и остальное, если есть что...


06 Dec 2017 10:06
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Да там схема то... Дешифратор на 1533ИД7:

Attachment:
xt-decoder2.png
xt-decoder2.png [ 32.93 KiB | Viewed 4705 times ]


Не полная конечно дешифрация (не хватает адреса 9), но никто другой в эти порты не ломится на Поиск-2, выход ИД7 подписанный 0x3B0 идет на nCS. Остальные все сигналы (Res, nWR, nRD) сразу в ISA. Clk в OSC. Adr в A0.
PS: Не правильный код верилога на третьей странице я дал, это я игрался с делителем на 64 - не влез он. Поправлю сейчас на актуальный код прям из квартуса, только что прошивал.

_________________
https://t.me/tronix_blog


06 Dec 2017 10:43
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Судя по диаграммам в Гуглах, слишком рано защёлкиваем байт.


06 Dec 2017 11:05
Profile ICQ
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
попробуй вот этот кусок
Code:
            // Запись в регистр данных возможна только если SPI не занят
            if (~nCS & ~nWR & ~Adr)
            begin
                Data[7:0] <= Dat[7:0];
                BUSY <= 1'b1;
            end
Перенести из поседжа в негедж
Как то так чтоли
Code:
always @(negedge Clk) begin
    if (~nCS & ~nWR & ~Adr & ~BUSY)
    begin
        Data[7:0] <= Dat[7:0];
        BUSY <= 1'b1;
    end
end


06 Dec 2017 11:13
Profile ICQ
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
хотя не уверен.
если верить картинкам, надо защёлкивать на подъёме nWR


06 Dec 2017 11:18
Profile ICQ
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
DimkaM wrote:
Перенести из поседжа в негедж
Как то так чтоли


Ругается
Error (10028): Can't resolve multiple constant drivers for net "Data[7]" at XT-sd.v(85)
и тд 13 раз.

_________________
https://t.me/tronix_blog


06 Dec 2017 11:31
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
DimkaM wrote:
попробуй вот этот кусок
Code:
            // Запись в регистр данных возможна только если SPI не занят
            if (~nCS & ~nWR & ~Adr)
            begin
                Data[7:0] <= Dat[7:0];
                BUSY <= 1'b1;
            end
Перенести из поседжа в негедж
Как то так чтоли
Code:
always @(negedge Clk) begin
    if (~nCS & ~nWR & ~Adr & ~BUSY)
    begin
        Data[7:0] <= Dat[7:0];
        BUSY <= 1'b1;
    end
end

Да, я думаю должно сработать, судя по этой картинке:

Image


06 Dec 2017 11:35
Profile ICQ
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Tronix wrote:
Ругается
Error (10028): Can't resolve multiple constant drivers for net "Data[7]" at XT-sd.v(85)
и тд 13 раз.

у тябя так получилось:
Code:
module MX2_CPLD(
    // Системные
    input    Clk,              // Входная частота 14.31818 МГц
    input    Res,              // Входной сигнал сброса, активный уровень лог.0
    input    nRD,              // Вход строба чтения
    input    nWR,              // Вход строба записи
    input    nCS,              // Вход выбора контроллера
    input    Adr,              // Вход адреса данные/управление
    inout    [7:0]Dat,         // Шина данных
    // SPI
    output   nSEL,             // Выходной сигнал выбора карты
    output   reg SCK,          // Выход тактовой частоты SPI
    input    MISO,             // Вход данных SPI
    output   MOSI,             // Выход данных SPI
    output   nRED,             // Выход управления красным светодиодом
    input    nINS              // Вход датчика вставления карты
);
// Внутренние регистры
reg [4:0]Pre;                  // Делитель частоты
reg [2:0]Ctrl;                 // Регистр управления
reg [7:0]Data;                 // Регистр данных
reg [2:0]Bits;                 // Счетчик сдвигаемых бит
reg RMISO;                     // Защелка сигнала MISO
reg BUSY;                      // SPI занят передачей
// Комбинаторика
assign nSEL = ~Ctrl[0];        // Выбор карты
assign nRED = ~Ctrl[2];        // Красная лампочка
assign MOSI = Data[7];         // Выход MOSI SPI
assign Dat[7:0] = (~nCS & ~nRD) ?
                    (Adr) ? {~nINS,BUSY,3'h0,Ctrl[2:0]} : Data[7:0]
                    : 8'hZZ;
// Синхронная логика
always @(posedge Clk) begin
    // Делитель частоты
    Pre[4:0] <= Pre[4:0] + 5'h1;
    // Запись в управление может происходить асинхронно
    if (~nCS & ~nWR & Adr) Ctrl[2:0] <= Dat[2:0];
    // Сигнал сброса имеет приоритет вне зависимости от выбранной скорости
    if (Res)
    begin
        // Сброс действует на эти регистры
        Ctrl[2:0] <= 3'h0;
        Bits[2:0] <= 3'h0;
        BUSY <= 1'b0;
        SCK <= 1'b0;
    end else begin
        // Состояние SPI
        if (BUSY)
        begin
            // Делитель частоты
            if (((Pre[4] & Pre[3] & Pre[2] & Pre[1]) | Ctrl[1]) & Pre[0])
            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]) BUSY <= 1'b0;
                end else begin
                    // Устанавливаем такт
                    SCK <= 1'b1;
                    // Это фронт, поэтому сэмплируем вход
                    RMISO <= MISO;
                end
            end
        end else begin
            // Обнуляем счетчик бит
            Bits[2:0] <= 3'h0;
            // Запись в регистр данных возможна только если SPI не занят
        end
    end
end
always @(negedge Clk) begin
    if (~nCS & ~nWR & ~Adr & ~BUSY)
    begin
        Data[7:0] <= Dat[7:0];
        BUSY <= 1'b1;
    end
end
// Конец
endmodule


06 Dec 2017 11:38
Profile ICQ
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Да, так. Не компилируется.

_________________
https://t.me/tronix_blog


06 Dec 2017 11:39
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
можешь проект приложить?


06 Dec 2017 11:39
Profile ICQ
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
Вроде понятна проблема - запись происходит по быстрому сигналу, асинхронному по отношению к cs и wr, поэтому часто записывается информация с шины данных, еще не содержащая правильных данных (из-за мультиплексирования адреса/данных). Изменение полярности clk ситуацию не поменяет - нужно в корне менять подход к записи.


06 Dec 2017 11:42
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
DimkaM wrote:
можешь проект приложить?


Вот он :(


Attachments:
xt-sd.rar [275.52 KiB]
Downloaded 239 times

_________________
https://t.me/tronix_blog
06 Dec 2017 11:43
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 198 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6, 7, 8 ... 14  Next

Who is online

Users browsing this forum: No registered users and 15 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:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.