|
|
 |
Ответов
(1 - 47)
|
Jul 26 2008, 12:29
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(Nuts @ Jul 26 2008, 16:12)  Здравствуйте!!! Скажите пожалуйста, можно средствами ISE посмотреть за сколько тактов выполнится программа? О какой программе Вы говорите? Если Вы имеете в виду получение результата на выходе Вашего модуля (проекта), то ISE этим не занимается, т.к. не знает логики работы модуля и воздействий, которые будут производиться на модуль. Но Вы можете воспользоваться встроенным в ISE симулятором или каким-нибудь внешним симулятором, чтобы промоделировать проект и узнать, за какое время появляется требуемый результат при заданных входных воздействиях.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Jul 26 2008, 12:49
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

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

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

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

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

|
Цитата(makc @ Jul 26 2008, 19:50)  Если весь модуль состоит из одного процесса, то, понимая логику его работы (ведь Вы его создатель), не составит большого труда посчитать время его выполнения. Я вот новичок, может глупости спрашиваю С логикой понятно, а вот например на присвоение значения переменной сколько тактов тратится? С кодом чуть позже, мне его восстановить надо  например : Код .... I,x,b:integer; ... I:=100; b:=300; x:=65; ... за один такт выполнится?
Сообщение отредактировал Nuts - Jul 26 2008, 13:00
|
|
|
|
|
Jul 26 2008, 14:48
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Если после присвоения переменной Вы будете ее использовать где-то дальше в теле процесса, то использоваться будет новое, присвоенное значение. Т.е. можно считать, что оно присваивается в том же такте. На примере это выглядит так: Код .... variable a,b,c:integer; ... a:=1; b:=2; c:=a+b; ... с станет равной 3 в том же такте, что и будет выполнено присвоение a и b.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Jul 27 2008, 04:00
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

|
А если такой случай где будет счетчик например: Код variable a,b,c:integer; ... a:=1; b:=b+1; --счетчик c:=a+b; Тоже за один такт выполнится?
Сообщение отредактировал Nuts - Jul 27 2008, 04:01
|
|
|
|
|
Jul 27 2008, 06:01
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(Nuts @ Jul 27 2008, 08:00)  А если такой случай где будет счетчик например: Код variable a,b,c:integer; ... a:=1; b:=b+1; --счетчик c:=a+b; Тоже за один такт выполнится?  Да. Но это только в случае, если a и b - variables. Если они signals, то будет по-другому. Почитайте любую книгу по VHDL. Все возможные варианты на примерах не рассмотришь, нужно понимание общих принципов.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Jul 27 2008, 16:32
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

|
Maverick, хорошо я запомню  . Есть вопрос Пример: Код .......... .......... 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 изменились одновременно? Если можно напишите примерчик
Сообщение отредактировал Nuts - Jul 27 2008, 16:37
|
|
|
|
|
Jul 27 2008, 17:57
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(Nuts @ Jul 27 2008, 20:32)  В примере сначала изменится порт LED_1 на '0', затем изменится LED_2 на '0', а можно как нибудь прописать чтобы в процессе LED_1 и LED_2 изменились одновременно? Если можно напишите примерчик  Что значит одновременно в Вашем понимании? Если "одновременно", значит "по какому-то событию", то соответствующий сигнал должен быть указан в списке чувствительности процесса. И тогда активация процесса будет привязана к конкретным событиям в модуле. Но, в любом случае, в приведенном примере изменение произойдет в один и тот же момент времени.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Jul 28 2008, 04:51
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

|
makc Если писать команды в теле самого модуля то они будут выполняться параллельно, чтобы команды выполнять последовательно нужно создать процесс и в нем писать команды. Так как у меня в примере LED_1 и LED_2 находятся в процессе и выполняются по одному событию, но сначала изменится состояние LED_1 а затем изменится состояние LED_2 - так как в процессе команды выполняются последовательно. А если нужно чтобы они выполнились параллельно, как выполняются команды в теле модуля? Может можно написать что-то вроде :LED_1,LED_2<='0' , чтобы сигнал одновременно полетел на 2 порта сразу LED_1 и LED_2. PS: ушел читать VHDL
Сообщение отредактировал Nuts - Jul 28 2008, 04:53
|
|
|
|
|
Jul 28 2008, 08:49
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(Nuts @ Jul 28 2008, 08:51)  makc Если писать команды в теле самого модуля то они будут выполняться параллельно, чтобы команды выполнять последовательно нужно создать процесс и в нем писать команды. Нет, не так. Поскольку Вы описываете логику работы схемы, то понятие команд в данном случае вообще не применимо. Можно говорить только о конструкциях языка описания, которые бывают параллельные и последовательные. Но, при этом, их названия непосредственно не связаны с порядком выполнения этих конструкций, т.к. он в каждом случае определяется условиями использования каждой из этих конструкций. Поэтому несмотря на то, что у Вас присваивания LED_1 и LED_2 записаны в теле процесса последовательно, с точки зрения аппаратуры (и, естественно, симулятора) они будут выполнены одновременно, т.е. "параллельно". Вот такой парадокс. Учите матчасть. Разберитесь с осноными понятиями HDL.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Jul 31 2008, 18:12
|

Гуру
     
Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591

|
У меня тоже вопрос : "Как приделать к дешифратору Чип Селект?" Придумал добавить еще один разряд, а как правильно? Код 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;
|
|
|
|
|
Jul 31 2008, 18:43
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(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;
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Aug 5 2008, 11:20
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

|
Скажите пожалуста. Нужно менять один и тот же сигнал в разных процессах. В результате вылазит ошибка, чтото вроде"много источников на данный сигнал"- это то понятно. А есть какие механизмы с помощью которых можно управлять сигналом, из разных процессов?  Ситуация вроде этой. Подскажите как быть Код ----------------- 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; -----------------
Сообщение отредактировал Nuts - Aug 5 2008, 11:23
|
|
|
|
|
Aug 5 2008, 11:30
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

|
Это простой пример. Я пишу чтото вроде асинхронного FIFO, там такая вещь очень пригодилась бы. Да и сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно.
Сообщение отредактировал Nuts - Aug 5 2008, 11:33
|
|
|
|
|
Aug 5 2008, 11:38
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(Nuts @ Aug 5 2008, 15:20)  Скажите пожалуста. Нужно менять один и тот же сигнал в разных процессах. В результате вылазит ошибка, чтото вроде"много источников на данный сигнал"- это то понятно. А есть какие механизмы с помощью которых можно управлять сигналом, из разных процессов? Ситуация вроде этой. Подскажите как быть Код ----------------- 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% не синтезируемая конструкция, т.к. я не видел применения триггеров, работающих по обоим фронтам тактового сигнала.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Aug 5 2008, 11:38
|

Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 14-01-08
Из: Москва
Пользователь №: 34 069

|
Цитата(Nuts @ Aug 5 2008, 15:30)  Да и сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно. Уухх... А выключаются когда? Это намёк, что в рамках одного такта такое вряд ли удастся сделать. А так - мультиплексор - есть такая штука, как раз для того, чтобы в один момент выдать один сигнал, а в другой - другой. Только не забывайте о том, что мультиплексору тоже нужно время, чтобы переключиться... А управляющим сигналам на нём - время, чтобы установиться... Вот и получится: 1 такт: поставили адрес входа 1 на мультиплексор 2 такт: переключили мультиплексор на вход 1 3 такт: выдали сигнал с входа 1 на выход 4 такт: поставили адрес входа 2 на мультиплексор 5 такт: переключили мультиплексор на вход 2 6 такт: выдали сигнал с входа 2 на выход ... и так далее... А вы говорите: "один по фронту, другой по спаду"
|
|
|
|
|
Aug 5 2008, 11:41
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(Nuts @ Aug 5 2008, 15:30)  Это простой пример. Я пишу чтото вроде асинхронного FIFO, там такая вещь очень пригодилась бы. Да и сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно. С точки зрения языка - конфликт налицо, т.к. происходит присваивание значений одному и тому же сигналу в двух разных параллельных процессах. То, что Вы понимаете невозможность одновременного фронта и спада одного и тоже же сигнала вовсе не означает, что это понимает синтезатор/средство моделирования. Нужно уметь им правильно объяснять, что Вы хотите получить. Учите язык.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Aug 5 2008, 11:42
|

Местный
  
Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069

|
Цитата(Nuts @ Aug 5 2008, 13:30)  сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно. такого лучше не делать. далеко не во всех семействах ПЛИС есть триггеры, работающие по обоим фронтам. и синтезатор Вас, скорее всего, не поймет.
|
|
|
|
|
Aug 5 2008, 11:48
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

|
ReedCat спасибо. В FIFO данные записываются одним процессом с одной синхронизирующей частотой, а считываются другим процессом с другой синхронизирующей частотой. Причем эти частоты меняются. было бы замечательно если тот процесс который заполнил FIFo поставил флажок "1", а процесс который считывает, считал и убрал флажок в "0".  И желательно ПЛИС завести на этих синхронизирующих частотах, на какой нибудь из них. - такая задача.
Сообщение отредактировал Nuts - Aug 5 2008, 11:55
|
|
|
|
|
Aug 5 2008, 12:11
|

Частый гость
 
Группа: Свой
Сообщений: 109
Регистрация: 14-01-08
Из: Москва
Пользователь №: 34 069

|
Цитата(Nuts @ Aug 5 2008, 15:48)  ReedCat спасибо. В FIFO данные записываются одним процессом с одной синхронизирующей частотой, а считываются другим процессом с другой синхронизирующей частотой. Причем эти частоты меняются. было бы замечательно если тот процесс который заполнил FIFo поставил флажок "1", а процесс который считывает, считал и убрал флажок в "0".  И желательно ПЛИС завести на этих синхронизирующих частотах, на какой нибудь из них. - такая задача. Уууххх, ещё раз... Асинхронное FIFO в полный рост... Берите примеры реализации и вдумчиво читайте... Учтите, что если там обнаружится непонятный кусок кода, то это не значит, что он ненужный... "Врубайтесь" до тех пор, пока не поймёте, а зачем он именно там и зачем сделано именно так. Больше ничего посоветовать не могу, на пальцах это не объяснить, разбирайтесь (именно разбирайтесь, а не копируйте!) с примерами... Эта задачка - чуть ли не тест на все возможные грабли, её хорошо давать студентам, чтобы выяснить, понимают ли они что такое FPGA или так "мимо проходили"
|
|
|
|
|
Aug 6 2008, 07:48
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(Nuts @ Aug 5 2008, 14:30)  Это простой пример. Я пишу чтото вроде асинхронного FIFO, там такая вещь очень пригодилась бы. Да и сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно. FIFO, двупортовую память и др. Вы коректно, можете не описать, эта тема обсуждалась уже на форуме. Лучше воспользуйтесь для его создания программой CoreGenerator для Xilinx или каким-то визардом если пишете в другом САПРе
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Aug 6 2008, 07:58
|

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

|
Цитата(Maverick @ Aug 6 2008, 11:48)  FIFO, двупортовую память и др. Вы коректно не опишете, эта тема обсуждалась уже на форуме. Это с чего Вы взяли? Невозможно описать разве что память шириной не 2^x, а 2^x+2 (+1) и двухпортовую ROM (да и то в более свежих версиях софта от Xilinx это может быть пофиксено). А все остальное пожалуйста. Я, например, с успехом пользуюсь самописными параметризуемыми (глубина, ширина, тип памяти) модулями синхронного и асинхронного FIFO. И Вам советую...
--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
|
|
|
|
|
Aug 6 2008, 09:26
|

я только учусь...
     
Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839

|
Цитата(BSV @ Aug 6 2008, 10:58)  Это с чего Вы взяли? Невозможно описать разве что память шириной не 2^x, а 2^x+2 (+1) и двухпортовую ROM (да и то в более свежих версиях софта от Xilinx это может быть пофиксено). А все остальное пожалуйста. Я, например, с успехом пользуюсь самописными параметризуемыми (глубина, ширина, тип памяти) модулями синхронного и асинхронного FIFO. И Вам советую... Может быть, я погорячился. Но смущает это: http://electronix.ru/forum/index.php?showt...8&hl=Memoryhttp://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?
--------------------
If it doesn't work in simulation, it won't work on the board.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Aug 6 2008, 10:17
|

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

|
Цитата(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.ziphttp://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.
--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
|
|
|
|
|
Aug 12 2008, 17:05
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

|
Здраствуйте. Скажите пожалуста, в PLIS архитектуры CPLD ( Xilinx семейство XC9500). Данная PLIS выполнена по технологии FLASH, имеет не менее 10 тыс. циклов запись/стирание, возникает вопрос: Переменные в исполняемом модуле записываются/перезаписываются много раз, получается если переменная изменится более 10 тыс раз то PLIS умрет (например если цикл 0..10001)?
|
|
|
|
|
Aug 12 2008, 19:08
|
Злополезный
   
Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188

|
Цитата(Nuts @ Aug 12 2008, 21:05)  Скажите пожалуста, в PLIS архитектуры CPLD ( Xilinx семейство XC9500). Данная PLIS выполнена по технологии FLASH, имеет не менее 10 тыс. циклов запись/стирание, возникает вопрос: Переменные в исполняемом модуле записываются/перезаписываются много раз, получается если переменная изменится более 10 тыс раз то PLIS умрет (например если цикл 0..10001)?  Нет, конечно. Во Flash памяти хранятся не переменные а "прошивка" (конфигурационная последовательность, которая является "программой" ПЛИС). А переменные храняться в триггерах - т.е. в элементарных ячейках статической памяти. Т.е. XC9500 имеет 10 тыс циклов перепрограммирования (смены прошивки), а в процессе работы ПЛИС переменные могут менять свои значения сколь угодно много раз. ПЛИС - это русская аббревиатура (Программируемая Логическая Интегральная Схема - правда, лет 20 незад были "Полузаказные Л.И.С." - но время идет, а аббревиатура не меняется). ПЛИС не может быть выполнена по технологии FLASH, просто у CPLD есть nonvolatile memory, сделанная на базе Flash памяти. А вот FPGA (за исключением Actal и Spartan-3AN) имеют только volatile memory (Static RAM) для прошики, в которую необходимо записывать "прошивку" из внешней пямяти, после подачи питания на ПЛИС.
|
|
|
|
|
Aug 13 2008, 16:47
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

|
В EDK, для КID на Virtex4, собрал BSP, установил ОС XilKernel, написал простенькое приложение для отправки UDP пакетов. Дело в том, что после компиляции всего этого, вылазит сообщение о том что, Ethernet IP ядро требует лицензию. Все это загружается и работает, но скорость по Ethernet очень маленькая, 20 Кбит/с (ожидаемая не менее 400 Мбит/c, ну хотябы 100 набрать). Может скорость по Ethernet быть ограничена, всвязи с отсутствием лицензии на IP ядро? Может кто сталкивался с подобной ситуацией.
|
|
|
|
|
Aug 14 2008, 05:34
|
Группа: Новичок
Сообщений: 10
Регистрация: 22-04-08
Пользователь №: 36 987

|
Цитата(Nuts @ Aug 13 2008, 19:47)  В EDK, для КID на Virtex4, собрал BSP, установил ОС XilKernel, написал простенькое приложение для отправки UDP пакетов. Дело в том, что после компиляции всего этого, вылазит сообщение о том что, Ethernet IP ядро требует лицензию. Все это загружается и работает, но скорость по Ethernet очень маленькая, 20 Кбит/с (ожидаемая не менее 400 Мбит/c, ну хотябы 100 набрать). Может скорость по Ethernet быть ограничена, всвязи с отсутствием лицензии на IP ядро? Может кто сталкивался с подобной ситуацией.  подскажи подробнее, пожалуйста, как ты генерировал ядро для езернета - тоже интересует данный вопрос, только пишу езернет на Спартане-3Е Спасибо.
|
|
|
|
|
Aug 14 2008, 09:08
|
Злополезный
   
Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188

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

Группа: Новичок
Сообщений: 28
Регистрация: 21-07-08
Пользователь №: 39 128

|
Цитата(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; }
Сообщение отредактировал Nuts - Aug 14 2008, 17:41
|
|
|
|
|
Mar 9 2011, 19:09
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 5-10-10
Пользователь №: 59 952

|
Начинаю работать с ethernet на Spartsn 6. Сделал как описано, но SDK выдает ошибки  Подскажите, что не так? Работаю в Xilinx 12.2. Ниже прилепил mhs и mss файлы проекта.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|