[an error occurred while processing this directive]
Помогите, плиз. Почему это не работает (PCI). Кажись все правильно, но мамка с этой платой вообще не запускается. Я уже не знаю, что и думать (+)
(«Телесистемы»: Конференция «Программируемые логические схемы и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Виноградов Алексей 17 января 2003 г. 13:49

Вот код на AHDL.
По фронту на CLK плата смотрит, производится-ли запись в 80 порт и выставлен-ли /Frame = 0. Если да, то плата сбрасывает /TRDY и /Devsel в нолик. Дальше она ждет окончания транзакции (когда /IRDY и /FRAME = 1, транзакция считается оконченной), и взводит на один такт /TRDY и /Devsel в единички, а далее отпускает их в третье состояние.
Если отбросить идеологические спекуляции о том, что плата не отвечает на запросы конфигурации (CLK мать не отрубает, это проверено), то что это может быть? Если не вводить /TRDY и /Devsel, все работает (ессно, комп, а не плата).
Вот мой код:

SUBDESIGN pci_post_card
(
clk, /rst, /frame, /irdy : input;
ad[15..0], /cbe[3..0] : input;
/devsel, /trdy : OUTPUT;
)
variable
/devsel_buf, /trdy_buf : tri;
transaction : machine with states(t0,t1,t2);
port_is_80h : node;
write_80h_transaction : node;
command_is_write : node;

BEGIN
defaults
/devsel_buf.in = vcc;
/trdy_buf.in = vcc;
/devsel_buf.oe = gnd;
/trdy_buf.oe = gnd;
end defaults;

/devsel = /devsel_buf.out;
/trdy = /trdy_buf.out;

transaction.clk = clk;
transaction.reset = !/rst;

if ad[15..0] == h"80" then port_is_80h = vcc; end if;
if /cbe[3..0] == b"0011" then command_is_write = vcc; end if;
write_80h_transaction = port_is_80h & command_is_write & !/frame;

case transaction is
when t0 =>
if write_80h_transaction == vcc then /devsel_buf.in = gnd;
/trdy_buf.in = gnd;
/devsel_buf.oe = vcc;
/trdy_buf.oe = vcc;
transaction = t1;
else transaction = t0;
end if;

when t1 =>
if /frame == vcc & /irdy == vcc then /devsel_buf.in = vcc;
/trdy_buf.in = vcc;
/devsel_buf.oe = vcc;
/trdy_buf.oe = vcc;
transaction = t2;
else /devsel_buf.in = gnd;
/trdy_buf.in = gnd;
/devsel_buf.oe = vcc;
/trdy_buf.oe = vcc;
transaction = t1;
end if;

when t2 =>
/devsel_buf.in = vcc;
/trdy_buf.in = vcc;
transaction = t0;
end case;

END;

Извините за дурацкий вопрос и большое спасибо за внимание !

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru