Author |
Message |
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Пишу только в порт данных, потом задержка 100 мс. Проверил - все ровным счетом то же самое, большинство 0xFF, байта 3 нормальных (из 10ти).
|
06 Dec 2017 08:34 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
Таймер запускается все десять раз(в логе видно, клок идёт) А вот байт не всегда защёлкивается ...хм... во время. Т.е. Либо поздно либо рано защёлкивается, когда на шине ничего нет. Скорее всего поздно.
|
06 Dec 2017 09:38 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Похоже на то. Менял ради интереса Data[7:0] <= Dat[7:0]; на Data[7:0] <= ~Dat[7:0]; - теперь идут в основном нули и пара-тройка инверсных "хороших" байт. То есть код то работает, но с шины защелкивается 0xFF. Перемахнул nRD и nWR местами, теперь nWR идет на Ded. input 1 а nRD на обычный пин IO. Результата не принесло. Тормозная CPLD
|
06 Dec 2017 09:56 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 707 Location: WWW
|
Думаю, что ровно наоборот - слишком быстрая. Скорее всего, запись происходит на грани появления/исчезновения какого-то сигнала. Хотелось бы увидеть остальную схему - декодирование адреса и остальное, если есть что...
|
06 Dec 2017 10:06 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Да там схема то... Дешифратор на 1533ИД7: Не полная конечно дешифрация (не хватает адреса 9), но никто другой в эти порты не ломится на Поиск-2, выход ИД7 подписанный 0x3B0 идет на nCS. Остальные все сигналы (Res, nWR, nRD) сразу в ISA. Clk в OSC. Adr в A0. PS: Не правильный код верилога на третьей странице я дал, это я игрался с делителем на 64 - не влез он. Поправлю сейчас на актуальный код прям из квартуса, только что прошивал.
|
06 Dec 2017 10:43 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
Судя по диаграммам в Гуглах, слишком рано защёлкиваем байт.
|
06 Dec 2017 11:05 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
попробуй вот этот кусок Перенести из поседжа в негедж Как то так чтоли
|
06 Dec 2017 11:13 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
хотя не уверен. если верить картинкам, надо защёлкивать на подъёме nWR
|
06 Dec 2017 11:18 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Ругается Error (10028): Can't resolve multiple constant drivers for net "Data[7]" at XT-sd.v(85) и тд 13 раз.
|
06 Dec 2017 11:31 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
Да, я думаю должно сработать, судя по этой картинке:
|
06 Dec 2017 11:35 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
у тябя так получилось: | | | | Code: module MX2_CPLD( // Системные input Clk, // Входная частота 14.31818 МГц input Res, // Входной сигнал сброса, активный уровень лог.0 input nRD, // Вход строба чтения input nWR, // Вход строба записи input nCS, // Вход выбора контроллера input Adr, // Вход адреса данные/управление inout [7:0]Dat, // Шина данных // SPI output nSEL, // Выходной сигнал выбора карты output reg SCK, // Выход тактовой частоты SPI input MISO, // Вход данных SPI output MOSI, // Выход данных SPI output nRED, // Выход управления красным светодиодом input nINS // Вход датчика вставления карты ); // Внутренние регистры reg [4:0]Pre; // Делитель частоты reg [2:0]Ctrl; // Регистр управления reg [7:0]Data; // Регистр данных reg [2:0]Bits; // Счетчик сдвигаемых бит reg RMISO; // Защелка сигнала MISO reg BUSY; // SPI занят передачей // Комбинаторика 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[4:0] <= Pre[4:0] + 5'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; end else begin // Состояние SPI if (BUSY) begin // Делитель частоты if (((Pre[4] & 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; // Запись в регистр данных возможна только если SPI не занят end end end always @(negedge Clk) begin if (~nCS & ~nWR & ~Adr & ~BUSY) begin Data[7:0] <= Dat[7:0]; BUSY <= 1'b1; end end // Конец endmodule | | | | |
|
06 Dec 2017 11:38 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Да, так. Не компилируется.
|
06 Dec 2017 11:39 |
|
|
DimkaM
Maniac
Joined: 22 Jun 2005 04:35 Posts: 260 Location: МО Россия
|
можешь проект приложить?
|
06 Dec 2017 11:39 |
|
|
newold86
Devil
Joined: 30 Nov 2013 11:08 Posts: 707 Location: WWW
|
Вроде понятна проблема - запись происходит по быстрому сигналу, асинхронному по отношению к cs и wr, поэтому часто записывается информация с шины данных, еще не содержащая правильных данных (из-за мультиплексирования адреса/данных). Изменение полярности clk ситуацию не поменяет - нужно в корне менять подход к записи.
|
06 Dec 2017 11:42 |
|
|
Tronix
Doomed
Joined: 18 Nov 2013 02:38 Posts: 662 Location: Москва
|
Вот он
|
06 Dec 2017 11:43 |
|
|