реклама на сайте
подробности

 
 
> Освоение ISE
Nuts
сообщение Jul 26 2008, 12:12
Сообщение #1


Участник
*

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



Здравствуйте!!!
Написал в ISE программу для ПЛИС XILINX на VHDL, программа состоит из одного процесса.
Скажите пожалуйста, можно средствами ISE посмотреть за сколько тактов выполнится программа, тоесть процесс?

Сообщение отредактировал Nuts - Jul 26 2008, 12:29
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 47)
makc
сообщение Jul 26 2008, 12:29
Сообщение #2


Гуру
******

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



Цитата(Nuts @ Jul 26 2008, 16:12) *
Здравствуйте!!!
Скажите пожалуйста, можно средствами ISE посмотреть за сколько тактов выполнится программа?


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


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Jul 26 2008, 12:49
Сообщение #3


Участник
*

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



Спасибо. За совет.

makc
Программа такая, по последовательной шине принимаю данные, накапливаю их до 16-ти бит и выбрасываю по параллельной 16-ти разрядной шине.
Мне нужно за 16 тактов: накопить 16 бит и выбросить из в параллельную шину(я хочу главным генератором ПЛИС назначить генератор последовательной шины.).
Вот интересно при обращении к переменным: сложение, вычитание сколько тактов тратится? 05.gif
Go to the top of the page
 
+Quote Post
makc
сообщение Jul 26 2008, 12:51
Сообщение #4


Гуру
******

Группа: Админы
Сообщений: 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 бит и выбросить из в параллельную шину(я хочу главным генератором ПЛИС назначить генератор последовательной шины.).
Вот интересно при обращении к переменным: сложение, вычитание сколько тактов тратится? 05.gif


Приведите пример кода.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Jul 26 2008, 13:06
Сообщение #5


Участник
*

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



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


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

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

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

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


за один такт выполнится?

Сообщение отредактировал Nuts - Jul 26 2008, 13:00
Go to the top of the page
 
+Quote Post
makc
сообщение Jul 26 2008, 14:48
Сообщение #6


Гуру
******

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



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

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


с станет равной 3 в том же такте, что и будет выполнено присвоение a и b.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Jul 27 2008, 04:00
Сообщение #7


Участник
*

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



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


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

Сообщение отредактировал Nuts - Jul 27 2008, 04:01
Go to the top of the page
 
+Quote Post
makc
сообщение Jul 27 2008, 06:01
Сообщение #8


Гуру
******

Группа: Админы
Сообщений: 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;


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


Да. Но это только в случае, если a и b - variables. Если они signals, то будет по-другому. Почитайте любую книгу по VHDL. Все возможные варианты на примерах не рассмотришь, нужно понимание общих принципов.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Jul 27 2008, 07:22
Сообщение #9


Участник
*

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



Makс, пасибо вы очень помогли. smile.gif

Сообщение отредактировал Nuts - Jul 27 2008, 07:22
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 27 2008, 10:26
Сообщение #10


я только учусь...
******

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



Цитата(Nuts @ Jul 27 2008, 07:00) *
А если такой случай где будет счетчик например:
Код
variable a,b,c:integer;
...
a:=1;
b:=b+1;   --счетчик
c:=a+b;


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


Только здесь вместо счетчика у Вас будет 32 разрядный сумматор sad.gif


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Nuts
сообщение Jul 27 2008, 16:32
Сообщение #11


Участник
*

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



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

Сообщение отредактировал Nuts - Jul 27 2008, 16:37
Go to the top of the page
 
+Quote Post
makc
сообщение Jul 27 2008, 17:57
Сообщение #12


Гуру
******

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



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


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


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
CaPpuCcino
сообщение Jul 27 2008, 18:10
Сообщение #13


тоже уже Гуру
******

Группа: Свой
Сообщений: 2 047
Регистрация: 13-06-05
Из: Кёлн - Санкт-Петербург
Пользователь №: 5 973



я бы предложил товарищу вопрошающему всё-таки сначала ознакомиться с осносами языков описания аппаратуры и проектированию с их помощью цифровых систем. для начинающих есть большой спектр литературы на русском. а потом уже если будут оставаться какие-то неясности задать соотв. вопр.


--------------------
И снова на арене цирка - дрессированные клоуны!! Оказываем консультации по электронике за симпу круглосуточно.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Jul 28 2008, 04:51
Сообщение #14


Участник
*

Группа: Новичок
Сообщений: 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 05.gif

Сообщение отредактировал Nuts - Jul 28 2008, 04:53
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jul 28 2008, 05:41
Сообщение #15


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Вот к чему приводит непонимание основ...
"Программа для ПЛИС на VHDL"...
Никакая это на самом деле не программа, а конфигурация железа, записанная алгоритмическим языком. И то, что "команды" записаны друг за другом, совсем не определяет порядок их "выполнения".
Может, лучше начать со схемного ввода, пока ясность не наступит?
Основная идея - ПЛИС - это не процессор, и "программу" не "выполняет". А функционирует как цифровой автомат, логика которого задаётся конфигурацией.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
makc
сообщение Jul 28 2008, 08:49
Сообщение #16


Гуру
******

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



Цитата(Nuts @ Jul 28 2008, 08:51) *
makc
Если писать команды в теле самого модуля то они будут выполняться параллельно, чтобы команды выполнять последовательно нужно создать процесс и в нем писать команды.


Нет, не так. Поскольку Вы описываете логику работы схемы, то понятие команд в данном случае вообще не применимо. Можно говорить только о конструкциях языка описания, которые бывают параллельные и последовательные. Но, при этом, их названия непосредственно не связаны с порядком выполнения этих конструкций, т.к. он в каждом случае определяется условиями использования каждой из этих конструкций. Поэтому несмотря на то, что у Вас присваивания LED_1 и LED_2 записаны в теле процесса последовательно, с точки зрения аппаратуры (и, естественно, симулятора) они будут выполнены одновременно, т.е. "параллельно". Вот такой парадокс. Учите матчасть. Разберитесь с осноными понятиями HDL.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Jul 28 2008, 10:25
Сообщение #17


Участник
*

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



Теперь понятно. Я действительно думал что ПЛИС-процессор, и что я программю а не конфигурирую железо. 05.gif

Сообщение отредактировал Nuts - Jul 28 2008, 10:31
Go to the top of the page
 
+Quote Post
Nuts
сообщение Jul 31 2008, 03:31
Сообщение #18


Участник
*

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



Что такое макроячейка? 05.gif

Сообщение отредактировал Nuts - Jul 31 2008, 03:33
Go to the top of the page
 
+Quote Post
makc
сообщение Jul 31 2008, 05:56
Сообщение #19


Гуру
******

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



Цитата(Nuts @ Jul 31 2008, 07:31) *
Что такое макроячейка? 05.gif


Почитайте http://en.wikipedia.org/wiki/Field-programmable_gate_array для общего развития.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Jul 31 2008, 15:49
Сообщение #20


Участник
*

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



Спасибо. smile.gif
Go to the top of the page
 
+Quote Post
muravei
сообщение Jul 31 2008, 18:12
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 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;
Go to the top of the page
 
+Quote Post
makc
сообщение Jul 31 2008, 18:43
Сообщение #22


Гуру
******

Группа: Админы
Сообщений: 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
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Aug 5 2008, 11:20
Сообщение #23


Участник
*

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



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


Сообщение отредактировал Nuts - Aug 5 2008, 11:23
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 5 2008, 11:28
Сообщение #24


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Если сигнал один и тот же и CLK один и тот же, то зачем делать 2 независимых процесса?
Я вообще плохо соображаю в разных там VHDL и иже с ними, и в конечном счёте всё равно перевожу мысленно в схематик. Чисто на пальцах у вас получается 2 источника сигнала, выведенных на 1 ногу. Надо их развязать как-то через логику (OR,AND,XOR,MUX и т.д.). Если действительно нужны 2 процесса (в чём я лично сомневаюсь)


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Nuts
сообщение Aug 5 2008, 11:30
Сообщение #25


Участник
*

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



Это простой пример. Я пишу чтото вроде асинхронного FIFO, там такая вещь очень пригодилась бы. Да и сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно.

Сообщение отредактировал Nuts - Aug 5 2008, 11:33
Go to the top of the page
 
+Quote Post
makc
сообщение Aug 5 2008, 11:38
Сообщение #26


Гуру
******

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



Цитата(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% не синтезируемая конструкция, т.к. я не видел применения триггеров, работающих по обоим фронтам тактового сигнала.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
ReedCat
сообщение Aug 5 2008, 11:38
Сообщение #27


Частый гость
**

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



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


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

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

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

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

А вы говорите: "один по фронту, другой по спаду" smile.gif
Go to the top of the page
 
+Quote Post
makc
сообщение Aug 5 2008, 11:41
Сообщение #28


Гуру
******

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



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


С точки зрения языка - конфликт налицо, т.к. происходит присваивание значений одному и тому же сигналу в двух разных параллельных процессах. То, что Вы понимаете невозможность одновременного фронта и спада одного и тоже же сигнала вовсе не означает, что это понимает синтезатор/средство моделирования. Нужно уметь им правильно объяснять, что Вы хотите получить. Учите язык.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
o-henry
сообщение Aug 5 2008, 11:42
Сообщение #29


Местный
***

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



Цитата(Nuts @ Aug 5 2008, 13:30) *
сигналы выводятся на одну ножку в разное время, один на спаде фронта, другой на подъеме- т.е. вроде конфликта быть не должно.

такого лучше не делать. далеко не во всех семействах ПЛИС есть триггеры, работающие по обоим фронтам.
и синтезатор Вас, скорее всего, не поймет.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Aug 5 2008, 11:48
Сообщение #30


Участник
*

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



ReedCat спасибо. smile.gif

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

Сообщение отредактировал Nuts - Aug 5 2008, 11:55
Go to the top of the page
 
+Quote Post
ReedCat
сообщение Aug 5 2008, 12:11
Сообщение #31


Частый гость
**

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



Цитата(Nuts @ Aug 5 2008, 15:48) *
ReedCat спасибо. smile.gif

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

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

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

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

Больше ничего посоветовать не могу, на пальцах это не объяснить, разбирайтесь (именно разбирайтесь, а не копируйте!) с примерами... Эта задачка - чуть ли не тест на все возможные грабли, её хорошо давать студентам, чтобы выяснить, понимают ли они что такое FPGA или так "мимо проходили" smile.gif
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 6 2008, 07:48
Сообщение #32


я только учусь...
******

Группа: Модераторы
Сообщений: 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.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
BSV
сообщение Aug 6 2008, 07:58
Сообщение #33


Знающий
****

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



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


--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 6 2008, 09:26
Сообщение #34


я только учусь...
******

Группа: Модераторы
Сообщений: 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=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?


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
BSV
сообщение Aug 6 2008, 10:17
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 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.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.


--------------------
Дурак, занимающий высокий пост, подобен человеку на вершине горы - все ему кажется маленьким, а всем остальным кажется маленьким он сам. /Законы Мерфи/
Go to the top of the page
 
+Quote Post
Maverick
сообщение Aug 6 2008, 10:31
Сообщение #36


я только учусь...
******

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



Цитата(BSV @ Aug 6 2008, 13:17) *
Но в FIFO Вам двухпортовая ROM на кой ляд?


Я так понимаю, что двухпортовая ROM и является основным элементом, на основе(вокруг) которого все строится smile.gif


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Aug 6 2008, 10:34
Сообщение #37


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Maverick @ Aug 6 2008, 14:31) *
Я так понимаю, что двухпортовая ROM и является основным элементом, на основе(вокруг) которого все строится smile.gif
ROM, RAM... Какая разница?..
С синтезом двухпортовой RAM всё нормально.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Aug 12 2008, 17:05
Сообщение #38


Участник
*

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



Здраствуйте.
Скажите пожалуста, в PLIS архитектуры CPLD ( Xilinx семейство XC9500).
Данная PLIS выполнена по технологии FLASH, имеет не менее 10 тыс. циклов запись/стирание, возникает вопрос: Переменные в исполняемом модуле записываются/перезаписываются много раз, получается если переменная изменится более 10 тыс раз то PLIS умрет (например если цикл 0..10001)? 05.gif
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Aug 12 2008, 19:08
Сообщение #39


Злополезный
****

Группа: Свой
Сообщений: 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)? 05.gif

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

ПЛИС - это русская аббревиатура (Программируемая Логическая Интегральная Схема - правда, лет 20 незад были "Полузаказные Л.И.С." - но время идет, а аббревиатура не меняется).
ПЛИС не может быть выполнена по технологии FLASH, просто у CPLD есть nonvolatile memory, сделанная на базе Flash памяти.
А вот FPGA (за исключением Actal и Spartan-3AN) имеют только volatile memory (Static RAM) для прошики, в которую необходимо записывать "прошивку" из внешней пямяти, после подачи питания на ПЛИС.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Aug 13 2008, 11:46
Сообщение #40


Участник
*

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



Спасибо smile.gif
Go to the top of the page
 
+Quote Post
Nuts
сообщение Aug 13 2008, 16:47
Сообщение #41


Участник
*

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



В EDK, для КID на Virtex4, собрал BSP, установил ОС XilKernel, написал простенькое приложение для отправки UDP пакетов. Дело в том, что после компиляции всего этого, вылазит сообщение о том что, Ethernet IP ядро требует лицензию. Все это загружается и работает, но скорость по Ethernet очень маленькая, 20 Кбит/с (ожидаемая не менее 400 Мбит/c, ну хотябы 100 набрать). Может скорость по Ethernet быть ограничена, всвязи с отсутствием лицензии на IP ядро? Может кто сталкивался с подобной ситуацией. 05.gif
Go to the top of the page
 
+Quote Post
dvladim
сообщение Aug 13 2008, 17:45
Сообщение #42


Знающий
****

Группа: Свой
Сообщений: 654
Регистрация: 24-01-07
Из: Воронеж
Пользователь №: 24 737



Цитата(Boris_TS @ Aug 12 2008, 23:08) *
ПЛИС - это русская аббревиатура (Программируемая Логическая Интегральная Схема - правда, лет 20 незад были "Полузаказные Л.И.С." - но время идет, а аббревиатура не меняется).

Полузаказные обычно назывались БМК (Базовый матричный кристалл).
Go to the top of the page
 
+Quote Post
Timonnn
сообщение Aug 14 2008, 05:34
Сообщение #43





Группа: Новичок
Сообщений: 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 ядро? Может кто сталкивался с подобной ситуацией. 05.gif


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

Спасибо.
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Aug 14 2008, 09:08
Сообщение #44


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



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

Да, есть и БМК, но это несколько другие изделия. Обратитесь к истории (проверьте по тому же Белорусскому Интегралу), в 80-х (т.е. лет 25-30 назад, а не 20 как я указал выше - ошибся: постарел лет на семь и даже не заметил как) были также и ПЛИС (в смысле полузаказных). До недавнего времени (а может и сейчас тоже, но в меньшей степени) среди ПЛИС были hardwire продукты - однократного программирования; вот полузаказнухи и "полузаказывались" на уровне логики, а в БМК (как я знаю) "полузаказывается" на уровне транзисторов, т.е. в БМК можно собирать как цифровые, так и аналоговые узлы, что позволяет делать на БМК очень интересные (эксклюзивные) устройства.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 14 2008, 13:03
Сообщение #45


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Boris_TS @ Aug 14 2008, 13:08) *
в БМК можно собирать как цифровые, так и аналоговые узлы, что позволяет делать на БМК очень интересные (эксклюзивные) устройства.

можно-то можно... только жутко дорого. И цена ошибки очень высока...


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Aug 14 2008, 15:11
Сообщение #46


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



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

Заранее извиняюсь за offtopic. С дороговизной БМК и ценой ошибки полностью согласен. Но знаю прецеденты сборки схем на БМК, содержащих одновременно как многовходовые операционные усилители (6-8 входов и кучи обратных связей, позволяющих значительно уменьшить влияние деградации кристалла – например, от ионизирующего излучения), так и простенького цифрового интерфейсика.
Go to the top of the page
 
+Quote Post
Nuts
сообщение Aug 14 2008, 17:27
Сообщение #47


Участник
*

Группа: Новичок
Сообщений: 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;
}


05.gif

Сообщение отредактировал Nuts - Aug 14 2008, 17:41
Go to the top of the page
 
+Quote Post
DiWhite
сообщение Mar 9 2011, 19:09
Сообщение #48


Участник
*

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



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

Подскажите, что не так? Работаю в Xilinx 12.2.
Ниже прилепил mhs и mss файлы проекта.
Прикрепленные файлы
Прикрепленный файл  Archive.zip ( 3.65 килобайт ) Кол-во скачиваний: 8
 
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01989 секунд с 7
ELECTRONIX ©2004-2016