nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 12:20



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

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
newold86 wrote:
Зачем READY как inout объявлен ?


Ну так на шине он вроде как открытый коллектор, то есть когда нужно вниз опустить - опускаем, когда не нужно - в hiZ. Вверх его специально тащить CPLD не нужно имхо, могут быть конфликты у других устройств.

А, или просто как output его сделать? Наверное да.

Тут еще дело в том, что код я менял уже неоднократно. Но вроде бы последний, который я здесь выкладывал, стабильно работает с Clk (не с OSC). Сам честно говоря запамятовал уже.

Не опускается READY? Странно, сейчас подумаю....

_________________
https://t.me/tronix_blog


26 Dec 2017 00:49
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Tronix wrote:
newold86 wrote:
Зачем READY как inout объявлен ?


Ну так на шине он вроде как открытый коллектор, то есть когда нужно вниз опустить - опускаем, когда не нужно - в hiZ. Вверх его специально тащить CPLD не нужно имхо, могут быть конфликты у других устройств.

Так его можно просто output объявить - он точно так же должен в третье состояние уходить

Tronix wrote:
Не опускается READY? Странно, сейчас подумаю....

На самом деле, все опускается, это я недоработал (вторую запись вдогон не послал):
Attachment:
MX2write2.jpg
MX2write2.jpg [ 183.35 KiB | Viewed 9170 times ]


26 Dec 2017 01:05
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
newold86 wrote:
На самом деле, все опускается, это я недоработал (вторую запись вдогон не послал):


Так на первом рисунке не запись, а чтение. И там тоже должен RESET опуститься в 0.

Проблема еще в том, что сигнал nRD должен быть опущен все время на период сдвига (так как мы READY уронили и проц стоит) и подняться только после отпускания READY. То же касается и CS. На твоей и моей симуляции это не так. На моей симуляции CPLD никогда не выйдет из режима ожидания завершения цикла чтения порта.


Attachments:
sdrd.PNG
sdrd.PNG [ 29.32 KiB | Viewed 9167 times ]

_________________
https://t.me/tronix_blog


Last edited by Tronix on 26 Dec 2017 01:16, edited 1 time in total.

26 Dec 2017 01:11
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Tronix wrote:
newold86 wrote:
На самом деле, все опускается, это я недоработал (вторую запись вдогон не послал):


Так на первом рисунке не запись, а чтение. И там тоже должен RESET опуститься в 0.

Там запись - в ModelSim строчки сигналов подписаны так, что фиг поймешь, к какому сигналу относится подпись. Если присмотреться, то nWR опускается (хотя курсор выделил nRD).

Даже если было бы чтение - а почему в этому случае READY опускаться должен (если не было предварительной записи, которая еще не ушла в SPI) ???


26 Dec 2017 01:16
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
newold86 wrote:
Даже если было бы чтение - а почему в этому случае READY опускаться должен (если не было предварительной записи, которая еще не ушла в SPI) ???


Как почему ? Потому что в момент чтения еще читать нечего. Чтение - это запись 0xFF в MISO и чтение MOSI. Так что как только обнаружили чтение - сразу уронили READY и начали сдвигать 0xFF.

_________________
https://t.me/tronix_blog


26 Dec 2017 01:19
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Tronix wrote:
newold86 wrote:
Даже если было бы чтение - а почему в этому случае READY опускаться должен (если не было предварительной записи, которая еще не ушла в SPI) ???


Как почему ? Потому что в момент чтения еще читать нечего. Чтение - это запись 0xFF в MISO и чтение MOSI. Так что как только обнаружили чтение - сразу уронили READY и начали сдвигать 0xFF.

А, я думал (в код в этой части не вникал), что для упрощения схемы FF пишется вручную, и потом читается. Вообще мне казалось, что Вы где-то так именно и объясняли...


26 Dec 2017 01:24
Profile
Doomed

Joined: 08 Apr 2013 04:04
Posts: 449
Location: 213.247.249.139
Reply with quote
В z-controller'e на спектруме сделали так:

Запись стартует собственно запись.
Чтение читает результат предыдущего обмена и стартует новую запись FF.

При этом если обращения идут достаточно медленно, то никаких вейтов нет.

_________________
привет засранцу лавру :)


26 Dec 2017 01:33
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
newold86 wrote:
А, я думал (в код в этой части не вникал), что для упрощения схемы FF пишется вручную, и потом читается. Вообще мне казалось, что Вы где-то так именно и объясняли...


Да, сначала было именно так. Но из-за двойной операции out dx,al ; in al,dx решил сделать как у вас, то есть для чтения - одна операция in al,dx.

Вообще, возможен случай, когда при чтении не произойдет сдвига - если перед чтением была операция записи и сигнал на чтение поступил еще до окончания момента записи. В этом случае отдадутся данные, которые были на момент окончания записи. То есть, грубо говоря так:

out dx,al
in al,dx

PS: Должно в теории так работать :)

_________________
https://t.me/tronix_blog


26 Dec 2017 01:37
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Интересно, а почему квартус при симуляции чтения оставляет Dat (шину данных) в hi-Z ? И добавляет какие-то Dat[0]~result .. Dat[7]~result от себя. И даже в них после сдвига крестики - неизвестное состояние? Почему неизвестное, ведь я в Dat сдвинул биты, они там и должны лежать пока снова их сдвигать не начнут.
UPD: С последним разобрался, нужно было MISO нарисовать ему. Но все равно Dat в hi-Z


Attachments:
sd_sim.PNG
sd_sim.PNG [ 8.4 KiB | Viewed 9142 times ]

_________________
https://t.me/tronix_blog
26 Dec 2017 12:06
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Вот рисунок, карточка ответила на команду 0x1. Внизу клок - это Clk 8 MHz. Сама железка работает от OSC 14,3 MHz, на рисунке не показан, не хватило канала. Какие вы здесь видите аномалии?


Attachments:
sd_osc.PNG
sd_osc.PNG [ 43.82 KiB | Viewed 9117 times ]

_________________
https://t.me/tronix_blog
29 Dec 2017 10:22
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Перевел все в неблокирующие записи. Все работает на Clk и виснет на OSC. На OSC в рандомном месте при чтении опускает READY вниз и все.

 "код"
Code:
module MX2_CPLD(
    // System IO
    input    Clk,              // Input frequency               ISA CLK
    input    SysClk,
    input    Res,              // Input reset signal, active 1     ISA RESET
    input    nRD,              // Input read port signal         ISA /IOR
    input    nWR,              // Input write signal             ISA /IOW
    input    nCS,              // Input select controller         from 74138 decoder
    input    Adr,              // Input data/control bus         ISA SA0
    inout    [7:0]Dat,         // Data bus                     ISA SD0..SD7
    output   Ready,             // Ready                        ISA I/O CH RDY
    // SPI
    output   nSEL,             // Output card select
    output   reg SCK,          // Output SPI frequency
    input    MISO,             // Input SPI data
    output   MOSI,             // Output SPI data
    output   nRED,             // Output LED indicator
    input    nINS              // Input card inserted
);
// Internal registers
reg [7:0]Data;                 // Data register
reg [1:0]Ctrl;                 // Control register
reg [2:0]Bits;                 // Shifted bits counter
reg RMISO;                     // MISO signal latch
reg BUSY;                      // SPI busy
reg MRDY;                  // Read/write attempt flag when SPI busy
reg BEGWR;                  // Begin write to data port (falling nWR)
reg BEGWRC;
reg BEGRD;                  // Begin read from data port (falling nRD)
//reg PRESTART;
// Combinatorics
assign nSEL = ~Ctrl[0];        // Card select
assign nRED = ~Ctrl[1];        // RED LED
assign MOSI = Data[7];         // Output MOSI SPI
assign Dat[7:0] = (~nCS & ~nRD) ?
                    (Adr) ? {~nINS,BUSY,4'h0,Ctrl[1:0]} : Data[7:0]
                    : 8'hZZ;
assign Ready = (MRDY) ? 1'b0 : 1'bZ;  // If read/write attempt when SPI busy down READY signal

// Synchronous logic
always @(posedge Clk) begin
    // Write to control port maybe asynchronous
    if (~nCS & ~nWR & Adr & ~BEGWRC & ~BEGWR & ~BEGRD)
      BEGWRC <= 1'b1;

   if (nWR & BEGWRC)
      begin
         BEGWRC <= 1'b0;
         Ctrl[1:0] <= Dat[1:0];
      end
      
    // Reset signal high priority
    if (Res)
      begin
         // Clear internal registers
         Ctrl[1:0] <= 2'h0;
         Bits[2:0] <= 3'h0;
         BUSY <= 1'b0;
         SCK <= 1'b0;
         MRDY <= 1'b0;
         BEGWR <= 1'b0;
         BEGWRC <= 1'b0;
         BEGRD <= 1'b0;
         //PRESTART <= 1'b0;
      end
   else
      begin
         // SPI state
         if (BUSY)
            begin
               // SPI working...
               if (SCK)
                  begin
                     // SCK low
                     SCK <= 1'b0;
                     // Falling, shift bits
                     Data[7:0] <= {Data[6:0],RMISO};
                     // Count bits
                     Bits[2:0] <= Bits[2:0] + 3'h1;
                     // This is seven bit?
                     if (Bits[2] & Bits[1] & Bits[0])
                        begin
                           BUSY <= 1'b0;   // Clear BUSY flag
                           MRDY <= 1'b0;   // Goes IO CH RDY to hi-Z
                        end;
                  end
               else
                  begin
                     // SCK high
                     SCK <= 1'b1;
                     // Rising, sample data
                     RMISO <= MISO;
                  end
            end
         else
            begin
               // Clear bits counter
               Bits[2:0] <= 3'h0;
            end
         
         // Writing to data port (preliminary)
            if (~nCS & ~nWR & ~Adr & ~BEGWR & ~BEGRD & ~BEGWRC)
            begin
               BEGWR <= 1'b1;         // Set preliminary write flag
               if (BUSY)
                  // If SPI busy set IO CH RDY low
                  MRDY <= 1'b1;
            end
            
         // Final writing to data port (nWR goes high)
         if (nWR & BEGWR)
            begin
            BEGWR <= 1'b0;            // Clear preliminary write flag
            Data[7:0] <= Dat[7:0];       // Grab some data from ISA
            BUSY <= 1'b1;         // Set prestart flag for SPI state machine
            end

         // Reading from data port (preliminary)
            if (~nCS & ~nRD & ~Adr & ~BEGRD & ~BEGWR & ~BEGWRC)
            begin
               BEGRD <= 1'b1;         // Set preliminary read flag
               if (BUSY)
                  // If SPI busy set IO CH RDY low
                  MRDY <= 1'b1;
               else
                  begin
                     MRDY <= 1'b1;             // set IO CH RDY low
                     Data[7:0] <= 8'b11111111;   // 0xFF to data register
                     BUSY <= 1'b1;         // Set prestart flag for SPI state machine
                  end
            end
            
         // Final reading from data port (nRD goes high)
         if (BEGRD & nRD)
            begin
            BEGRD <= 1'b0;            // Clear preliminary read flag
            // all other job done by combinatorics logic
            end
         // Start SPI machine

/*
         if (PRESTART)
            begin
               //MRDY = 1'b1;             // set IO CH RDY low
               PRESTART <= 1'b0;
               BUSY <= 1'b1;
            end
*/
      end
end

// End
endmodule

_________________
https://t.me/tronix_blog


30 Dec 2017 01:06
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Вообще в очередной раз заметил, насколько сложно разбираться в чужом проекте... Когда сам погружаешься в свое творение, то все кажется совершенно прозрачным. А когда приходишь со стороны, то фиг чего с наскоку сделаешь, даже в относительно простых случаях, а погрузиться глубже времени/мотивации зачастую не хватает.
В данном случае еще и незнание Verilog’а сильно мешает - несколько раз брался за него, но наличие VHDL’а позволяет реализовывать свои хотелки, поэтому трудно заставить себя выучить еще что-то из той же области...


31 Dec 2017 11:47
Profile
Maniac

Joined: 22 Jun 2005 04:35
Posts: 260
Location: МО Россия
Reply with quote
Tronix wrote:
Вот рисунок, карточка ответила на команду 0x1. Внизу клок - это Clk 8 MHz. Сама железка работает от OSC 14,3 MHz, на рисунке не показан, не хватило канала. Какие вы здесь видите аномалии?

При чтении, должно отдаваться прочитанное из СПИ при предыдущей записи. А на картинке не так.


02 Jan 2018 04:27
Profile ICQ
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Короче, распаял все нафиг. И запаял плату от игрового автомата на EPM3256.

У меня тут Robotron EC1834 появился, я перепаял один из его слотов на обычный ISA-8. Так вот, весьма странно он с портами ввода-вывода работает. Например, контроллер XT-IDE работает только первой версии, а в котором увеличина скорость за счет чередования портов - не работает. Так же не работают и CGA/Hercules/EGA/VGA видюшки. Поэтому сижу пока на родной гроботроновской MDA видеокарте, но хочется все-таки разобраться, чего они там с перетасовщиком байт намудрили, и по возможности все-таки пофиксить.

Поэтому, плата скорее переходит в разряд логического анализатора ISA шины, нежели SD-контроллера. Завел на EPM3256 почти все сигналы с ISA шины. Там же на этой платке есть SRAM 32Kb, туда и планирую писать данные по различным триггерам (а триггеры могут быть очень любые - запись в порт/чтение из порта, запись в память и тд и тп), а потом мапить эту SRAM на основную память где-то в районе D8000 или E0000, откуда в последствии стягивать данные простой программой на паскале. Смотреть планирую в sigrock PulseView, оно понимает бинарный формат.

Ну а по окончанию эксперимента с Гроботроном, можно опять перейти к SD, уже на конечном автомате и не завися от клока.

Image

Image

_________________
https://t.me/tronix_blog


20 Sep 2018 12:00
Profile
Devil

Joined: 30 Nov 2013 11:08
Posts: 706
Location: WWW
Reply with quote
Tronix wrote:
Поэтому, плата скорее переходит в разряд логического анализатора ISA шины,


Подобное уже упоминал здесь - viewtopic.php?f=87&t=17349&start=240#p143418

Только FPGA с внутренней памятью для этого лучше подходит - SignalTap можно использовать. Я даже специально плату под это нарисовал, с некоторыми функциями специально для отладки, но пока ленюсь делать


20 Sep 2018 22:22
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 198 posts ]  Go to page Previous  1 ... 10, 11, 12, 13, 14  Next

Who is online

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