ISA-8 SD-контроллер (SPI) на CPLD

16-битные ПЦ-совместимые компьютеры с процессорами 8086/8088/80286 работающие под управлением ДОС

Moderator: Shaos

Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

newold86 wrote:нужно в корне менять подход к записи.
А это как? :oops:
Еще бы место было ((
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

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

Проблема в том, что очень ограничено место в CPLD - варианты исправления, которые я могу предложить, вряд ли поместятся...
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

Tronix wrote:А это как? :oops:
Писать нужно не по clk, а по подъему nWR, но это в рамках процесса не сделать. В своей реализации SPI я кошмарно намутил с флагами, чтобы подобные места работали. Потом перевел на FSM - стало читабельно, но слегка больше по объему.
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

В схемах с ВМ80 это работает, потому что там к моменту спада nWR на шине данных уже все есть. Кстати, и с 8088 тоже работало бы, если бы на ISA приходил nIOWC, а не nAIOWC...
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Спасибо, понятно... Нет пути.
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by DimkaM »

Фиг знает как выкручиватся, места нету совсем.
Попробуй так чтоли

Code: Select all

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
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

Tronix wrote:Спасибо, понятно... Нет пути.
Для начала, можно попробовать вместо OSC взять с ISA сигнал CLK - скорее всего, заработает
PVV
Doomed
Posts: 463
Joined: 12 Feb 2016 13:39

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by PVV »

DimkaM wrote:Image
можно же IOW задержать на пол такта CLOK, а одну LE взять из входного делителя, если они уже все израсходованы, по крайней мере для проверки точно можно одну найти...
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by DimkaM »

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

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by DimkaM »

Вообще слишком большая глубина вложенности условий. Соответственно большие задержки.
Надо раскидывать на меньшие блоки.

Только чуть что тронешь, сразу ругается "макроцелов не хватает сроутить не могу"
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

newold86 wrote:
Tronix wrote:Спасибо, понятно... Нет пути.
Для начала, можно попробовать вместо OSC взять с ISA сигнал CLK - скорее всего, заработает
Если заработает, то следующим шагом можно вернуть OSC в качестве тактовой, а CLK использовать для отодвигания момента записи путем замены строчки

Code: Select all

if (~nCS & ~nWR & ~Adr & ~BUSY)
на

Code: Select all

if (~nCS & ~nWR & ~Adr & ~BUSY & CLKisa)
Может, поместится в CPLD...

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

Image
Это вообще для какого процессора картинка ? По крайней мере, такты 808x начинаются с низкого уровня:
busW8088.jpg
You do not have the required permissions to view the files attached to this post.
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

Спасибо всем, вечером попробую. Мне нравится вариант DimkaM, с помощью него отодвинем защелкивание на один Clk, и если влезет еще добавим и высокий Clk, как советует newold86. Делитель не хотелось бы убирать, так как есть теоретическая задумка использовать второй SPI для чего-то вроде RTC, которые явно офигеют от 7+ MHz.
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by DimkaM »

newold86 wrote:
Это вообще для какого процессора картинка ? По крайней мере, такты 808x начинаются с низкого уровня:
ISA
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by newold86 »

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

Re: ISA-8 SD-контроллер (SPI) на CPLD

Post by Tronix »

newold86 wrote: Если честно, то я не понял, как это отодвигание должно работать...
И предлагаемый мною вариант вроде самодостаточен, больше ничего не нужно
Да, ведь это не последовательное выполнение... Если там внизу BUSY установится, то код выше сразу наверное отработает, а не "в следующем цикле".

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