Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не срабатывает регистр защёлка
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
anatol1983
Код
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ram is
generic(Amax     : integer:=3);
port (clk,Wr,WrArg,fixhit,RdEqual, RdMore,RdLess: in std_logic;
  af    : out std_logic_vector(Amax downto 0);
  a     : in std_logic_vector(Amax downto 0);
     di    : in std_logic_vector(31 downto 0);
      argo  : out std_logic_vector(31 downto 0);
     do    : out std_logic_vector(31 downto 0));
procedure foundCompS (R,arg:in std_logic_vector (31 downto 0);signal E,M,L:out std_logic)is
begin
if R=Arg then E<='1';else E<='0';end if;
if R>Arg then M<='1';else M<='0';end if;
if R<Arg then L<='1';else L<='0';end if;
end foundCompS;  
end ram;

architecture Behavioral of ram is
type ram_type is array ((2**(Amax+1)-1)downto 0) of std_logic_vector (31 downto 0);
signal R      : ram_type;
signal arg    : std_logic_vector(31 downto 0);
signal SEqual : std_logic_vector((2**(Amax+1)-1) downto 0);
signal SMore  : std_logic_vector((2**(Amax+1)-1) downto 0);
signal SLess  : std_logic_vector((2**(Amax+1)-1) downto 0);
signal CMD   : std_logic_vector(5 downto 0);
begin
process(clk)
variable M_var : std_logic_vector((2**(Amax+1)-1)downto 0);
variable T     : std_logic;
variable Equal : std_logic_vector((2**(Amax+1)-1)downto 0);
variable More  : std_logic_vector((2**(Amax+1)-1)downto 0);
variable Less  : std_logic_vector((2**(Amax+1)-1)downto 0);
begin
CMD<=(Wr,WrArg,FixHit,RdEqual,RdMore,RdLess);
    if (clk'event and clk = '1') then
 case CMD is
 when ("100000") =>R(conv_integer(a)) <= di;
[B]--  when ("010000") =>arg<=di;[/B]--после синтеза это набор D-тр
 when ("001000") =>Equal:=SEqual;More:=SMore;Less:=SLess;
 when ("000100") =>T:='0';
     for i in 0 to (2**(Amax+1)-1) loop
     if Equal(i)='1' then T:='1';af<=CONV_STD_LOGIC_VECTOR (i, Amax+1);
     Equal(i):='0';end if;
     exit when T='1';
     end loop;
 when ("000010") =>T:='0';
     for i in 0 to (2**(Amax+1)-1) loop
     if More(i)='1' then T:='1';af<=CONV_STD_LOGIC_VECTOR (i, Amax+1);
     More(i):='0';end if;
     exit when T='1';
     end loop;
 when ("000001") =>T:='0';
     for i in 0 to (2**(Amax+1)-1) loop
     if Less(i)='1' then T:='1';
     af<=CONV_STD_LOGIC_VECTOR (i, Amax+1);
     Less(i):='0';end if;
     exit when T='1';
     end loop;
 when others =>null;
 end case;
end if;
end process;
forM:for i in 0 to (2**(Amax+1)-1)generate
  foundCompS(R(i),Arg,SEqual(i),SMore(i),SLess(i));    
end generate forM;
argo<=arg;--введено для контроля потом выкину
[B]Arg<=Di when WrArg='1';[/B] --после синтеза это превращается в защёлку
do <= R(conv_integer(a));
end Behavioral;


проблема вот в чём: моделирую этот VHDL-код всё работает как часы. Синтезирую и размещаю в кристалл Virtex2p, моделирую и при периоде 80 ns на наборе триггеров коды не фиксируются, на защёлке коды не фиксируются при 60 ns. Хотя R (после синтеза D-триггера) работает нормально и логика тоже. Не могу понять в чём причина.
3.14
<проблема вот в чём: моделирую этот VHDL-код всё работает как часы. >
Т.е. это после поведенческого моделирования?

<Синтезирую и размещаю в кристалл Virtex2p, моделирую ...>
Надо полагать, это моделирование после PAR?

<Не могу понять в чём причина>
Вы констрейном затягивали "clk", что PAR пишет?
anatol1983
3.14
<проблема вот в чём: моделирую этот VHDL-код всё работает как часы. >
Т.е. это после поведенческого моделирования?

-да

<Синтезирую и размещаю в кристалл Virtex2p, моделирую ...>
Надо полагать, это моделирование после PAR?

-да

<Не могу понять в чём причина>
Вы констрейном затягивали "clk", что PAR пишет?

-нет. Я без каких либо дополнительных описаний проекта (Constraints и прочее) сразу синтезировал, размещал и моделировал. Я Constraints описание делал (ещё на другой версии) так PAR заканчивался неудачей sad.gif Да к тому как с ним работать я до конца не разобрался. Я так понимаю, мне может помочь Constraints-файл? А что там надо прописать?
3.14
Я без каких либо дополнительных описаний проекта (Constraints и прочее) сразу синтезировал, размещал и моделировал
Ну Вы подумайте сами, описали устройство, но нигде не указали допустимые задержки.
Если Вы не указываете констрейны, PAR просто разложит и разведет как получится, и ничего Вам не скажет.
Если Вы укажете констрейны (хотя бы на часть путей), PAR будет стататься достич указанные ограничения, и в конце работы скажет достиг его или нет, если нет то какая получилось рабочая частота.

Я так понимаю, мне может помочь Constraints-файл
Ну например, имеете блок у которого между регистрами получается 4 слоя логики (LUT), на каждом слое получаете задержку в 2 нс, итого 8нс. плюс задержки на цепях связи ~50%. Итак, получили 12нс. Получается, безсмысленно указывать констрейн на эту логику меньше 8 нс, PAR может сократить только задержку на межсоединениях.
Anybody
Constraints'ы помогают почти всегда!
Если Вы делаете PCI контроллер, то без них лучше и не соваться, вероятность того что Вы получите рабочее устройство, стремится к нолю.
Как я понял у Вас даже проблемы при тайминг анализе ...
Тогда дорога Ваша только к файлу ...
Если нет, тогда, хотя видя Ваш простейший код, могу сказать заранее что такого быть не может...
Бывают еще метастабильности, когда приходится по схеме расставлять синхронизаторы, заботиться о деревьях клоков, но это только в больших проектах, более 2000 LE начинает проявляться.
А тут Вы столкнулись, с обыденностью - простым глитчем.
Синтезатор сгенерил, то что Вы просили ... Но так как Вы не попросили его соблюдать тайминги, то уж простите ...
Что нагенерили, то и получили ...
anatol1983
Цитата(Anybody @ Apr 7 2005, 20:50)
Constraints'ы помогают почти всегда!
Если Вы делаете PCI контроллер, то без них лучше и не соваться, вероятность того что Вы получите рабочее устройство, стремится к нолю.
Как я понял у Вас даже проблемы при тайминг анализе ...
Тогда дорога Ваша только к файлу ...
Если нет, тогда, хотя видя Ваш простейший код, могу сказать заранее что такого быть не может...
Бывают еще метастабильности, когда приходится по схеме расставлять синхронизаторы, заботиться о деревьях клоков, но это только в больших проектах, более 2000 LE начинает проявляться.
А тут Вы столкнулись, с обыденностью - простым глитчем.
Синтезатор сгенерил, то что Вы просили ... Но так как Вы не попросили его соблюдать тайминги, то уж простите ...
Что нагенерили, то и получили ...
*


Это было бы хорошо!! Если всё дело было бы в глюке ПО. Особой любви к ModelSim я не питаю, но альтернатив не знаю. Да и с HDL Bencher та же история. Открою секрет, дело в том что я студент и это мой диплом. В принципе я бы мог привести диаграммы и после поведенческого моделирования, но тут уже дело в моём самолюбии. И хотелось бы идти на защиту с осознаванием того, что это работает smile3046.gif
Я понимаю, что сейчас задам обсалютно ламерский вопрос, но.. А как его об этом попросить? (нет, я конечно интуитивно догадываюсь, но хотелось бы знать мнение специалиста)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.