|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
ISA-8 SD-контроллер (SPI) на CPLD
Author |
Message |
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Ну так на шине он вроде как открытый коллектор, то есть когда нужно вниз опустить - опускаем, когда не нужно - в hiZ. Вверх его специально тащить CPLD не нужно имхо, могут быть конфликты у других устройств. А, или просто как output его сделать? Наверное да. Тут еще дело в том, что код я менял уже неоднократно. Но вроде бы последний, который я здесь выкладывал, стабильно работает с Clk (не с OSC). Сам честно говоря запамятовал уже. Не опускается READY? Странно, сейчас подумаю....
|
26 Dec 2017 00:49 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Так его можно просто output объявить - он точно так же должен в третье состояние уходить На самом деле, все опускается, это я недоработал (вторую запись вдогон не послал):
|
26 Dec 2017 01:05 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Так на первом рисунке не запись, а чтение. И там тоже должен RESET опуститься в 0. Проблема еще в том, что сигнал nRD должен быть опущен все время на период сдвига (так как мы READY уронили и проц стоит) и подняться только после отпускания READY. То же касается и CS. На твоей и моей симуляции это не так. На моей симуляции CPLD никогда не выйдет из режима ожидания завершения цикла чтения порта.
Last edited by Tronix on 26 Dec 2017 01:16, edited 1 time in total.
|
26 Dec 2017 01:11 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Там запись - в ModelSim строчки сигналов подписаны так, что фиг поймешь, к какому сигналу относится подпись. Если присмотреться, то nWR опускается (хотя курсор выделил nRD). Даже если было бы чтение - а почему в этому случае READY опускаться должен (если не было предварительной записи, которая еще не ушла в SPI) ???
|
26 Dec 2017 01:16 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Как почему ? Потому что в момент чтения еще читать нечего. Чтение - это запись 0xFF в MISO и чтение MOSI. Так что как только обнаружили чтение - сразу уронили READY и начали сдвигать 0xFF.
|
26 Dec 2017 01:19 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
А, я думал (в код в этой части не вникал), что для упрощения схемы FF пишется вручную, и потом читается. Вообще мне казалось, что Вы где-то так именно и объясняли...
|
26 Dec 2017 01:24 |
|
|
angry_troll
Doomed
Joined: 08 Apr 2013 04:04 Posts: 449 Location: 213.247.249.139
|
В z-controller'e на спектруме сделали так:
Запись стартует собственно запись. Чтение читает результат предыдущего обмена и стартует новую запись FF.
При этом если обращения идут достаточно медленно, то никаких вейтов нет.
_________________ привет засранцу лавру :)
|
26 Dec 2017 01:33 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Да, сначала было именно так. Но из-за двойной операции out dx,al ; in al,dx решил сделать как у вас, то есть для чтения - одна операция in al,dx. Вообще, возможен случай, когда при чтении не произойдет сдвига - если перед чтением была операция записи и сигнал на чтение поступил еще до окончания момента записи. В этом случае отдадутся данные, которые были на момент окончания записи. То есть, грубо говоря так: out dx,al in al,dx PS: Должно в теории так работать
|
26 Dec 2017 01:37 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Интересно, а почему квартус при симуляции чтения оставляет Dat (шину данных) в hi-Z ? И добавляет какие-то Dat[0]~result .. Dat[7]~result от себя. И даже в них после сдвига крестики - неизвестное состояние? Почему неизвестное, ведь я в Dat сдвинул биты, они там и должны лежать пока снова их сдвигать не начнут. UPD: С последним разобрался, нужно было MISO нарисовать ему. Но все равно Dat в hi-Z
|
26 Dec 2017 12:06 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Вот рисунок, карточка ответила на команду 0x1. Внизу клок - это Clk 8 MHz. Сама железка работает от OSC 14,3 MHz, на рисунке не показан, не хватило канала. Какие вы здесь видите аномалии?
|
29 Dec 2017 10:22 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Перевел все в неблокирующие записи. Все работает на 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 | | | | |
|
30 Dec 2017 01:06 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Вообще в очередной раз заметил, насколько сложно разбираться в чужом проекте... Когда сам погружаешься в свое творение, то все кажется совершенно прозрачным. А когда приходишь со стороны, то фиг чего с наскоку сделаешь, даже в относительно простых случаях, а погрузиться глубже времени/мотивации зачастую не хватает. В данном случае еще и незнание Verilog’а сильно мешает - несколько раз брался за него, но наличие VHDL’а позволяет реализовывать свои хотелки, поэтому трудно заставить себя выучить еще что-то из той же области...
|
31 Dec 2017 11:47 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
При чтении, должно отдаваться прочитанное из СПИ при предыдущей записи. А на картинке не так.
|
02 Jan 2018 04:27 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Короче, распаял все нафиг. И запаял плату от игрового автомата на EPM3256. У меня тут Robotron EC1834 появился, я перепаял один из его слотов на обычный ISA-8. Так вот, весьма странно он с портами ввода-вывода работает. Например, контроллер XT-IDE работает только первой версии, а в котором увеличина скорость за счет чередования портов - не работает. Так же не работают и CGA/Hercules/EGA/VGA видюшки. Поэтому сижу пока на родной гроботроновской MDA видеокарте, но хочется все-таки разобраться, чего они там с перетасовщиком байт намудрили, и по возможности все-таки пофиксить. Поэтому, плата скорее переходит в разряд логического анализатора ISA шины, нежели SD-контроллера. Завел на EPM3256 почти все сигналы с ISA шины. Там же на этой платке есть SRAM 32Kb, туда и планирую писать данные по различным триггерам (а триггеры могут быть очень любые - запись в порт/чтение из порта, запись в память и тд и тп), а потом мапить эту SRAM на основную память где-то в районе D8000 или E0000, откуда в последствии стягивать данные простой программой на паскале. Смотреть планирую в sigrock PulseView, оно понимает бинарный формат. Ну а по окончанию эксперимента с Гроботроном, можно опять перейти к SD, уже на конечном автомате и не завися от клока.
|
20 Sep 2018 12:00 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 709 Location: WWW
|
Подобное уже упоминал здесь - viewtopic.php?f=87&t=17349&start=240#p143418Только FPGA с внутренней памятью для этого лучше подходит - SignalTap можно использовать. Я даже специально плату под это нарисовал, с некоторыми функциями специально для отладки, но пока ленюсь делать
|
20 Sep 2018 22:22 |
|
|
Who is online |
Users browsing this forum: No registered users and 4 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
|
|