|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
ISA-8 SD-контроллер (SPI) на CPLD
Author |
Message |
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
а не. сорри. запутался в форматировании форум плохо табы и пробелы кажет.
|
14 Dec 2017 23:25 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А ты где надо - обрамляй тегом Code - он дает шрифт равноширинный как раз для кодов и программ.
_________________ iLavr
|
14 Dec 2017 23:29 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
|
14 Dec 2017 23:29 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Почему лишняя? Записали в порт байт - начался сдвиг, тут пытаемся читать из порта а сдвиг еще не кончился, надо опустить линию READY, притормозив проц.
|
15 Dec 2017 00:06 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
|
15 Dec 2017 01:41 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Тама запись, а тута чтение.
|
15 Dec 2017 02:12 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Конечно не заработало. newold86, было бы классно, если бы вы показали картинку с логического анализатора при операциях записи в spi и чтения, когда еще не сдвинулся до конца предыдущий байт.... С сигналами READY, CS, WR, RD....
|
15 Dec 2017 10:54 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 707 Location: WWW
|
С картинкой немного сложно - между железкой и мной расстояние приблизительно 9000 км, и в обозримом будущем будет только увеличиваться... Но вообще там, с точки зрения работы шины, вообще ничего особенного - можно брать любую картинку работы шины ISA с тактами ожидания. В процессе реализации именно этой части никаких особенностей не возникало - как написано в книжках, так и работает. Естественно, если есть конкретные вопросы, попробую ответить. P.S. А вот как внутри моего модуля сделано - могу попробовать вытащить и выложить VHDL код, но вряд ли польза будет, настолько я там коряво все написал. Вся проблема в асинхронщине. Если дойдут руки еще что-то писать, то, наверное, соберусь с силами и попробую все делать синхронным, с правильной обработкой внешних асинхронных сигналов и временным анализом...
|
15 Dec 2017 11:06 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Спасибо. Конкретных вопросов пока нет, сам еще не пойму. Похоже, что зацикливается у меня... В смысле READY никогда не отпускается, как упала в 0 так и лежит. Завтра потыкаю в нее чем-нибудь..
|
15 Dec 2017 11:55 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
Смотрю в одном месте MRDY <= 1'b0; А в другом MRDY <= 1'b1;
Причём ,судя по условиям, это происходит одновременно вродебы
|
15 Dec 2017 21:58 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
А вообще, IO CH CHK (READY) после того как положили на ноль нужно в конце именно поднимать в единицу? Я не поднимаю, а перевожу в Z состояние - такое ощущение, что комп ее сам не поднимает.
|
16 Dec 2017 01:21 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Не, это я все никак не привыкну к верилогу. Все правильно он делает, что не поднимает. А я - нет. Вроде через еще пару регистров начал отслеживать фронт сигналов 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 | | | | |
|
16 Dec 2017 03:02 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
newold86 А какая логика работы при чтении порта данных? Вот обнаружили факт чтения - сразу кладем READY в ноль, сдвигаем, поднимаем READY? И с поднятием READY уходим в вечный цикл -)
|
16 Dec 2017 09:26 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 707 Location: WWW
|
Ну, у меня идеология немного другая, поэтому никакого вечного цикла нет. А так, если в двух словах, то все просто, как описали (за исключением вечного цикла). А если не в двух словах, то нужно смотреть весь код, а в нем разобраться не очень просто - никакой элегантности...
P.S. Наверное, ключевое отличие - у меня куча флагов, тогда как в данном коде - READY чуть ли не единственный, поэтому такие сложности с началом/завершением циклов.
|
16 Dec 2017 10:38 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Да, флаги у меня тоже появляются. А как понять, что чтение из порта произошло? Допустим обнаружили чтение из порта, установили флаг что у нас чтение в процессе, уронили READY, начали сдвигать. По завершению сдвига отпустили READY, дождались фронта /RD, сбросили флаг что чтение в процессе. Так что ли как то....
|
16 Dec 2017 12:13 |
|
|
Who is online |
Users browsing this forum: No registered users and 22 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
|
|