А это как?newold86 wrote:нужно в корне менять подход к записи.

Еще бы место было ((
Moderator: Shaos
А это как?newold86 wrote:нужно в корне менять подход к записи.
Еще бы - два разных процесса пытаются писать в одно место, так нельзя. В любом случае, я уверен, что проблема ясна, и полярность clk вообще ничего не изменит в общем случае. В частном, если фазы clk и тактирования процессора жестко связаны, может и изменить.Tronix wrote:Да, так. Не компилируется.
Писать нужно не по clk, а по подъему nWR, но это в рамках процесса не сделать. В своей реализации SPI я кошмарно намутил с флагами, чтобы подобные места работали. Потом перевел на FSM - стало читабельно, но слегка больше по объему.Tronix wrote:А это как?
Code: Select all
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 (Bits[2] & Bits[1] & Bits[0]) begin
Bits[2:0] <= 3'h0;
Data[7:0] <= Dat[7:0];
end else 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
// Обнуляем счетчик бит
// Запись в регистр данных возможна только если SPI не занят
if (~nCS & ~nWR & ~Adr)
begin
BUSY <= 1'b1;
end
end
end
end
// Конец
endmodule
Для начала, можно попробовать вместо OSC взять с ISA сигнал CLK - скорее всего, заработаетTronix wrote:Спасибо, понятно... Нет пути.
можно же IOW задержать на пол такта CLOK, а одну LE взять из входного делителя, если они уже все израсходованы, по крайней мере для проверки точно можно одну найти...DimkaM wrote:
Если заработает, то следующим шагом можно вернуть OSC в качестве тактовой, а CLK использовать для отодвигания момента записи путем замены строчкиnewold86 wrote:Для начала, можно попробовать вместо OSC взять с ISA сигнал CLK - скорее всего, заработаетTronix wrote:Спасибо, понятно... Нет пути.
Code: Select all
if (~nCS & ~nWR & ~Adr & ~BUSY)
Code: Select all
if (~nCS & ~nWR & ~Adr & ~BUSY & CLKisa)
Это вообще для какого процессора картинка ? По крайней мере, такты 808x начинаются с низкого уровня:DimkaM wrote:Да, я думаю должно сработать, судя по этой картинке:
ISAnewold86 wrote:
Это вообще для какого процессора картинка ? По крайней мере, такты 808x начинаются с низкого уровня:
Если честно, то я не понял, как это отодвигание должно работать...Tronix wrote:Спасибо всем, вечером попробую. Мне нравится вариант DimkaM, с помощью него отодвинем защелкивание на один Clk, и если влезет еще добавим и высокий Clk, как советует newold86
Да, ведь это не последовательное выполнение... Если там внизу BUSY установится, то код выше сразу наверное отработает, а не "в следующем цикле".newold86 wrote: Если честно, то я не понял, как это отодвигание должно работать...
И предлагаемый мною вариант вроде самодостаточен, больше ничего не нужно