nedoPC.org

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



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

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
newold86 wrote:
нужно в корне менять подход к записи.


А это как? :oops:
Еще бы место было ((

_________________
https://t.me/tronix_blog


06 Dec 2017 11:49
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
Tronix wrote:
Да, так. Не компилируется.

Еще бы - два разных процесса пытаются писать в одно место, так нельзя. В любом случае, я уверен, что проблема ясна, и полярность clk вообще ничего не изменит в общем случае. В частном, если фазы clk и тактирования процессора жестко связаны, может и изменить.

Проблема в том, что очень ограничено место в CPLD - варианты исправления, которые я могу предложить, вряд ли поместятся...


06 Dec 2017 11:51
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
Tronix wrote:
А это как? :oops:

Писать нужно не по clk, а по подъему nWR, но это в рамках процесса не сделать. В своей реализации SPI я кошмарно намутил с флагами, чтобы подобные места работали. Потом перевел на FSM - стало читабельно, но слегка больше по объему.


06 Dec 2017 11:55
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
В схемах с ВМ80 это работает, потому что там к моменту спада nWR на шине данных уже все есть. Кстати, и с 8088 тоже работало бы, если бы на ISA приходил nIOWC, а не nAIOWC...


06 Dec 2017 11:59
Profile
Doomed

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

_________________
https://t.me/tronix_blog


06 Dec 2017 12:10
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Фиг знает как выкручиватся, места нету совсем.
Попробуй так чтоли
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 (Bits[2] & Bits[1] & Bits[0]) begin
            Bits[2:0] <= 3'h0;
                Data[7:0] <= Dat[7:0];
         end else 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
            // Обнуляем счетчик бит
            // Запись в регистр данных возможна только если SPI не занят
            if (~nCS & ~nWR & ~Adr)
            begin
                BUSY <= 1'b1;
            end
        end
    end
end
// Конец
endmodule


06 Dec 2017 12:13
Profile ICQ
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
Tronix wrote:
Спасибо, понятно... Нет пути.

Для начала, можно попробовать вместо OSC взять с ISA сигнал CLK - скорее всего, заработает


06 Dec 2017 12:17
Profile
Doomed

Joined: 12 Feb 2016 13:39
Posts: 463
Reply with quote
DimkaM wrote:
Image

можно же IOW задержать на пол такта CLOK, а одну LE взять из входного делителя, если они уже все израсходованы, по крайней мере для проверки точно можно одну найти...


06 Dec 2017 12:27
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
да там делитель вообще не нужен.
каждый такт инвертировать состояние sck и всё
Пониженная частота не нужна, любая сд-карта заводится на 7мгц, проверено сотней(активных) пользователей Пентевы и з-контроллера в частности.


06 Dec 2017 12:38
Profile ICQ
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Вообще слишком большая глубина вложенности условий. Соответственно большие задержки.
Надо раскидывать на меньшие блоки.

Только чуть что тронешь, сразу ругается "макроцелов не хватает сроутить не могу"


06 Dec 2017 12:54
Profile ICQ
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
newold86 wrote:
Tronix wrote:
Спасибо, понятно... Нет пути.

Для начала, можно попробовать вместо OSC взять с ISA сигнал CLK - скорее всего, заработает


Если заработает, то следующим шагом можно вернуть OSC в качестве тактовой, а CLK использовать для отодвигания момента записи путем замены строчки

Code:
if (~nCS & ~nWR & ~Adr & ~BUSY)


на

Code:
if (~nCS & ~nWR & ~Adr & ~BUSY & CLKisa)


Может, поместится в CPLD...


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

Image

Это вообще для какого процессора картинка ? По крайней мере, такты 808x начинаются с низкого уровня:
Attachment:
busW8088.jpg
busW8088.jpg [ 153.61 KiB | Viewed 4311 times ]


06 Dec 2017 22:50
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Спасибо всем, вечером попробую. Мне нравится вариант DimkaM, с помощью него отодвинем защелкивание на один Clk, и если влезет еще добавим и высокий Clk, как советует newold86. Делитель не хотелось бы убирать, так как есть теоретическая задумка использовать второй SPI для чего-то вроде RTC, которые явно офигеют от 7+ MHz.

_________________
https://t.me/tronix_blog


06 Dec 2017 23:42
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
newold86 wrote:

Это вообще для какого процессора картинка ? По крайней мере, такты 808x начинаются с низкого уровня:

ISA


07 Dec 2017 00:02
Profile ICQ
Devil

Joined: 30 Nov 2013 11:08
Posts: 707
Location: WWW
Reply with quote
Tronix wrote:
Спасибо всем, вечером попробую. Мне нравится вариант DimkaM, с помощью него отодвинем защелкивание на один Clk, и если влезет еще добавим и высокий Clk, как советует newold86

Если честно, то я не понял, как это отодвигание должно работать...
И предлагаемый мною вариант вроде самодостаточен, больше ничего не нужно


07 Dec 2017 00:36
Profile
Doomed

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


Да, ведь это не последовательное выполнение... Если там внизу BUSY установится, то код выше сразу наверное отработает, а не "в следующем цикле".

Буду SYSCLK заводить и пробовать по методу newold86. Если влезет :(

_________________
https://t.me/tronix_blog


07 Dec 2017 01:44
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 198 posts ]  Go to page Previous  1 ... 3, 4, 5, 6, 7, 8, 9 ... 14  Next

Who is online

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