Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: pci интерфейс по шагам
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
sergey sva
Возникла необходимость изучить интерфейс pci и vhdl, прочитал спецификацию несколько раз, набрал исходников, но логические цепочки в моем мозгу не собираются. Информации много не знай с чего начать. Одна голова хорошо а много лучше, пословица старая и мудрая.
Прошу помочь в этом деле, если тема пойдет может будет еще кому полезна решившего освоить pci.
Цель сделать счетчик 64 разряда, интерфейс pci target 32 бита,плата с spartan3e есть,
выведенные пины ad0-32;c/be0-3;par;serr;perr;stop;devsel;trdy;irdy;frame;idsel;req;gnt;clk;rst;inta
устройство должно считать импульсы на входе плис по переднему фронту, а программа через драйвер должна читать и обнулить это значение.
Прошу просто руководить банкетом по шагам sm.gif буду делать как скажите и выкладывать код.
Первые шаги сделал, установил xilinx ISE настроил кабель связь есть, прочитал несколько раз спецификацию sm.gif , создал проект и добавил
VHDL module в нем описал интерфейс
Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--use IEEE.NUMERIC_STD.ALL;

-- Uncomment the following library declaration if instantiating
-- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
--*******************************************************************************
entity PciInterf  is
    port (
      RST          : in    std_logic;                      -- Reset    
      CLK          : in    std_logic;                      -- Clock    
      AD           : inout std_logic_vector(31 downto 0);  -- Address/Data Bus
      CBE          : in std_logic_vector(3 downto 0);      -- Command/Byte Enable
      PAR          : inout std_logic;                      -- Parity
      FRAME        : in std_logic;                            -- Transaction Frame
      IRDY         : in std_logic;                            -- Initiator Ready
      TRDY         : inout std_logic;                        -- Target Ready
      DEVSEL       : inout std_logic;                      -- Device Select
      STOP         : inout std_logic;                        -- Stop transaction
      IDSEL        : in    std_logic;                      -- Chip Select
      PERR         : inout std_logic;                        -- Parity Error (s/t/s)
      SERR         : inout std_logic;                        -- System Error (o/d)
      INTA         : inout std_logic;                      -- Interrupt pin (o/d)
        
        COUNTPIN     : in std_logic                          --

    );
end PciInterf;
--*******************************************************************************
architecture Behavioral of PciInterf is

begin


end Behavioral;
--*******************************************************************************

В ucf файле связал интерфейс с пинам на микросхеме
Код
NET "AD<0>"     LOC = "P50"  | IOSTANDARD = PCI33_3;
NET "AD<10>"    LOC = "P34"  | IOSTANDARD = PCI33_3;
NET "AD<11>"    LOC = "P33"  | IOSTANDARD = PCI33_3;
NET "AD<12>"    LOC = "P31"  | IOSTANDARD = PCI33_3;
NET "AD<13>"    LOC = "P30"  | IOSTANDARD = PCI33_3;
NET "AD<14>"    LOC = "P29"  | IOSTANDARD = PCI33_3;
NET "AD<15>"    LOC = "P28"  | IOSTANDARD = PCI33_3;
NET "AD<16>"    LOC = "P25"  | IOSTANDARD = PCI33_3;
NET "AD<17>"    LOC = "P24"  | IOSTANDARD = PCI33_3;
NET "AD<18>"    LOC = "P23"  | IOSTANDARD = PCI33_3;
NET "AD<19>"    LOC = "P22"  | IOSTANDARD = PCI33_3;
NET "AD<1>"     LOC = "P49"  | IOSTANDARD = PCI33_3;
NET "AD<20>"    LOC = "P19"  | IOSTANDARD = PCI33_3;
NET "AD<21>"    LOC = "P18"  | IOSTANDARD = PCI33_3;
NET "AD<22>"    LOC = "P16"  | IOSTANDARD = PCI33_3;
NET "AD<23>"    LOC = "P15"  | IOSTANDARD = PCI33_3;
NET "AD<24>"    LOC = "P12"  | IOSTANDARD = PCI33_3;
NET "AD<25>"    LOC = "P11"  | IOSTANDARD = PCI33_3;
NET "AD<26>"    LOC = "P9"   | IOSTANDARD = PCI33_3;
NET "AD<27>"    LOC = "P8"   | IOSTANDARD = PCI33_3;
NET "AD<28>"    LOC = "P5"   | IOSTANDARD = PCI33_3;
NET "AD<29>"    LOC = "P4"   | IOSTANDARD = PCI33_3;
NET "AD<2>"     LOC = "P48"  | IOSTANDARD = PCI33_3;
NET "AD<30>"    LOC = "P3"   | IOSTANDARD = PCI33_3;
NET "AD<31>"    LOC = "P2"   | IOSTANDARD = PCI33_3;
NET "AD<3>"     LOC = "P47"  | IOSTANDARD = PCI33_3;
NET "AD<4>"     LOC = "P42"  | IOSTANDARD = PCI33_3;
NET "AD<5>"     LOC = "P41"  | IOSTANDARD = PCI33_3;
NET "AD<6>"     LOC = "P40"  | IOSTANDARD = PCI33_3;
NET "AD<7>"     LOC = "P39"  | IOSTANDARD = PCI33_3;
NET "AD<8>"     LOC = "P36"  | IOSTANDARD = PCI33_3;
NET "AD<9>"     LOC = "P35"  | IOSTANDARD = PCI33_3;

NET "CBE<0>"    LOC = "P60"  | IOSTANDARD = PCI33_3;
NET "CBE<1>"    LOC = "P62"  | IOSTANDARD = PCI33_3;
NET "CBE<2>"    LOC = "P202" | IOSTANDARD = PCI33_3;
NET "CBE<3>"    LOC = "P199" | IOSTANDARD = PCI33_3;

NET "CLK"       LOC = "P186" | IOSTANDARD = PCI33_3;
NET "DEVSEL"    LOC = "P68"  | IOSTANDARD = PCI33_3;
NET "FRAME"     LOC = "P203" | IOSTANDARD = PCI33_3;
NET "IDSEL"     LOC = "P14"  | IOSTANDARD = PCI33_3;
NET "INTA"      LOC = "P193" | IOSTANDARD = PCI33_3;
NET "IRDY"      LOC = "P200" | IOSTANDARD = PCI33_3;

NET "PAR"       LOC = "P45"  | IOSTANDARD = PCI33_3;
NET "PERR"      LOC = "P64"  | IOSTANDARD = PCI33_3;
NET "RST"       LOC = "P194" | IOSTANDARD = PCI33_3;
NET "SERR"      LOC = "P63"  | IOSTANDARD = PCI33_3;
NET "STOP"      LOC = "P65"  | IOSTANDARD = PCI33_3;
NET "TRDY"      LOC = "P205" | IOSTANDARD = PCI33_3;


NET "COUNTPIN"  LOC = "P20"  | IOSTANDARD = PCI33_3;

Что дальше сделать подскажите ?
vitan
Счетчик отдельно, а PCI отдельно. Напишите уж сначала счетчик, сигналы управления от него выведите на PCI. Лучше, видимо, для этого придумать некий регистр управления, который будет доступен со стороны PCI. Битики в регистре придумайте. Скачайте с opencores pci_target. Ну и т.п....
XVR
Если вы хотите, что бы ваше устройство увидела ОС, то одним регистром вам не отделаться.

Вам необходимо будет так же реализовать Config Space с BAR0 (как минимум)

Собственно корку можно поделить на 3 части -

1). Front End - общение с протоколом PCI и выделение отдельных транзакций (запись/чтение, Config/BAR0). Возможно проверка ошибок.

2) Обработка запросов к Configuration Space. Все необходимые регистры (и BAR0)

3) Собственно декодер адреса на BAR0 (может быть во Fromt End'e) и ваш конечный регистр



Я когда то писал PCI Target, но он так и остался недоотлаженным, увы. (На Verlog'е). Могу поделится, если надо (~1000 строк Verilog'а)
sergey sva
Цитата
Я когда то писал PCI Target, но он так и остался недоотлаженным, увы. (На Verlog'е). Могу поделится, если надо (~1000 строк Verilog'а)

Буду очень благодарен asv-lab@yandex.ru
Цитата
сигналы управления от него выведите на PCI. Лучше, видимо, для этого придумать некий регистр управления, который будет доступен со стороны PCI.

Добавить в интерфейс CVALUE ?
Код
entity PciInterf  is
    port (
      RST          : in    std_logic;                      -- Reset    
      CLK          : in    std_logic;                      -- Clock    
      AD           : inout std_logic_vector(31 downto 0);  -- Address/Data Bus
      CBE          : in std_logic_vector(3 downto 0);      -- Command/Byte Enable
      PAR          : inout std_logic;                      -- Parity
      FRAME        : in std_logic;                            -- Transaction Frame
      IRDY         : in std_logic;                            -- Initiator Ready
      TRDY         : inout std_logic;                        -- Target Ready
      DEVSEL       : inout std_logic;                      -- Device Select
      STOP         : inout std_logic;                        -- Stop transaction
      IDSEL        : in    std_logic;                      -- Chip Select
      PERR         : inout std_logic;                        -- Parity Error (s/t/s)
      SERR         : inout std_logic;                        -- System Error (o/d)
      INTA         : inout std_logic;                      -- Interrupt pin (o/d)

     CVALUE    : out std_logic_vector(7 downto 0);   -- value of counter





Простенький счетчик может конечно что не так, поправьте
Код
--*******************************************************************
entity Counter is
   port (
      RESET, COUNTPIN   : in  std_logic;
      CVALUE            : out std_logic_vector(7 downto 0)
    );      
end Counter;
--*******************************************************************
architecture beh of Counter is
   signal COUNT_VALUE : std_logic_vector(7 downto 0);
begin
    process(RESET,COUNTPIN)
    begin
        if(RESET = '1')then
            COUNT_VALUE <= 0;
        else if(COUNTPIN'event and COUNTPIN = '1') then
            COUNT_VALUE <= COUNT_VALUE +1;
        end if;

    end
CVALUE <= COUNT_VALUE;
end beh;
--*******************************************************************

iosifk
Цитата(sergey sva @ Aug 30 2011, 22:59) *
Возникла необходимость изучить интерфейс pci и vhdl, прочитал спецификацию несколько раз, набрал исходников, но логические цепочки в моем мозгу не собираются. Информации много не знай с чего начать.
...
Что дальше сделать подскажите ?


Сергей, Вы уж извините, но что за детский сад Вы здесь развели! Вам надо изучить что-то и Вы готовы всю конференцию превратить в собственную няньку.
Сейчас не конец 90-х. Литературы, даже на русском полно. Читайте про интерфейсы у Гука.
В каждой третьей книге именно PCI проект описан и разжеван.. Открытых проектов - полно. Посмотритте сначала их, а уже потом заводите игры в конференции.
А уж про счетчик так и вовсе писать стыдно! И в Ксайлинсовском ИСЕ и в Квартусе и в Моделсиме есть шаблоны. И шаблоны счетчиков в том числе. И вообще, на кой он Вам дался, счетчик. Сделайте просто константу и читайте ее через PCI.
sergey sva
Можно миллион книг прочитать и толку будет мало.
Цитата
А уж про счетчик так и вовсе писать стыдно!

Где стыд был теперь микросхема ))
iosifk ,посмотрел вашу страничку, вам приходилось разрабатывать устройства с pci, просто вам показался вопрос слишком простыми и поэтому тема вызвала такую реакцию.
iosifk
Цитата(sergey sva @ Aug 31 2011, 10:50) *
Можно миллион книг прочитать и толку будет мало.


А вот это - не правда. Что же, все авторы идиоты?

Пытался загрузить PCI System Arhitecture by don andersen. Но это 7 Мег, многовато...
И еще "Сергей Петров, PCI, PCI express. Архитектура, дизайн, принципы функционирования"...

Я то вообще делал свой проект, когда не то что книг, а даже стандарт в сети с трудом нашли... Так что ищите книги и смотрите AN у Альтеры и у Ксайлинкса, Актела...

Приложенный файлик - это пример. Я его не проверял. Но на opencores должны быть проекты...
sergey sva
спасибо, Петрова не читал сейчас поищу.
iosifk
Цитата(sergey sva @ Aug 31 2011, 10:50) *
... просто вам показался вопрос слишком простыми....


Да, кстати, я еще тогда напоролся на такой прикол. В качестве материнки была взята плата пром-PC от Адвантеча. Так вот она упорно не воспринимала мою карту, хотя все было верно и регистры читались по непосредственным адресам... А в обычной, бытовой материнке эта же карта работала. Думаю, что Адвантечевская плата не признавала "чужие" карты...
XVR
Обещанные сорцы (хотя они вряд ли помогут - коментариями они не избалованны да и баги могут быть)

Нажмите для просмотра прикрепленного файла
sergey sva
Цитата
Обещанные сорцы (хотя они вряд ли помогут - коментариями они не избалованны да и баги могут быть)

Спасибо, помогут есть в чем разбираться уже хорошо ))
tAmega
Вот две корки и небольшая статья.
Корки рабочие, одна с opencores другая наша, обе не мои.
За pci_target автор говорил что стопудово рабочая корка.
Корка с open cores также идет под грифом "FPGA proven".
sergey sva
спасибо, сейчас посмотрю.
Как можно проверить в каком состоянии pci мастер, или что может вызывать такое: если плата (устройство taerget) стерто компьютер включается нормально, но если загрузить прошивку то при включении не появляется даже стартовый экран, просто работают вентиляторы,если плату вытащить в этот момент(знаю так делать не желательно) то компьютер начинает загружаться появляется стартовый экран? (какие сигналы это могут вызвать)
iosifk
Цитата(sergey sva @ Sep 1 2011, 08:30) *
спасибо, сейчас посмотрю.
Как можно проверить в каком состоянии pci мастер, или что может вызывать такое: если плата (устройство taerget) стерто компьютер включается нормально, но если загрузить прошивку то при включении не появляется даже стартовый экран, просто работают вентиляторы,если плату вытащить в этот момент(знаю так делать не желательно) то компьютер начинает загружаться появляется стартовый экран? (какие сигналы это могут вызвать)

Это значит, что какой то из сигналов не снялся и остался активным. Чтобы плату н дергать сделайте кнопку или джампер, который бы сбрасывал автомат таргета в исходное и тристейтил бы ответные сигналы. А вообще то надо подцепить осцилл и смотреть конкретно... Либо прицепить пяток светодиодов на плату и на них вывести ваши сигналы...
sergey sva
С vhdl еще не освоился простой вопрос в папке pcitarget несколько файлов как определить какой должен быть TOP и их достаточно добавить в проект что то типа include как в си не нужно?
sergey sva
С этим разобрался, например в одном файле
Код
package CFGSPACE_SET is ......
а в другом чтобы использовать
Код
use WORK.CFGSPACE_SET.all;
поправьте если ошибаюсь.
А какой файл должен быть top set пока не понял.
sergey sva
До этого немного разбирался с квартусом там после добавления файла в менеджера проектов нужно было установить какой файл главный Project/Set As Top Level Entity. xilinx ise нет такого? Есть исходники из 13 файлов (ссылка в 12 посте) как определить какой главный?
Kuzmi4
2 sergey sva
определять так же как и в квартусе laughing.gif или правой клавишей на фале и в меню выбрать Set us Top Module если он сам не догадался
sergey sva
Цитата
Set us Top Module если он сам не догадался

Наверно сам догадался )) потому что кнопка не активна, вот это и стало не понятно. А как определить где главный файл , и больше не буду задавать таких детских вопросов ))?
tAmega
Файл главный pci_app.vhd
Определяется просто, каждый из файлов содержит в архитектуре компоненты, другие файлы.
Самый верхний файл не сидит нигде в компонентах, а все остальные так или иначе входят в качестве компонентов в иерархию.
Вот так и здесь pci_app.vhd = содержит компоненты PCI_T32 и USER_APP, далее PCI_T32 содержит компоненты CHECK_PAR, PCI_IO_VIRTEX, PCI_CMD_ADR, CFG_SPACE. И так далее...
sergey sva
Понятно так и думал)).
Есть разница в протоколе pci 33 /66/133 кроме времени ?
sergey sva
Еще проблема не могу настроить P14 (xc3s250) на вход в документации написано что работает только на вход
Цитата
Unrestricted, general-purpose input-only pin. This pin does not have an
output structure, differential termination resistor, or PCI clamp diode

Planahead ругается
Нажмите для просмотра прикрепленного файла
В чем может быть дело?
sergey sva
С пустым проектом (схема вход через инвертор на выход ) P14 назначается нормально на вход.
А если с проектом из 12поста (pci target) выходит эта ошибка.
idsel должен работать как вход.
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
tAmega
Не собирал проект pci_target, поэтому показать свою версию не могу.
Судя по сообщению, он пишет "ничем не ограниченный вход", а поскольку Вы делаете контроллер для шины PCI, которая предполагает выбросы, софт советует подключить либо резисторы, либо clamp диоды, которые не позволят выбросам быть больше чем размах питания. Почитайте аппноты по PCI для данного софта. И у Альтеры и у Xilinx есть корки PCI, и там же можно посмотреть как именно они разбираются с пинами в ucf файле. Или качните самопальные проекты из сети, которые хотя бы компилятся, там увидите как настроить внешний интерфейс.
sergey sva
Вход P14 в документации написано не имеет не диодов ни резисторов и работает только на вход
Из документации
Цитата
nrestricted, general-purpose input-only pin. This pin does not have an
output structure, differential termination resistor, or PCI clamp diode

Подозреваю где-то в проекте как то связано с входом IDSEL_p что вызывает такую ошибку,может ошибаюсь, где посмотреть нет мыслей. подкиньте мысль))
tAmega
Воспользуйтесь другим входом. Он вообще поддерживает PCI33 или нет.
Возможно Вы пытаетесь настроить на PCI шину вход, который для этого не предназначен.
sergey sva
Пробовал на всякие настраивать lvcmos pci..., все время эта ошибка. пробовал сделать новый проект с примитивным кодом один вход и один выход через инвертор, ошибок не было.
Получается что дело в исходнике, пока нет идей что смотреть, если у кого есть подкиньте))
vitan
Цитата(sergey sva @ Sep 2 2011, 15:42) *
если у кого есть подкиньте))

Не работал с ксайлинксом, но думаю, что на этом пине в настройках проекта включено что-то типа глобального ресета или клока с помощью каких-нибудь галочек. Если пытаться на такой пин что-то назначить из исходников, то будет ошибка.
sergey sva
Порты IP, для чего они обычно используются?
вызывает ошибку(в 22 посте) мапинг
Код
  component IBUF is
     port(
         I: in std_logic;
         O: out std_logic
     ); end component;

IB2: IBUF port map(I => IDSEL_p, O => IDSELil);

Любой другой порт не IP, привязанный к IDSEL_p не вызывает ошибки. Что можно сделать?
sergey sva
Взял пример c opencores pci32tlite_oc_R03 все собралось без ошибок, загрузил ,комп тоже стал запускаться.
dmidecode ведь должен показать vendorID deviceID ?
в коде задан
Код
generic (
    vendorID      : std_logic_vector(15 downto 0) := x"4150";
    deviceID      : std_logic_vector(15 downto 0) := x"0001";
    revisionID      : std_logic_vector(7 downto 0)  := x"90";
    subsystemID  : std_logic_vector(15 downto 0) := x"0000";
       subsystemvID : std_logic_vector(15 downto 0) := x"1172";
    classcodeID  : std_logic_vector(23 downto 0) := x"068000";
    -- BAR&WB_CFG (dont delete)
gosu-art
sergey sva
Ну как, у Вас заработал pci32tlite_oc_R03? Вы его делали, если я не ошибаюсь, на Spartan 3E?
У меня вот такой вопрос...
Мне нужно сделать сейчас CompactPCI (замена CY7C09449), где будет стоять еще 16ть модулей. Прокачают ли такую нагрузку ноги Спартана? Или шинники лучше добавить?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.