UPD: Ага, не дожидался пока карточка снимет FF после IO. Поправил драйвер и поехало на пне.
Ну что ж, выходит работает система. Непонятно как, но здорово

Moderator: Shaos
Для результата синтеза <= и = не различаются. Ну точнее вот так:Tronix wrote: Чем то отличается. = вместо <= в некоторых местах, чтение из регистра не только по nCS & nRD но и по Clk. Что то еще может быть.
Code: Select all
always @(posedge clk)
output <= input;
Code: Select all
always @(posedge clk)
output = input;
Code: Select all
always @(posedge clk)
begin
b <= a;
c <= b;
end
Code: Select all
always @(posedge clk)
begin
b = a;
c = b;
end
Code: Select all
always @(posedge clk)
begin : named_block
reg tmp;
tmp = a+b+c;
output <= tmp;
end
Потому что необходимость чтения флага занятости перед каждым байтом автоматически снижает скорость раза в три. Поэтому пришлось усложнить "железо" - в случае необходимости, плата притормаживает процессор снятием сигнала READY.Tronix wrote:newold86 Посмотрел немного сорцы. У вас нет флага занятости, почему?
Tronix wrote:Потому что скорость SPI заведомо высокая (какая, кстати?)?
newold86 wrote:Я где-то раньше уже писал - у меня все карты (три или четыре разные) и инициализируются, и работают на 12.5МГц - я даже перестал переключать на пониженную скорость для инициализации, Мало того - возможно, они и на 25МГц так работают, сейчас просто не помню, а взглянуть пока не могу.
Хоть и используется сигнал READY, но реализация не совсем железобетонная (лень было в одном месте усложнять). Поэтому будет работать тогда, когда процессор проверяет сигнал готовности не РАНЬШЕ, чем через половину цикла тактовой SPI с момента обращения к SPI. 8088 проверяет этот сигнал приблизительно через полтора периода своей тактовой частоты, поэтому тактовая частота 8088 может быть не более, чем в 3 раза выше, чем тактовая SPI. Я не знаю, как Pentium работает с сигналом готовности, поэтому ничего сказать по этому поводу не могу.Tronix wrote:А если ваш код на каком-нибудь Pentium 4 3,0 GHz с ISA слотом запустить - отработает?
Это если в совсем общем виде. Но дьявол, как известно, кроется в мелочах... Для начала, при записи у меня READY не трогается вообще в ТЕКУЩЕМ цикле - только если вдогонку послали байт, а старый еще не ушел. Просто нет смысла дожидаться отправки байта, и потом возвращать управление.Tronix wrote:А нет, не легко. У вас какая логика? Если чтение из порта и BUSY, тогда держим READY - верно?
Code: Select all
input Res, // Входной сигнал сброса, активный уровень лог.0
Code: Select all
if (Res)
begin
// Сброс действует на эти регистры
Ctrl[1:0] <= 2'h0;
Code: Select all
always @(posedge clk, negedge arst_n) // arst_n: 0 -- сброс, 1 -- работа
if( !arst_n )
сброс
else
работа
Из этих утверждений верно условие. Комментарий остался от "специалиста". В IBM у RESET активный логический уровень 1.angry_troll wrote:Code: Select all
input Res, // Входной сигнал сброса, активный уровень лог.0
Что из этих утверждений верно?Code: Select all
if (Res) begin // Сброс действует на эти регистры Ctrl[1:0] <= 2'h0;
Точно. Из allways блока он не дает напрямую IO пин установить, поэтому пришлось ввести промежуточный тригер MRDY. А до блока allways, где синхронная логика, уже в зависимости от состояния этого регистра устанавливается сама нога Ready:DimkaM wrote:[s]точно не MRDY <= 1'bZ;MRDY <= 1'b0; // Переводим READY в hi-Z
?[/s]
Code: Select all
assign Ready = (MRDY) ? 1'b0 : 1'bZ; // Если была попытка чтения/записи в порт, удерживаем READY
это условие никогда не выполнитсяif (BUSY)
// если продолжается сдвиг, опустим READY
MRDY <= 1'b1;
Почему?DimkaM wrote:это условие никогда не выполнитсяif (BUSY)
// если продолжается сдвиг, опустим READY
MRDY <= 1'b1;