buggy 0 9 января, 2007 Опубликовано 9 января, 2007 · Жалоба Приветствую специалистов. Сделали мы с одногруп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: ? Не судите строго - это моя первая плата . Я наверное облажался, что не включил SPARTAN в цепь JTAG? Теперь для отладки есть только три диода (не 4 - вывод P3 теперь подключен к AD(27) -B23, проводом =)). Помогите советом, а я PCI core в GPL выложу =). pcb.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BSV 0 10 января, 2007 Опубликовано 10 января, 2007 · Жалоба 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, похожий на тот, что в спецификации описан и им рулите - Вам же будет легче. Все сигналы шины лучше защелкивать в регистрах блоков ввода-вывода как для входных, так и для выходных сигналов, иначе тайминги будет сложно соблюсти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v_mirgorodsky 0 13 января, 2007 Опубликовано 13 января, 2007 · Жалоба 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' - конфликтов на шине не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HeatSink 0 16 января, 2007 Опубликовано 16 января, 2007 · Жалоба Повнимательнее почитайте спецификацию - как управляются сигналы. Вам нужно реализовать машину состояний. Без неё - никуда. И последовательно по фазам прописать все варианты (для начала хотя бы - работа с конфиг. пространством). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться