nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 29 Mar 2024 02:35



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

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
а не. сорри. запутался в форматировании
форум плохо табы и пробелы кажет.


14 Dec 2017 23:25
Profile ICQ
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
А ты где надо - обрамляй тегом Code - он дает шрифт равноширинный как раз для кодов и программ.

_________________
iLavr


14 Dec 2017 23:29
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Эта строчка лишняя
Quote:
// Чтение из регистра данных при сдвиге - опустим READY
if (~nCS & ~nRD & ~Adr & BUSY) MRDY <= 1'b1;


14 Dec 2017 23:29
Profile ICQ
Doomed

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

_________________
https://t.me/tronix_blog


15 Dec 2017 00:06
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
потому о уже есть тама:
Code:
         // Запись в регистр данных
         if (~nCS & ~nWR & ~Adr)
         begin
         if (BUSY)
            // если продолжается сдвиг, опустим READY
            MRDY <= 1'b1;
         else
         begin
             Data[7:0] = Dat[7:0];
             BUSY = 1'b1;
         end


15 Dec 2017 01:41
Profile ICQ
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Тама запись, а тута чтение.

_________________
https://t.me/tronix_blog


15 Dec 2017 02:12
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Конечно не заработало.
newold86, было бы классно, если бы вы показали картинку с логического анализатора при операциях записи в spi и чтения, когда еще не сдвинулся до конца предыдущий байт.... С сигналами READY, CS, WR, RD....

_________________
https://t.me/tronix_blog


15 Dec 2017 10:54
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Tronix wrote:
Конечно не заработало.
newold86, было бы классно, если бы вы показали картинку с логического анализатора при операциях записи в spi и чтения, когда еще не сдвинулся до конца предыдущий байт.... С сигналами READY, CS, WR, RD....

С картинкой немного сложно - между железкой и мной расстояние приблизительно 9000 км, и в обозримом будущем будет только увеличиваться...

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

P.S. А вот как внутри моего модуля сделано - могу попробовать вытащить и выложить VHDL код, но вряд ли польза будет, настолько я там коряво все написал. Вся проблема в асинхронщине. Если дойдут руки еще что-то писать, то, наверное, соберусь с силами и попробую все делать синхронным, с правильной обработкой внешних асинхронных сигналов и временным анализом...


15 Dec 2017 11:06
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Спасибо. Конкретных вопросов пока нет, сам еще не пойму. Похоже, что зацикливается у меня... В смысле READY никогда не отпускается, как упала в 0 так и лежит. Завтра потыкаю в нее чем-нибудь..

_________________
https://t.me/tronix_blog


15 Dec 2017 11:55
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Смотрю в одном месте
MRDY <= 1'b0;   
А в другом
MRDY <= 1'b1;

Причём ,судя по условиям, это происходит одновременно вродебы


15 Dec 2017 21:58
Profile ICQ
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
А вообще, IO CH CHK (READY) после того как положили на ноль нужно в конце именно поднимать в единицу? Я не поднимаю, а перевожу в Z состояние - такое ощущение, что комп ее сам не поднимает.

_________________
https://t.me/tronix_blog


16 Dec 2017 01:21
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Не, это я все никак не привыкну к верилогу. Все правильно он делает, что не поднимает. А я - нет.
Вроде через еще пару регистров начал отслеживать фронт сигналов nRD или nWR. Вроде чуть-чуть заработало.

 Костылики
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)
            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)
            begin
               BEGRD <= 1'b1;         // установим признак начала чтения
               if (BUSY)
                  // если SPI занят, положим сигнал READY вниз
                  MRDY <= 1'b1;
            end
            
         // Чтение из порта данных окончательное (nRD переключился)
         if (nRD & BEGRD)
            begin
            BEGRD <= 1'b0;            // сбросим признак начала чтения
            // остальное сделает синхронная логика
            end

      end
end

// Конец
endmodule

_________________
https://t.me/tronix_blog


16 Dec 2017 03:02
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
newold86 А какая логика работы при чтении порта данных? Вот обнаружили факт чтения - сразу кладем READY в ноль, сдвигаем, поднимаем READY? И с поднятием READY уходим в вечный цикл -)

_________________
https://t.me/tronix_blog


16 Dec 2017 09:26
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Ну, у меня идеология немного другая, поэтому никакого вечного цикла нет. А так, если в двух словах, то все просто, как описали (за исключением вечного цикла). А если не в двух словах, то нужно смотреть весь код, а в нем разобраться не очень просто - никакой элегантности...

P.S. Наверное, ключевое отличие - у меня куча флагов, тогда как в данном коде - READY чуть ли не единственный, поэтому такие сложности с началом/завершением циклов.


16 Dec 2017 10:38
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Да, флаги у меня тоже появляются. А как понять, что чтение из порта произошло? Допустим обнаружили чтение из порта, установили флаг что у нас чтение в процессе, уронили READY, начали сдвигать. По завершению сдвига отпустили READY, дождались фронта /RD, сбросили флаг что чтение в процессе. Так что ли как то....

_________________
https://t.me/tronix_blog


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

Who is online

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