Перейти к содержанию
    

разработка PCI target\master CORE для SPARTAN

Приветствую специалистов.

 

Сделали мы с одногрупgником плату простого PCI контроллера (Разводка во вложенном файле в Gerber, ошибки в питании и подтяжках на ПЗУ устранены поверхностным монтажом :) ) в рамках курсового. SPARTAN конфигурится и работает. Стали подымать PCI и зашили мы в неё следующее для пробы:

 

entity pci_interface is

port(

AD: inout std_logic_vector(31 downto 0);

CBE: in std_logic_vector(3 downto 0);

clk: in std_logic;

frame: in std_logic;

irdy: inout std_logic;

devsel, interrupt: out std_logic;

trdy: inout std_logic;

par, serr, stop, perr, req, gnt, lock: inout std_logic;

rst, idsel: in std_logic;

led1,led2,led3: out std_logic

);

end pci_interface;

 

architecture Behavioral of pci_interface is

signal adr_ok, read, write, cfg1, cfg2, cfg3, cfg4, cfg5,cfg6,cfg7:std_logic;

 

signal dout, din: std_logic_vector(31 downto 0);

 

signal DATA:std_logic_vector(31 downto 0);

 

signal state:std_logic_vector(2 downto 0);

 

signal cfg_reg00:std_logic_vector(31 downto 0);

signal cfg_reg04:std_logic_vector(31 downto 0);

signal cfg_reg08:std_logic_vector(31 downto 0);

signal cfg_reg10:std_logic_vector(31 downto 0);

 

signal reg_adress:std_logic_vector(5 downto 0);

 

signal answer:std_logic;

 

 

begin

 

--U1:

--IBUF port map (I=>rst, O=>irst);

 

par<='Z';

serr<='Z';

stop<='Z';

perr<='Z';

req<='Z';

gnt<='Z';

lock<='Z';

interrupt<='Z';

--led2_sig<='0';

---devsel<='Z';

 

process(clk)

 

begin

 

if clk'event and clk='1' then

 

if cfg1='1' then

state<="001";

DATA<="10011011110110111001101111011011";

end if;

 

if cfg2='1' then

state<="010";

DATA<="00000000000000000000000000000001";

end if;

 

if cfg3='1' then

state<="011";

DATA<="11111111000000000000000000000001";

end if;

 

if cfg4='1' then

state<="100";

DATA<="11111111111111111111111111111001";

end if;

 

if cfg5='1' and cfg1='0' and cfg2='0' and cfg3='0'and cfg4='0' then

state<="101";

DATA<="00000000000000000000000000000000";

end if;

 

if cfg6='1' or cfg7='1' then

state<="110";

write<='1';

end if;

 

if irdy='0' then

answer<='1';

else

answer<='0';

write<='0';

end if;

 

if write='1' and answer='1' then

DATA<=AD;

state<="111";

end if;

--if rst='0' then

--state<="000";

---cfg_reg00<="10011011110110111001101111011011";

--cfg_reg04<="00000000000000000000000000000001";

--cfg_reg08<="11111111000000000000000000000001";

--cfg_reg10<="11111111111111111111111111111001";

--adr_ok<='0';

--read<='0';

--write<='0';

--cfg<='0';

--else

 

 

--end if;

---end if;

 

--if irst'event and irst='0' then

 

--reset<=irst;

 

--end if;

 

---if irst'event and irst='1' then

 

end if;

 

end process;

 

--ad<=din when adr_ok<='1' and irdy='0' and read='1' else "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";

 

--devsel<='0' when read='1' or write='1' else 'Z';

--trdy<='0' when read='1' or write='1' else 'Z';

 

cfg1<='1' when idsel='1' and frame='0' and CBE="1010" and AD(7 downto 2)="000000" else '0';

cfg2<='1' when idsel='1' and frame='0' and CBE="1010" and AD(7 downto 2)="000100" else '0';

cfg3<='1' when idsel='1' and frame='0' and CBE="1010" and AD(7 downto 2)="001000" else '0';

cfg4<='1' when idsel='1' and frame='0' and CBE="1010" and AD(7 downto 2)="010000" else '0';

cfg5<='1' when idsel='1' and frame='0' and CBE="1010" else '0';

cfg6<='1' when idsel='1' and frame='0' and CBE="1011" and AD(7 downto 2)="010000" else '0';

cfg7<='1' when idsel='1' and frame='0' and CBE="1011" else '0';

 

devsel<='0' when answer='1' else 'Z';

trdy<='0' when answer='1' else 'Z';

AD<=DATA when answer='1' and write='0' else "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";

 

led1<=state(2);

led2<=state(1);

led3<=state(0);

end Behavioral;

 

Плата вроди бы как конфигурится, но после последней транзакции CFG_WRITE комп висит мёртво и материнка не пищит о том что в ней не стоит VGA. Мы делали разводку с расчётом на то что будем делать Master и подключили выводы ПЛИС к par, serr, stop, perr, req, gnt, lock разъема PCI. Если я на данный момент не использую эти выводы то если при конфигурации ПЛИС указать что неиспользуемые выводы оставить FLOAT они будут в состоянии 'Z'? ИЛИ сразу надо писать весь CORE целиком :cranky: ? Не судите строго - это моя первая плата:biggrin: . Я наверное облажался, что не включил SPARTAN в цепь JTAG? Теперь для отладки есть только три диода (не 4 - вывод P3 теперь подключен к AD(27) -B23, проводом =)). Помогите советом, а я PCI core в GPL выложу =).

pcb.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Lock в последних версиях спецификации (начиная с 2.3 кажется) использовать не рекомендуется

2) Req после снятия сброса должен быть в '1' он свой для каждого устройства на шине.

3) Par драйвить при чтении обязательно!!!! Иначе на некоторых матерях не будет работать. Читайте спецификацию.

4) На Stop пока можно забить, но он понадобится, если нужно будет завершать транзакции по инициативе Target.

5) Есть еще один момент - сигналы STOP, TRDY, IRDY, FRAME являются s/t/s сигналами, т.е. их перед снятием 1 такт нужно в '1' подержать.

 

6) Есть ошибка в коде:

if irdy='0' then

answer<='1';

else

answer<='0';

write<='0';

end if;

если irdy выставляется не сразу, то write сбросится и будет конфликт на шине.

7) Обращайте особое внимание на Warning'и синтезатора - наверняка он Вам Latch'ей навставлял.

 

Вы бы это добро помоделировали сначала что-ли, что железо-то зря палить!!! Симулятор - это наше все!!!

 

Для начала реализуйте автомат Target'a, похожий на тот, что в спецификации описан и им рулите - Вам же будет легче. Все сигналы шины лучше защелкивать в регистрах блоков ввода-вывода как для входных, так и для выходных сигналов, иначе тайминги будет сложно соблюсти.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Lock в последних версиях спецификации (начиная с 2.3 кажется) использовать не рекомендуется

2) Req после снятия сброса должен быть в '1' он свой для каждого устройства на шине.

3) Par драйвить при чтении обязательно!!!! Иначе на некоторых матерях не будет работать. Читайте спецификацию.

4) На Stop пока можно забить, но он понадобится, если нужно будет завершать транзакции по инициативе Target.

5) Есть еще один момент - сигналы STOP, TRDY, IRDY, FRAME являются s/t/s сигналами, т.е. их перед снятием 1 такт нужно в '1' подержать.

 

6) Есть ошибка в коде:

if irdy='0' then

answer<='1';

else

answer<='0';

write<='0';

end if;

если irdy выставляется не сразу, то write сбросится и будет конфликт на шине.

7) Обращайте особое внимание на Warning'и синтезатора - наверняка он Вам Latch'ей навставлял.

 

Вы бы это добро помоделировали сначала что-ли, что железо-то зря палить!!! Симулятор - это наше все!!!

 

Для начала реализуйте автомат Target'a, похожий на тот, что в спецификации описан и им рулите - Вам же будет легче. Все сигналы шины лучше защелкивать в регистрах блоков ввода-вывода как для входных, так и для выходных сигналов, иначе тайминги будет сложно соблюсти.

А если навставлять регистров почем зря, то очень сложно будет добиться адекватной производительности :( К сожалению, PCI ядро, особенно мастер, это такой себе огромный клубок компромисов, которые очень сложно соблюсти без наличия достаточного опыта :(

 

2 buggy

Ну, зависаете вы потому, что устанавливаете answer по любому падению на irdy в нуль. Это в свою очередь приводит к появлению логического нуля на trdy и devsel. Так делать нельзя. Прежде чем включать драйвера на trdy и devsel необходимо быть увереным, что транзакция направлена именно вам.

 

Далее - включить tri-state и задрайвить нуль на выходную шину - очень дохлое занятие - все тайминги идут лесом. Надо включать tri-state, драйвить на нем '1' и только следующим тактом выводить '0'. Это касательно trdy и devsel, аналогично необходимо поступать и с шиной даных. В литературе данный прием по отношению к AD шине называется adress/data stepping.

 

P.S. Не хочу сбивать ваш боевой настрой, но исходники полнофункционального PCI master ядра на 33MHz в нашем исполнении занимают "всего" 170kB, не считая тест-бенчей, на их написание был потрачен почти месяц рабочего времени двух инженеров с несколькими годами опыта в разработке цифровых схем, их окончательная отладка заняла еще 2 недели. Может, вам попытаться упростить себе задачу? К примеру, ограничиться однотактными пересылками по шине? Не реализовывать мастера?

 

P.P.S. Неиспользуемые выводы достаточно драйвить константным 'Z' - конфликтов на шине не будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Повнимательнее почитайте спецификацию - как управляются сигналы.

 

Вам нужно реализовать машину состояний. Без неё - никуда. И последовательно по фазам прописать все варианты (для начала хотя бы - работа с конфиг. пространством).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...