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

 
 
> ПЛИС непонятно работает, хотя в симуляторе всё как надо
enzaime
сообщение Mar 3 2017, 10:41
Сообщение #1


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

Группа: Участник
Сообщений: 83
Регистрация: 22-08-14
Пользователь №: 82 609



В общем штука такая в процессе изучения ПЛИС заметил вот какую вещь: по мере уменьшения емкости чипа (total logic elements) начинаются всякие странные вещи. Например, там где должна быть 1 там 0 и наоборот.
Я сделал тестовый проект, в котором виден этот эффект. Использую плату CoreEP4CE10 c ПЛИС EP4CE10F17C8 и тактовым генератором на 50 МГц

Реализуется следующее:
n параллельных процессов в которых m раз выполняется * и /

проц 1: *,/
проц 2: *,/ *,/
проц 3: *,/ *,/ *,/ *,/
проц 4: *,/ *,/ *,/ *,/ *,/
проц 5: *,/ *,/ *,/ *,/ *,/ *,/
и т.д.

каждая ветка описывается так:

Код
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_misc.all;
entity vetka is    
     generic(n:natural:= 10);
     port(
     clk : in STD_LOGIC;
     a: in std_logic_vector(15 downto 0);  
     r:out std_logic;
     chisl:out std_logic
         );
end vetka;

--}} End of automatically maintained section

architecture arch of vetka is

function vetv (a: std_logic_vector) return std_logic_vector is
variable c: std_logic_vector(29 downto 0);    
begin
  c := x"000"&"00"&a;
  for i in 1 to n loop    
      c := conv_std_logic_vector(conv_integer©*conv_integer©,30);
      c := conv_std_logic_vector(conv_integer©/conv_integer(c(7 downto 0)),30);  
  end loop;
  return c;
end;    
function merg (d: std_logic_vector) return std_logic is
variable c: std_logic:='0';    
begin

  for i in 0 to 29 loop    
      c := c or d(i);
  end loop;
  return c;
end;
signal d:std_logic_vector(29 downto 0):=x"0000000"&"00";
signal st:std_logic_vector(3 downto 0):=x"0";        

begin                    
    r <= or_reduce(d);
    chisl <= merg(d);
    process(clk)
    begin        
        if(rising_edge(clk)) then    
            
            if(st = x"0") then
                d <= vetv(a);
                st <= x"1";
            end if;
            
            if(st = x"1") then
                st <= x"0";
                d <= conv_std_logic_vector(0,30);
            end if;               
            
        end if;
    end process;

     -- enter your statements here --

end arch;

функция or-reduce(d) регистрирует изменение сигнала d, изменяя своё значение на противоположное при каждом изменении сигнала d.

далее генерируются n процессов длины m

Код
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity gabage is
     generic(m:natural:=5);
     port(
          clk : in STD_LOGIC;  
          etalon: out std_logic;    
         a: in std_logic_vector(15 downto 0);
         vetv : out STD_LOGIC_vector(m downto 0);
         rez: out std_logic_vector(m downto 0);
         alls: out std_logic
         );
end gabage;

--}} End of automatically maintained section

architecture arch of gabage is
signal etst:std_logic_vector(3 downto 0):=x"0";      
signal et:std_logic:='0';
signal vrez:std_logic_vector(m downto 0);
component vetka is    
     generic(n:natural:= 10);
     port(
     clk : in STD_LOGIC;
     a: in std_logic_vector(15 downto 0);  
     r:out std_logic;
     chisl:out std_logic
         );
end component;    

function merg (d: std_logic_vector) return std_logic is
variable c: std_logic:='0';    
begin
  c := d(0);
  for i in 1 to m loop    
      c := c and d(i);
  end loop;
  return c;
end;
begin                    
    
    vetv <= vrez;
    etalon <= et;  
    alls <= merg(vrez);
G0: for i in 0 to m generate
    k1:vetka  
        generic map(n => i)
        port map(
        clk => clk,      
        a => a,
        r => vrez(i),
        chisl => rez(i)
        );
end generate;
    process(clk)
    begin        
        if(rising_edge(clk)) then              
            
            if(etst = x"0") then
                et <= '1';
                etst <= x"1";
            end if;            
            
            if(etst = x"1") then
                et <= '0';
                etst <= x"0";
            end if;    
            
        end if;
    end process;
    

     -- enter your statements here --

end arch;

В общем сначала я думал увидеть задержку выполнения операций для каждого процесса, сравнивая r и etalon увидеть какое-то отставание на каждой ветви от эталона (etalon).
Сигнал alls объединение сигналов готовности через функцию логическое И

Да и главный файл:
Прикрепленное изображение


Выходная частота pll 200 МГц входная 50 МГц

Вот так это дело работает в симуляторе modelsim (gate level), например, для 8 веток

Прикрепленное изображение

Смотрел работу в чипе с помощью логического анализатора, работающего на частоте 200 МГц (частота выходных сигналов 100 МГц)

Если генерировать для 4 ветвей, то всё работает как надо ( правда каких-то задержек я не увидел, возможно, неправильно смотрел)
отчёт компилятора
Прикрепленное изображение

Вот что отображает логический анализатор
Прикрепленное изображение

Но если сгенерировать для 8 ветвей, то что-то непонятное происходит картинка сильно отличается от того, что в симуляторе. Сигналы готовности n должны быть равномерными с частотой 100 МГЦ, но по факту бывает так что высокий уровень несколько тактов не сменяется низким, хотя в коде нигде такого не прописано

Прикрепленное изображение

отчёт компилятора
Прикрепленное изображение

Я как-то не понимаю почему это происходит. Тоесть понятно что я что-то делаю не так, но вот что именно не понимаю
Может кто сталкивался с чем-то подобным?
Вот ссылка с проектом на яндекс диске https://yadi.sk/d/FEwjHm0G3EwbyD

Сообщение отредактировал enzaime - Mar 3 2017, 10:43
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
enzaime
сообщение Mar 4 2017, 09:47
Сообщение #2


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

Группа: Участник
Сообщений: 83
Регистрация: 22-08-14
Пользователь №: 82 609



Цитата
Боюсь не смогу помочь с такой проблемой новичка, но абсолютно уверяю: ПЛИС работает предсказуемо при любом объеме логики, если конечно задать для проекта верные констрейны.

А предсказуемо, значит так как в симуляции? Или предсказуемо означает с учётом большого опыта?
Как новичку понять что будет работать, а что нет?
И можно ли как-то просимулировать констрейны? В vhdl, например, есть оператор latency, нужно как-то с ним писать код, чтобы учитывать временные ограничения?
Цитата
Среда "бросает в лицо" предупреждение о неполностью оконстрейненом проекте. И ещё, вероятно, о неоконтрейненом клоке. Но вы же не обращаете внимания на подобные мелочиsm.gif.

Да действительно что-то там было про клок, но я особо внимания не обратил) Вот если бы за каждый варнинг било бы током, я бы начал суетиться и подозревать что что-то не так)
Цитата
Еще, на уровне интуиции, мне кажется что вы переоцениваете полученные возможности. Вы понимаете что время за которое сигнал доходит от одного блока до друго внутри ПЛИС все время разное? Оно сильно меняется от температуы и питания. Инструменты по созданию схемы проверяют что этот +- вкладывается в ворота клока, но не более. То есть фактически у вас разрешение задания времянок - это период клока.
Надеюсь вы это понимаете.

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

Чего так сложно-то??? sad.gif

Сообщение отредактировал enzaime - Mar 4 2017, 09:59
Go to the top of the page
 
+Quote Post
Flood
сообщение Mar 4 2017, 15:20
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 702
Регистрация: 8-06-06
Пользователь №: 17 871



Цитата(enzaime @ Mar 4 2017, 12:47) *
Чего так сложно-то??? sad.gif


Ну, сложно - понятие относительное.
В языке C, бывает, нужно выделить память перед тем как начать ей пользоваться и освободить по окончании. По сравнению с, допустим, питоном, это сложно?

ПЛИСоводство - область в целом гораздо менее развитая, чем "обычное" мейнстримовое программирование, а оттого более сложная и менее удобная для программиста. Языки кривоваты, редакторов нормальных почти нет, компиляция занимает часы и может закончиться провалом таймингов. Что ни делай с кодом - сотни варнингов, практически все тулчейны глубоко проприетарные, и т. п. Короче, хардкор.
И это в то время, когда для программистов давным-давно редактор уже чуть ли не сам пишет код, линтер подчеркивает ошибки во время написания, а компилятор переспрашивает, "а вы точно хотите использовать присваивание под if?".

Возможно, ситуация несколько сдвинется в связи с современным хайпом аппаратных ускорителей и общим ростом популярности ПЛИСов. Но достижение того уровня удобства, к которому привыкли сегодняшние программисты, в среде ПЛИСов займет еще многие годы, если вообще будет достигнуто.

Также, пресловутый рост популярности приводит к тому, что к написанию кода для ПЛИС подключается все больше людей из среды обычного процедурного программирования. Привычка писать императивный код плохо ложится на ПЛИС (точнее, никак), часто из-за непонимания принципа работы последних. Тут нужна перестройка мышления в сторону функционального программирования.

С другой стороны, старики ПЛИСоводства, пришедшие из чистой электроники и привыкшие в свое время еще к схемотехническому вводу, также часто имеют закостеневшее мышление и избегают использовать в своем коде какие-то абстракции, считая, что синтезатор не разберется и лучше избегать любых сложных конструкций. Такие люди свысока посматривают на написанный программистом код и возмущаются: "кто так пишет?", "не отсинтезируется", "откуда ситнезатору знать, что это память?", "не соберется", и т.п. А код внезапно нормально синтезируется и успешно собирается sm.gif

Так что одной правды здесь нет.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- enzaime   ПЛИС непонятно работает, хотя в симуляторе всё как надо   Mar 3 2017, 10:41
- - andrew_b   Извините, я не буду смотреть проект. Два вопроса: ...   Mar 3 2017, 10:56
- - litv   "Я как-то не понимаю почему это происходит. Т...   Mar 3 2017, 12:30
- - AVR   Боюсь не смогу помочь с такой проблемой новичка, н...   Mar 3 2017, 13:03
- - andrewkrot   Попробуйте уменьшить частоту в 10 раз и сравните р...   Mar 3 2017, 14:31
- - enzaime   ЦитатаТолько потом приходите на форум и рассказыва...   Mar 3 2017, 20:30
|- - Timmy   Цитата(enzaime @ Mar 3 2017, 23:30) Да я ...   Mar 4 2017, 03:40
|- - andrew_b   Цитата(enzaime @ Mar 3 2017, 23:30) Насчё...   Mar 4 2017, 05:06
- - lexx   Констрейнить - значит выбрать порт тактового сигна...   Mar 4 2017, 03:14
- - Golikov A.   ЦитатаНасчёт for: почему нельзя применять, если эт...   Mar 4 2017, 06:34
|- - iosifk   Цитата(enzaime @ Mar 4 2017, 12:47) И мож...   Mar 4 2017, 10:28
- - enzaime   ЦитатаДавайте уточним про симуляцию. Вы что именно...   Mar 4 2017, 10:54
|- - iosifk   Цитата(enzaime @ Mar 4 2017, 13:54) Давай...   Mar 4 2017, 11:00
- - enzaime   ЦитатаНу так что же Вы от RTL хотите? Он же не пон...   Mar 4 2017, 11:23
- - dvladim   Цитата(enzaime @ Mar 4 2017, 14:23) Сам з...   Mar 4 2017, 13:46
- - Golikov A.   На пальцах: каждый элемент в схеме, каждое соедине...   Mar 4 2017, 15:45
- - enzaime   Во!!! Всё как надо разъяснили, я аж вс...   Mar 4 2017, 16:48


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

 


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


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