Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Освоение ISE
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Nuts
Здравствуйте!!!
Написал в ISE программу для ПЛИС XILINX на VHDL, программа состоит из одного процесса.
Скажите пожалуйста, можно средствами ISE посмотреть за сколько тактов выполнится программа, тоесть процесс?
makc
Цитата(Nuts @ Jul 26 2008, 16:12) *
Здравствуйте!!!
Скажите пожалуйста, можно средствами ISE посмотреть за сколько тактов выполнится программа?


О какой программе Вы говорите?
Если Вы имеете в виду получение результата на выходе Вашего модуля (проекта), то ISE этим не занимается, т.к. не знает логики работы модуля и воздействий, которые будут производиться на модуль. Но Вы можете воспользоваться встроенным в ISE симулятором или каким-нибудь внешним симулятором, чтобы промоделировать проект и узнать, за какое время появляется требуемый результат при заданных входных воздействиях.
Nuts
Спасибо. За совет.

makc
Программа такая, по последовательной шине принимаю данные, накапливаю их до 16-ти бит и выбрасываю по параллельной 16-ти разрядной шине.
Мне нужно за 16 тактов: накопить 16 бит и выбросить из в параллельную шину(я хочу главным генератором ПЛИС назначить генератор последовательной шины.).
Вот интересно при обращении к переменным: сложение, вычитание сколько тактов тратится? 05.gif
makc
Цитата(Nuts @ Jul 26 2008, 16:12) *
Написал в ISE программу для ПЛИС XILINX на VHDL, программа состоит из одного процесса.


Если весь модуль состоит из одного процесса, то, понимая логику его работы (ведь Вы его создатель), не составит большого труда посчитать время его выполнения.


Цитата(Nuts @ Jul 26 2008, 16:49) *
makc
Программа такая, по последовательной шине принимаю данные, накапливаю их до 16-ти бит и выбрасываю по параллельной 16-ти разрядной шине.
Мне нужно за 16 тактов: накопить 16 бит и выбросить из в параллельную шину(я хочу главным генератором ПЛИС назначить генератор последовательной шины.).
Вот интересно при обращении к переменным: сложение, вычитание сколько тактов тратится? 05.gif


Приведите пример кода.
Nuts
Цитата(makc @ Jul 26 2008, 19:50) *
Если весь модуль состоит из одного процесса, то, понимая логику его работы (ведь Вы его создатель), не составит большого труда посчитать время его выполнения.


Я вот новичок, может глупости спрашиваю smile.gif

С логикой понятно, а вот например на присвоение значения переменной сколько тактов тратится?

С кодом чуть позже, мне его восстановить надо crying.gif

например :
Код
....
I,x,b:integer;
...
I:=100;
b:=300;
x:=65;
...


за один такт выполнится?
makc
Если после присвоения переменной Вы будете ее использовать где-то дальше в теле процесса, то использоваться будет новое, присвоенное значение. Т.е. можно считать, что оно присваивается в том же такте.

На примере это выглядит так:
Код
....
variable a,b,c:integer;
...
a:=1;
b:=2;
c:=a+b;
...


с станет равной 3 в том же такте, что и будет выполнено присвоение a и b.
Nuts
А если такой случай где будет счетчик например:
Код
variable a,b,c:integer;
...
a:=1;
b:=b+1;   --счетчик
c:=a+b;


Тоже за один такт выполнится? 05.gif
makc
Цитата(Nuts @ Jul 27 2008, 08:00) *
А если такой случай где будет счетчик например:
Код
variable a,b,c:integer;
...
a:=1;
b:=b+1;   --счетчик
c:=a+b;


Тоже за один такт выполнится? 05.gif


Да. Но это только в случае, если a и b - variables. Если они signals, то будет по-другому. Почитайте любую книгу по VHDL. Все возможные варианты на примерах не рассмотришь, нужно понимание общих принципов.
Nuts
Makс, пасибо вы очень помогли. smile.gif
Maverick
Цитата(Nuts @ Jul 27 2008, 07:00) *
А если такой случай где будет счетчик например:
Код
variable a,b,c:integer;
...
a:=1;
b:=b+1;   --счетчик
c:=a+b;


Тоже за один такт выполнится? 05.gif


Только здесь вместо счетчика у Вас будет 32 разрядный сумматор sad.gif
Nuts
Maverick, хорошо я запомню smile.gif .
Есть вопрос
Пример:
Код
..........
..........
Port ( LED_1,LED_2: out  STD_LOGIC:='1');
..........
..........
Process
  begin
  ...........
  ...........
  if i=10 then
    LED_1<='0';         --
    LED_2<='0';
  end if;
  ............
  ............
  end process;

В примере сначала изменится порт LED_1 на '0', затем изменится LED_2 на '0', а
можно как нибудь прописать чтобы в процессе LED_1 и LED_2 изменились одновременно?
Если можно напишите примерчик 05.gif
makc
Цитата(Nuts @ Jul 27 2008, 20:32) *
В примере сначала изменится порт LED_1 на '0', затем изменится LED_2 на '0', а
можно как нибудь прописать чтобы в процессе LED_1 и LED_2 изменились одновременно?
Если можно напишите примерчик 05.gif


Что значит одновременно в Вашем понимании? Если "одновременно", значит "по какому-то событию", то соответствующий сигнал должен быть указан в списке чувствительности процесса. И тогда активация процесса будет привязана к конкретным событиям в модуле. Но, в любом случае, в приведенном примере изменение произойдет в один и тот же момент времени.
CaPpuCcino
я бы предложил товарищу вопрошающему всё-таки сначала ознакомиться с осносами языков описания аппаратуры и проектированию с их помощью цифровых систем. для начинающих есть большой спектр литературы на русском. а потом уже если будут оставаться какие-то неясности задать соотв. вопр.
Nuts
makc
Если писать команды в теле самого модуля то они будут выполняться параллельно, чтобы команды выполнять последовательно нужно создать процесс и в нем писать команды.
Так как у меня в примере LED_1 и LED_2 находятся в процессе и выполняются по одному событию, но сначала изменится состояние LED_1 а затем изменится состояние LED_2 - так как в процессе команды выполняются последовательно.
А если нужно чтобы они выполнились параллельно, как выполняются команды в теле модуля?
Может можно написать что-то вроде :LED_1,LED_2<='0' , чтобы сигнал одновременно полетел на 2 порта сразу LED_1 и LED_2.

PS: ушел читать VHDL 05.gif
MrYuran
Вот к чему приводит непонимание основ...
"Программа для ПЛИС на VHDL"...
Никакая это на самом деле не программа, а конфигурация железа, записанная алгоритмическим языком. И то, что "команды" записаны друг за другом, совсем не определяет порядок их "выполнения".
Может, лучше начать со схемного ввода, пока ясность не наступит?
Основная идея - ПЛИС - это не процессор, и "программу" не "выполняет". А функционирует как цифровой автомат, логика которого задаётся конфигурацией.
makc
Цитата(Nuts @ Jul 28 2008, 08:51) *
makc
Если писать команды в теле самого модуля то они будут выполняться параллельно, чтобы команды выполнять последовательно нужно создать процесс и в нем писать команды.


Нет, не так. Поскольку Вы описываете логику работы схемы, то понятие команд в данном случае вообще не применимо. Можно говорить только о конструкциях языка описания, которые бывают параллельные и последовательные. Но, при этом, их названия непосредственно не связаны с порядком выполнения этих конструкций, т.к. он в каждом случае определяется условиями использования каждой из этих конструкций. Поэтому несмотря на то, что у Вас присваивания LED_1 и LED_2 записаны в теле процесса последовательно, с точки зрения аппаратуры (и, естественно, симулятора) они будут выполнены одновременно, т.е. "параллельно". Вот такой парадокс. Учите матчасть. Разберитесь с осноными понятиями HDL.
Nuts
Теперь понятно. Я действительно думал что ПЛИС-процессор, и что я программю а не конфигурирую железо. 05.gif
Nuts
Что такое макроячейка? 05.gif
makc
Цитата(Nuts @ Jul 31 2008, 07:31) *
Что такое макроячейка? 05.gif


Почитайте http://en.wikipedia.org/wiki/Field-programmable_gate_array для общего развития.
Nuts
Спасибо. smile.gif
muravei
У меня тоже вопрос : "Как приделать к дешифратору Чип Селект?"
Придумал добавить еще один разряд, а как правильно?
Код
entity decoder is
    Port ( ADR : in  STD_LOGIC_VECTOR (3 downto 0);
--                CS : in  STD_LOGIC;
           REG_WR : out  STD_LOGIC_VECTOR (7 downto 0));
end decoder;

architecture Behavioral of decoder is

begin
with ADR  select
    REG_WR <=    "00000001" when "0000",
            "00000010" when "0001",
            "00000100" when "0010",
            "00001000" when "0011",
            "00010000" when "0100",
            "00100000" when "0101",
            "01000000" when "0110",
            "10000000" when "0111",
            "00000000" when others;
end Behavioral;
makc
Цитата(muravei @ Jul 31 2008, 22:12) *
У меня тоже вопрос : "Как приделать к дешифратору Чип Селект?"
Придумал добавить еще один разряд, а как правильно?


Фактически, чипселект это и есть дополнительный адресный разряд, который вырабатывают на основе старших разрядов адреса для упрощения декодирования адреса.Так что это решение вполне допустимо.

Ваш код можно модифицировать таким образом:
Код
entity decoder is
    Port (
        ADR     : IN    std_logic_vector (2 downto 0);
        CS      : IN    std_logic;
        REG_WR  : OUT   std_logic_vector (7 downto 0)
    );
end decoder;

architecture Behavioral of decoder is

begin
    process( ADR, CS )
        variable i : integer;
    begin
        if CS='1' then
            for i in REG_WR'RANGE loop
                if i=CONV_INTEGER(ADR) then
                    REG_WR(i) <= '1';
                else
                    REG_WR(i) <= '0';
                end if;
            end loop;
        else
            REG_WR <= (others => '0');
        end if;
    end process;
end Behavioral;
Nuts
Скажите пожалуста.
Нужно менять один и тот же сигнал в разных процессах. В результате вылазит ошибка, чтото вроде"много источников на данный сигнал"- это то понятно. А есть какие механизмы с помощью которых можно управлять сигналом, из разных процессов? 05.gif
Ситуация вроде этой. Подскажите как быть 05.gif
Код
-----------------
signal s:bit;

1:process
begin
  if falling_edge(CLK)then s<='1'; end if;
end process;
------------------
2:process
begin
  if rising_edge(CLK)then s<='0'; end if;
end process;
-----------------
MrYuran
Если сигнал один и тот же и CLK один и тот же, то зачем делать 2 независимых процесса?
Я вообще плохо соображаю в разных там VHDL и иже с ними, и в конечном счёте всё равно перевожу мысленно в схематик. Чисто на пальцах у вас получается 2 источника сигнала, выведенных на 1 ногу. Надо их развязать как-то через логику (OR,AND,XOR,MUX и т.д.). Если действительно нужны 2 процесса (в чём я лично сомневаюсь)
Nuts
Это простой пример. Я пишу чтото вроде асинхронного FIFO, там такая вещь очень пригодилась бы. Да и сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно.
makc
Цитата(Nuts @ Aug 5 2008, 15:20) *
Скажите пожалуста.
Нужно менять один и тот же сигнал в разных процессах. В результате вылазит ошибка, чтото вроде"много источников на данный сигнал"- это то понятно. А есть какие механизмы с помощью которых можно управлять сигналом, из разных процессов? 05.gif
Ситуация вроде этой. Подскажите как быть 05.gif
Код
-----------------
signal s:bit;

1:process
begin
  if falling_edge(CLK)then s<='1'; end if;
end process;
------------------
2:process
begin
  if rising_edge(CLK)then s<='0'; end if;
end process;
-----------------


Что Вы хотите получить в результате? Если Вы хотите получить синтезируемое описание, то нужно исходить из ограничений целевой платформы (ПЛИС). Если целью является только моделирование, то можно написать так:
Код
-----------------
signal s:bit;

process(CLK)
begin
  if falling_edge(CLK)then s<='1'; end if;
  if rising_edge(CLK)then s<='0'; end if;
end process;
-----------------


Но это будет на 99% не синтезируемая конструкция, т.к. я не видел применения триггеров, работающих по обоим фронтам тактового сигнала.
ReedCat
Цитата(Nuts @ Aug 5 2008, 15:30) *
Да и сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно.


Уухх... А выключаются когда? Это намёк, что в рамках одного такта такое вряд ли удастся сделать.

А так - мультиплексор - есть такая штука, как раз для того, чтобы в один момент выдать один сигнал, а в другой - другой.

Только не забывайте о том, что мультиплексору тоже нужно время, чтобы переключиться... А управляющим сигналам на нём - время, чтобы установиться...

Вот и получится:
1 такт: поставили адрес входа 1 на мультиплексор
2 такт: переключили мультиплексор на вход 1
3 такт: выдали сигнал с входа 1 на выход
4 такт: поставили адрес входа 2 на мультиплексор
5 такт: переключили мультиплексор на вход 2
6 такт: выдали сигнал с входа 2 на выход
... и так далее...

А вы говорите: "один по фронту, другой по спаду" smile.gif
makc
Цитата(Nuts @ Aug 5 2008, 15:30) *
Это простой пример. Я пишу чтото вроде асинхронного FIFO, там такая вещь очень пригодилась бы. Да и сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно.


С точки зрения языка - конфликт налицо, т.к. происходит присваивание значений одному и тому же сигналу в двух разных параллельных процессах. То, что Вы понимаете невозможность одновременного фронта и спада одного и тоже же сигнала вовсе не означает, что это понимает синтезатор/средство моделирования. Нужно уметь им правильно объяснять, что Вы хотите получить. Учите язык.
o-henry
Цитата(Nuts @ Aug 5 2008, 13:30) *
сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно.

такого лучше не делать. далеко не во всех семействах ПЛИС есть триггеры, работающие по обоим фронтам.
и синтезатор Вас, скорее всего, не поймет.
Nuts
ReedCat спасибо. smile.gif

В FIFO данные записываются одним процессом с одной синхронизирующей частотой, а считываются другим процессом с другой синхронизирующей частотой. Причем эти частоты меняются. было бы замечательно если тот процесс который заполнил FIFo поставил флажок "1", а процесс который считывает, считал и убрал флажок в "0". 05.gif И желательно ПЛИС завести на этих синхронизирующих частотах, на какой нибудь из них. - такая задача.
ReedCat
Цитата(Nuts @ Aug 5 2008, 15:48) *
ReedCat спасибо. smile.gif

В FIFO данные записываются одним процессом с одной синхронизирующей частотой, а считываются другим процессом с другой синхронизирующей частотой. Причем эти частоты меняются. было бы замечательно если тот процесс который заполнил FIFo поставил флажок "1", а процесс который считывает, считал и убрал флажок в "0". 05.gif И желательно ПЛИС завести на этих синхронизирующих частотах, на какой нибудь из них. - такая задача.

Уууххх, ещё раз...

Асинхронное FIFO в полный рост... Берите примеры реализации и вдумчиво читайте...

Учтите, что если там обнаружится непонятный кусок кода, то это не значит, что он ненужный...
"Врубайтесь" до тех пор, пока не поймёте, а зачем он именно там и зачем сделано именно так.

Больше ничего посоветовать не могу, на пальцах это не объяснить, разбирайтесь (именно разбирайтесь, а не копируйте!) с примерами... Эта задачка - чуть ли не тест на все возможные грабли, её хорошо давать студентам, чтобы выяснить, понимают ли они что такое FPGA или так "мимо проходили" smile.gif
Maverick
Цитата(Nuts @ Aug 5 2008, 14:30) *
Это простой пример. Я пишу чтото вроде асинхронного FIFO, там такая вещь очень пригодилась бы. Да и сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно.


FIFO, двупортовую память и др. Вы коректно, можете не описать, эта тема обсуждалась уже на форуме. Лучше воспользуйтесь для его создания программой CoreGenerator для Xilinx или каким-то визардом если пишете в другом САПРе
BSV
Цитата(Maverick @ Aug 6 2008, 11:48) *
FIFO, двупортовую память и др. Вы коректно не опишете, эта тема обсуждалась уже на форуме.
Это с чего Вы взяли? Невозможно описать разве что память шириной не 2^x, а 2^x+2 (+1) и двухпортовую ROM (да и то в более свежих версиях софта от Xilinx это может быть пофиксено). А все остальное пожалуйста. Я, например, с успехом пользуюсь самописными параметризуемыми (глубина, ширина, тип памяти) модулями синхронного и асинхронного FIFO. И Вам советую...
Maverick
Цитата(BSV @ Aug 6 2008, 10:58) *
Это с чего Вы взяли? Невозможно описать разве что память шириной не 2^x, а 2^x+2 (+1) и двухпортовую ROM (да и то в более свежих версиях софта от Xilinx это может быть пофиксено). А все остальное пожалуйста. Я, например, с успехом пользуюсь самописными параметризуемыми (глубина, ширина, тип памяти) модулями синхронного и асинхронного FIFO. И Вам советую...


Может быть, я погорячился. Но смущает это:

http://electronix.ru/forum/index.php?showt...8&hl=Memory

http://electronix.ru/forum/index.php?showt...675&hl=FIFO

Кстати когда-то я пытался, сделать FIFO ручками с помощью рекомендаций Xilinx, но так и не получилось и где-то я читал (не помню) на форуме и мне старшие товарищи порекомендовали использовать все таки готовое! Может поделитесь опытом

http://electronix.ru/forum/index.php?showtopic=5242&hl=#

Цитата(BSV @ May 30 2005, 22:50) *
У Xilinx'а есть несколько xapp'ов, посвященных реализации синхронных (один клок на чтение и на запись) и асинхронных (разные клоки) FIFO на блочной и распределенной памяти, смотрите на их сайте (там есть и исходники для разных вариантов).
Флаги лучше применять регистровые - положительно скажется на частоте.

Кстати, исходники там довольно корявые (если их творчески переработать с использованием generate и констант в разрядности шин - они получаются более компактными и их легче модифицировать для разных задач). К сожалению с глубиной (особенно для асинхронных FIFO) все не так просто, поскольку для генерации флагов там применяются счетчики Грея.


как это "переработали с использованием generate и констант в разрядности шин" на языке VHDL?
BSV
Цитата(Maverick @ Aug 6 2008, 13:26) *
Про двухпортовую ROM я писал, что есть проблемы у синтезатора Xilinx, однако другие-то справляются (Synplify например) - значит рано или поздно и XST начнет корректно работать (особенно если Xilinx'у на мозги подавить). Но в FIFO Вам двухпортовая ROM на кой ляд?

Цитата(Maverick @ Aug 6 2008, 13:26) *
Кстати когда-то я пытался, сделать FIFO ручками с помощью рекомендаций Xilinx, но так и не получилось и где-то я читал (не помню) на форуме и мне старшие товарищи порекомендовали использовать все таки готовое! Может поделитесь опытом.
Да там собственно исходники есть и они вполне корректно работают - применял раньше, до того как параметризовал. Вот ссылки:
http://www.xilinx.com/bvdocs/appnotes/xapp258.zip
http://www.xilinx.com/bvdocs/appnotes/xapp691.zip (это новое, тут по идее уже параметризованное должно быть, не смотрел)

Цитата(Maverick @ Aug 6 2008, 13:26) *
как это "переработали с использованием generate и констант в разрядности шин" на языке VHDL?
Вот секция generic:
Код
generic (
  USE_RAM_SYLE : STRING := "distributed"; -- Возможные значения: "distributed", "block"
  USE_REG_OUT : STRING := "yes"; -- Возможные значения: "yes", "no"
  ADDR_WIDTH : INTEGER := 4; -- Ширина адресной шины
  DATA_WIDTH : INTEGER := 8 -- Ширина шины данных
);
При вставке примитивов использовал generate.
Maverick
Цитата(BSV @ Aug 6 2008, 13:17) *
Но в FIFO Вам двухпортовая ROM на кой ляд?


Я так понимаю, что двухпортовая ROM и является основным элементом, на основе(вокруг) которого все строится smile.gif
andrew_b
Цитата(Maverick @ Aug 6 2008, 14:31) *
Я так понимаю, что двухпортовая ROM и является основным элементом, на основе(вокруг) которого все строится smile.gif
ROM, RAM... Какая разница?..
С синтезом двухпортовой RAM всё нормально.
Nuts
Здраствуйте.
Скажите пожалуста, в PLIS архитектуры CPLD ( Xilinx семейство XC9500).
Данная PLIS выполнена по технологии FLASH, имеет не менее 10 тыс. циклов запись/стирание, возникает вопрос: Переменные в исполняемом модуле записываются/перезаписываются много раз, получается если переменная изменится более 10 тыс раз то PLIS умрет (например если цикл 0..10001)? 05.gif
Boris_TS
Цитата(Nuts @ Aug 12 2008, 21:05) *
Скажите пожалуста, в PLIS архитектуры CPLD ( Xilinx семейство XC9500).
Данная PLIS выполнена по технологии FLASH, имеет не менее 10 тыс. циклов запись/стирание, возникает вопрос: Переменные в исполняемом модуле записываются/перезаписываются много раз, получается если переменная изменится более 10 тыс раз то PLIS умрет (например если цикл 0..10001)? 05.gif

Нет, конечно. Во Flash памяти хранятся не переменные а "прошивка" (конфигурационная последовательность, которая является "программой" ПЛИС). А переменные храняться в триггерах - т.е. в элементарных ячейках статической памяти. Т.е. XC9500 имеет 10 тыс циклов перепрограммирования (смены прошивки), а в процессе работы ПЛИС переменные могут менять свои значения сколь угодно много раз.

ПЛИС - это русская аббревиатура (Программируемая Логическая Интегральная Схема - правда, лет 20 незад были "Полузаказные Л.И.С." - но время идет, а аббревиатура не меняется).
ПЛИС не может быть выполнена по технологии FLASH, просто у CPLD есть nonvolatile memory, сделанная на базе Flash памяти.
А вот FPGA (за исключением Actal и Spartan-3AN) имеют только volatile memory (Static RAM) для прошики, в которую необходимо записывать "прошивку" из внешней пямяти, после подачи питания на ПЛИС.
Nuts
Спасибо smile.gif
Nuts
В EDK, для КID на Virtex4, собрал BSP, установил ОС XilKernel, написал простенькое приложение для отправки UDP пакетов. Дело в том, что после компиляции всего этого, вылазит сообщение о том что, Ethernet IP ядро требует лицензию. Все это загружается и работает, но скорость по Ethernet очень маленькая, 20 Кбит/с (ожидаемая не менее 400 Мбит/c, ну хотябы 100 набрать). Может скорость по Ethernet быть ограничена, всвязи с отсутствием лицензии на IP ядро? Может кто сталкивался с подобной ситуацией. 05.gif
dvladim
Цитата(Boris_TS @ Aug 12 2008, 23:08) *
ПЛИС - это русская аббревиатура (Программируемая Логическая Интегральная Схема - правда, лет 20 незад были "Полузаказные Л.И.С." - но время идет, а аббревиатура не меняется).

Полузаказные обычно назывались БМК (Базовый матричный кристалл).
Timonnn
Цитата(Nuts @ Aug 13 2008, 19:47) *
В EDK, для КID на Virtex4, собрал BSP, установил ОС XilKernel, написал простенькое приложение для отправки UDP пакетов. Дело в том, что после компиляции всего этого, вылазит сообщение о том что, Ethernet IP ядро требует лицензию. Все это загружается и работает, но скорость по Ethernet очень маленькая, 20 Кбит/с (ожидаемая не менее 400 Мбит/c, ну хотябы 100 набрать). Может скорость по Ethernet быть ограничена, всвязи с отсутствием лицензии на IP ядро? Может кто сталкивался с подобной ситуацией. 05.gif


подскажи подробнее, пожалуйста, как ты генерировал ядро для езернета - тоже интересует данный вопрос, только пишу езернет на Спартане-3Е

Спасибо.
Boris_TS
Цитата(dvladim @ Aug 13 2008, 21:45) *
Полузаказные обычно назывались БМК (Базовый матричный кристалл).

Да, есть и БМК, но это несколько другие изделия. Обратитесь к истории (проверьте по тому же Белорусскому Интегралу), в 80-х (т.е. лет 25-30 назад, а не 20 как я указал выше - ошибся: постарел лет на семь и даже не заметил как) были также и ПЛИС (в смысле полузаказных). До недавнего времени (а может и сейчас тоже, но в меньшей степени) среди ПЛИС были hardwire продукты - однократного программирования; вот полузаказнухи и "полузаказывались" на уровне логики, а в БМК (как я знаю) "полузаказывается" на уровне транзисторов, т.е. в БМК можно собирать как цифровые, так и аналоговые узлы, что позволяет делать на БМК очень интересные (эксклюзивные) устройства.
MrYuran
Цитата(Boris_TS @ Aug 14 2008, 13:08) *
в БМК можно собирать как цифровые, так и аналоговые узлы, что позволяет делать на БМК очень интересные (эксклюзивные) устройства.

можно-то можно... только жутко дорого. И цена ошибки очень высока...
Boris_TS
Цитата(MrYuran @ Aug 14 2008, 17:03) *
можно-то можно... только жутко дорого. И цена ошибки очень высока...

Заранее извиняюсь за offtopic. С дороговизной БМК и ценой ошибки полностью согласен. Но знаю прецеденты сборки схем на БМК, содержащих одновременно как многовходовые операционные усилители (6-8 входов и кучи обратных связей, позволяющих значительно уменьшить влияние деградации кристалла – например, от ионизирующего излучения), так и простенького цифрового интерфейсика.
Nuts
Цитата(Timonnn @ Aug 14 2008, 12:34) *
подскажи подробнее, пожалуйста, как ты генерировал ядро для езернета - тоже интересует данный вопрос, только пишу езернет на Спартане-3Е


Ehternet IP ядро подключил с помощью визарда, в EDK 9.2 уже готовое есть, но без лицензии.
С помощью визарда в EDK 9.2 прикрутил на отладочную плату, необходимые ядра. ОС установил Xilkernel , подключил библиотеки xilmfs и lwip. Затем добавил следующий application, для отправки UDP пакетов, вот кому интересно:

Код
#include <stdio.h>
#include "xenv_standalone.h"
#include "xparameters.h"
#include "netif/xadapter.h"
#include <string.h>
#include "xmk.h"
#include "lwip/inet.h"
#include "lwip/sockets.h"
#include "lwipopts.h"
#ifdef XPAR_ETHERNET_MAC_BASEADDR
#define EMAC_BASEADDR  XPAR_ETHERNET_MAC_BASEADDR
#elif XPAR_LLTEMAC_0_BASEADDR
#define EMAC_BASEADDR  XPAR_LLTEMAC_0_BASEADDR
//#else
//#error
#endif
/* list of applications to be included */
#define APP_TXPERF
void
print_ip(char *msg, struct ip_addr *ip)
{
    print(msg);
    xil_printf("%d.%d.%d.%d\n\r", ip4_addr1(ip), ip4_addr2(ip),
            ip4_addr3(ip), ip4_addr4(ip));
}
void
print_ip_settings(struct ip_addr *ip, struct ip_addr *mask, struct ip_addr *gw)
{
    print_ip("Board IP: ", ip);
    print_ip("Netmask : ", mask);
    print_ip("Gateway : ", gw);
}
int main()
{
    xilkernel_main();
}
int tx_application_thread_my()
{
    int sock_my,i;
    struct sockaddr_in address;
    char buf[50000];
    /* initialize file system layer */
//    platform_init_fs();
    /* initialize devices */
    //platform_init_gpios();
    for(i=0;i<=50000;i++) buf[i]='r';
    if ((sock_my = lwip_socket(AF_INET, SOCK_DGRAM, 0)) < 0)    return;
    address.sin_family = AF_INET;
    address.sin_port = htons(3425);
    address.sin_addr.s_addr = inet_addr("192.168.0.215");
    if (lwip_bind(sock_my, (struct sockaddr *)&address, sizeof (address)) < 0)        return;
            while(1)  {
        lwip_sendto(sock_my, buf, sizeof(buf), 0,(struct sockaddr *)&address, sizeof(address));
    }
        lwip_close(sock_my);
}
//void tx_application_thread_my();
void tx_application_thread();
//void rx_application_thread();
struct netif server_netif;
char buf_sdram[16*1024*1024];
int network_thread()
{
    struct netif *netif;
    struct ip_addr ipaddr, netmask, gw;
    /* the mac address of the board. this should be unique per board */
    unsigned char mac_ethernet_address[] = { 0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };
    netif = &server_netif;
    /* initliaze IP addresses to be used */
    IP4_ADDR(&ipaddr,  192, 168,   0, 51);
    IP4_ADDR(&netmask, 255, 255, 255,  0);
    IP4_ADDR(&gw,      192, 168,   0,  215);
    /* print out IP settings of the board */
    print("\n\r\n\r");
    print_ip_settings(&ipaddr, &netmask, &gw);
    if (!xemac_add(netif, &ipaddr, &netmask, &gw, mac_ethernet_address, EMAC_BASEADDR)) {
        xil_printf("Error adding N/W interface\n\r");
        return -1;
    }
    netif_set_default(netif);
    /* specify that the network if is up */
    netif_set_up(netif);
    /* start packet receive thread - required for lwIP operation */
      sys_thread_new(xemacif_input_thread, netif, DEFAULT_THREAD_PRIO);
    /* now we can start application threads */
#ifdef APP_TXPERF
    /* start txperf thread */
    sys_thread_new(tx_application_thread_my, 0, DEFAULT_THREAD_PRIO);
#endif
    return 0;
}
int main_thread()
{
    /* initialize lwIP before calling sys_thread_new */
    lwip_init();
    /* any thread using lwIP should be created using sys_thread_new */
      sys_thread_new(network_thread, NULL, DEFAULT_THREAD_PRIO);
    return 0;
}


05.gif
DiWhite
Начинаю работать с ethernet на Spartsn 6. Сделал как описано, но SDK выдает ошибки

Подскажите, что не так? Работаю в Xilinx 12.2.
Ниже прилепил mhs и mss файлы проекта.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.