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 »

Хотя нет, BUSY - это же регистр, а значит он все-таки по следующему клоку должен
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

DimkaM wrote:
newold86 wrote:
Это вообще для какого процессора картинка ? По крайней мере, такты 808x начинаются с низкого уровня:
ISA
Ну не похоже это на ISA... Для начала, как уже говорил, фаза CLK перевернута. Далее, почему адрес порта задается только 10 битами, тогда как у 8088 - 16-ью ?
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 »

DimkaM wrote:Бази это регистр, и выход у него изменится только к следующему клоку
Так что всё ок, пробуй мой вариант
Согласен - если помещается, то вроде МОЖЕТ решить проблему. Просто все равно будет зависеть от тактовой частоты SPI. А притормаживание до высокого уровня CLK процессора от этого не зависит...
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Лезет все. И вариант DimkaM и, дополнительно, вариант newold86. Вечером попробую.
angry_troll
Doomed
Posts: 449
Joined: 08 Apr 2013 04:04
Location: 213.247.249.139

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

Post by angry_troll »

DimkaM молодец, осваиваешь ХДЛ!
Last edited by angry_troll on 07 Dec 2017 11:09, edited 1 time in total.
привет засранцу лавру :)
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Результаты неоднозначные. Сперва попробовал код DimkaM - SPI сходит с ума, шлет в MISO пургу даже когда в порт нет записи. Потом запаял на пин SysClk. Попробовал свой старый код с третьей страницы с добавлением в условие где BUSY SysClk - if (~nCS & ~nWR & ~Adr & SysClk), как советовал newold86 - стало лучше, гораздо, но все равно из дести байт штуки 3 битые. Потом начал комбинировать.... То места нет, то не может путь проложить. Ужас.

Пришлось выпилить один разряд из делителя, вернутся к делению на 16. В принципе, для DS1347 RTC должно быть нормально, он даже на 4 MHz может. Ввел регистр DWR, чтоб пропустить один клок перед защелкиванием адреса. Сейчас такой код:

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,         // Шина данных
    input	 SysClk,		   // System clock CPU
    // SPI
    output   nSEL,             // Выходной сигнал выбора карты
    output   reg SCK,          // Выход тактовой частоты SPI
    input    MISO,             // Вход данных SPI
    output   MOSI,             // Выход данных SPI
    output   nRED,             // Выход управления красным светодиодом
    input    nINS              // Вход датчика вставления карты
);
// Внутренние регистры
reg [3:0]Pre;                  // Делитель частоты
reg [2:0]Ctrl;                 // Регистр управления
reg [7:0]Data;                 // Регистр данных
reg [2:0]Bits;                 // Счетчик сдвигаемых бит
reg RMISO;                     // Защелка сигнала MISO
reg BUSY;                      // SPI занят передачей
reg DWR;
// Комбинаторика
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[3:0] <= Pre[3:0] + 4'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;
        DWR <= 1'b0;
    end else begin
        // Состояние SPI
        if (BUSY)
        begin
            // Делитель частоты
            if (((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;
            //DWR <= 1'b1;
            // Запись в регистр данных возможна только если SPI не занят
            if (~nCS & ~nWR & ~Adr & SysClk)
            begin
                DWR <= 1'b1;
            end else
			if (DWR)
			begin
				Data[7:0] <= Dat[7:0];
				DWR <= 1'b0;
				BUSY <= 1'b1;
			end
        end
    end
end
// Конец
endmodule
Результаты - пока не понял сам. Вроде бы почти работает. Но иногда вроде 1 байт из ста битый. Или....
angry_troll
Doomed
Posts: 449
Joined: 08 Apr 2013 04:04
Location: 213.247.249.139

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

Post by angry_troll »

Вот этот вот SPI из http://nedopc.com/zxevo/zxevo.php работает без глюков в тысячах плат.
http://svn.zxevo.ru/filedetails.php?rep ... on%2Fspi.v

Но это так, на всякий случай. Скорее всего не подойдёт вам.
привет засранцу лавру :)
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Как насчет использовать взять исходный код, но использовать SysClk в качестве тактового ?
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

newold86 wrote:Как насчет использовать взять исходный код, но использовать SysClk в качестве тактового ?
Так завтра и поступлю.
А пока теряет все равно некоторые байты. Как на записи, так и на чтении. Но немножко пообщался с карточкой, почитал сектора... Но это конечно не работа.
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

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

Post by DimkaM »

Я насчитал 6 уровней вложенности условий. одно условие это как минимум через один элемент должен пройти сигнал. Представляете какая это задержка сигналов?
Надо избавляться от этого, разбить на несколько блоков.
DimkaM
Maniac
Posts: 261
Joined: 22 Jun 2005 04:35
Location: МО Россия

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

Post by DimkaM »

Есть возможность снять лог сигналов nCS Addr nWR CLK и dat[0] ?
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

newold86 wrote:Как насчет использовать взять исходный код, но использовать SysClk в качестве тактового ?
Не знаю, если не заработает, распаяю нафиг эту плату :evil:
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

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

Post by Tronix »

Попробовал, клок завел с SysClk. Теперь вроде пишет правильно, но читает с ошибками.
Я не уверен, правильно ли я тестирую, но я закоротил MISO и MOSI и сверяю то что записал с тем что прочитал.
newold86
Devil
Posts: 716
Joined: 30 Nov 2013 11:08
Location: WWW

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

Post by newold86 »

Tronix wrote:читает с ошибками
Закономерность в ошибках видна ? В первую очередь, не портится ли первый или последний принятый бит ?