|
разработка PCI target\master CORE для SPARTAN, Проблемы с которыми сталкнулся |
|
|
|
Jan 9 2007, 23:36
|
Группа: Новичок
Сообщений: 4
Регистрация: 31-10-06
Пользователь №: 21 823

|
Приветствую специалистов. Сделали мы с одногруп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 целиком  ? Не судите строго - это моя первая плата  . Я наверное облажался, что не включил SPARTAN в цепь JTAG? Теперь для отладки есть только три диода (не 4 - вывод P3 теперь подключен к AD(27) -B23, проводом =)). Помогите советом, а я PCI core в GPL выложу =).
Прикрепленные файлы
pcb.zip ( 24.25 килобайт )
Кол-во скачиваний: 44
|
|
|
|
|
 |
Ответов
|
Jan 10 2007, 00:11
|

Знающий
   
Группа: Свой
Сообщений: 541
Регистрация: 11-04-05
Из: Москва
Пользователь №: 4 045

|
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 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|