Jump to content

    

Cianid

Участник
  • Content Count

    7
  • Joined

  • Last visited

Community Reputation

0 Обычный
  1. Синтезатор просто добавил мультиплексор. Тут есть что то криминальное? Аккуратно, большой вес картинки.
  2. У меня 2МГц SPI. Я действительно не могу понять, чем чревато добавлять в список чувствительности еще один сигнал. Не имел пока возможности. Завтра попытаюсь с вами связаться.
  3. Собственно решил проблему, как подсказал des00. Cделал срабатывание по по фронту SS. module spi_slave (rstb,ss,sck,sdin,done,rdata, sdout); input rstb; input ss; input sck; input sdin; output reg done; output reg [7:0] rdata; output reg sdout; reg [7:0] rreg; reg [3:0] nb; reg [3:0] nf; always @(posedge sck or negedge rstb or posedge ss) begin if (rstb == 0) begin done <= 0; nb <= 0; nf <= 0; sdout <= 0; end else if (ss) begin nb <= 0; done <= 0; nf <= 0; sdout <= 0; end else begin rreg ={rreg[6:0],sdin}; nb <= nb + 1; if(nb != 7) done <= 0; else begin rdata=rreg; done <= 1; nb <= 0; nf <= nf + 1; if(nf == 7) begin sdout <= 1; nf <= 0; end end end end endmodule
  4. Да, я ошибся, счетчик байтов это nf. При нормальной работе этот счетчик не должен считать дальше 1, т.к при следующем фронте ss он сбросится.
  5. Проблема не должна быть в этом. Я прогонял данную схему в симуляции. Просто если вывести какие нибудь промежуточные точки на пины, чтобы посмотреть осциллографом, уже тогда ПЛИС перестает корректно работать.
  6. Доброго времени суток. В проекте есть модуль spi slave. Обнаружил ошибку в логике данного модуля. При нормальном состоянии, когда мастер генерирует ss в начале каждого байта, счетчик nb постоянно сбрасывается по фронту ss и выход sdout находится в 0. Если по какой либо причине сигнал ss отсутствует, nb начинает считать до 8 и затем выдаст на выходе sdout 1. Таким образом модуль выдаст ошибку если долго нет ss от мастера. Получается не работает блок логики, срабатывающий по фронту ss. module spi_slave (rstb,ss,sck,sdin,done,rdata, sdout, nfOut); input rstb; input ss; input sck; input sdin; output reg done; output reg [7:0] rdata; output reg sdout; output wire [2:0] nfOut; reg [7:0] rreg; reg [3:0] nb = 0; // счетчик бит reg [3:0] nf = 0; assign nfOut = nf[2:0]; always @(posedge sck or negedge rstb) begin if (rstb == 0) begin // сбросить в исходное при сигнале сброса done = 0; nb = 0; nf = 0; sdout = 0; end else if (ss == 0) // идет прием байта begin rreg ={rreg[6:0],sdin}; // прием старшим вперед, сдвиг влево nb = nb + 1; // increment bit count if(nb != 8) done = 0; else // на 8 импульсе выставить done begin rdata=rreg; done = 1; nb = 0; nf = nf + 1; if(nf == 8) begin sdout = 1; nf = 0; end end end else // байт принят и переписан begin nb = 0; done = 0; nf = 0; sdout = 0; end end endmodule Проблема заключается в том, что при работе уже на железе (Cyclone II E52C8), механизм сброса счетчика nb не работает, и каждый 8 байт я вижу одиночный импульс на sdout. Осторожно трафик. Но главное не это. Я случайно обнаружил, что если убрать сброс Sdout вот здесь: always @(posedge sck or negedge rstb) begin if (rstb == 0) begin // сбросить в исходное при сигнале сброса done = 0; nb = 0; nf = 0; sdout = 0; end То проблема решается. Вдобавок, проблема также решается, когда вношу изменения (добавил асинхронный сброс) в другой модуль проекта ( модуль CRC, который использует ту же последовательную линию данных, идущую от мастера) У меня подозрение, что данные изменения вносят паразитные емкости, которые влияет на работу модуля spi. Ниже представлена диаграмма, после внесения вышеописанных изменений. Осторожно трафик. Пропали импульсы на sdout, младший бит счетчика больше 1 не считает. Собственно так и должно работать.