Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нестабильный результат синтеза?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
KP580BM80
В работающем, отлаженном процессе меняю конструкцию:
if (dk_tmp='1') then
fk_tmp <= not fk_tmp;
end if;
на:
fk_tmp <= fk_tmp xor dk_tmp;
и получаю нерабочую систему. В тесте на железе появляется порядка 1% ошибок. До замены их не было вообще!
Замечены и другие подобные нюансы. В чём могут быть грабли?
tAmega
Самый лучший способ, это посмотреть на RTL модель, который выдает синтезатор. Там четко видно, чем и как отличаются конструкции.
VladimirB
Цитата(KP580BM80 @ May 7 2011, 16:22) *
В работающем, отлаженном процессе меняю конструкцию:
if (dk_tmp='1') then
fk_tmp <= not fk_tmp;
end if;
на:
fk_tmp <= fk_tmp xor dk_tmp;
и получаю нерабочую систему. В тесте на железе появляется порядка 1% ошибок. До замены их не было вообще!
Замечены и другие подобные нюансы. В чём могут быть грабли?


потому что в первом случае если dk_tmp не равно '1' то, так как if неполный,
fk_tmp не изменяет своего состояния - т.е. синтезируется асинхронный триггер или latch

а во втором случае просто логика XOR.

учите схемотехнику sm.gif
KP580BM80
Цитата(VladimirB @ May 7 2011, 15:32) *
потому что в первом случае если dk_tmp не равно '1' то, так как if неполный,
fk_tmp не изменяет своего состояния - т.е. синтезируется асинхронный триггер или latch

а во втором случае просто логика XOR.

учите схемотехнику sm.gif

Спасибо за отклик. Но, вопросов только добавилось.
Речь идёт о последовательном процессе, чувствительном для clk. Во втором случае должен иметь место всё-таки синхронный триггер, фиксирующий выход логики XOR. Или я не прав?
Чисто для изучения схемотехники sm.gif изменил if до полного:

if (dk_tmp='1') then --вариант 1
fk_tmp <= not fk_tmp;
else
fk_tmp <= fk_tmp;
end if;

но результат не изменился. Пробовал ещё так:

if (dk_tmp='1') then --вариант 2
fk_tmp <= not fk_tmp;
else
null;
end if;

- без изменений.

Действительно ли вариант 1 отличается от: fk_tmp <= fk_tmp xor dk_tmp; ?
dmitry-tomsk
У Вас там скорее всего асинхронные входы, вот и глючит
KP580BM80
Цитата(dmitry-tomsk @ May 7 2011, 16:29) *
У Вас там скорее всего асинхронные входы, вот и глючит

Вы абсолютно правы - был один такой сигнал со входа ПЛИС. Пропустил его через триггер, стробируя сигналом clk. Теперь работает и с вариантом "fk_tmp <= fk_tmp xor dk_tmp;".
Спасибо.
dmitry-tomsk
Цитата(KP580BM80 @ May 7 2011, 16:55) *
Вы абсолютно правы - был один такой сигнал со входа ПЛИС. Пропустил его через триггер, стробируя сигналом clk. Теперь работает и с вариантом "fk_tmp <= fk_tmp xor dk_tmp;".
Спасибо.

Триггера мало - нужно два. Ищите в форуме слово метастабильность.
des333
Цитата(VladimirB @ May 7 2011, 16:32) *
потому что в первом случае если dk_tmp не равно '1' то, так как if неполный,
fk_tmp не изменяет своего состояния - т.е. синтезируется асинхронный триггер или latch

а во втором случае просто логика XOR.

учите схемотехнику sm.gif


Скажите, на Ваш взгляд два этих куска кода различаются или нет?


Код
always_comb

begin
      if(rst)
         out = 1'b0;
      else
         out = out ^ en;
   end





Код
  
always @(*)
   begin
      if(rst)
         out = 1'b0;
      else
         if(en)
            out = !out;
end


VladimirB
Цитата(des333 @ May 7 2011, 20:19) *
Скажите, на Ваш взгляд два этих куска кода различаются или нет?

извиняюсь был неправ - не заметил что в случае с XORом сигнал сам с собой ксорится - в этом случае похоже тоже latch синтезируется
KP580BM80
Цитата(VladimirB @ May 8 2011, 04:47) *
извиняюсь был неправ - не заметил что в случае с XORом сигнал сам с собой ксорится - в этом случае похоже тоже latch синтезируется

Извиняюсь в свою очередь, но после ваших постов мой уровень понимания только снизился. Я считаю, что "fk_tmp <= fk_tmp xor dk_tmp" - защёлкой не является по причине нахождения в последовательном процессе, синхронизированном по клоку. Если я не прав в своём утверждении, то почему? Вы можете дать фрагмент правильного синхронного кода, реализующего переключение сигнала при наличии '1' на контрольном входе?
tAmega
Цитата(KP580BM80 @ May 8 2011, 11:14) *
... Я считаю, что "fk_tmp <= fk_tmp xor dk_tmp" - защёлкой не является...


Не надо "считать" или "не считать". Надо синтезировать проект и посмотреть что показывает RTL схема.
Строка "fk_tmp <= fk_tmp xor dk_tmp" вообще смысла не имеет.

Вот код, который даст операцию XOR синхронную
CODE
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.numeric_std.all;

entity xor_check is
port(
clk : in std_logic;
reset : in std_logic;
fk_tmp : in std_logic;
dk_tmp : in std_logic;
fk_tmp_out : out std_logic
);
end xor_check;

architecture struct of xor_check is

begin
process(clk,reset)
begin
if(reset = '1') then
fk_tmp_out <='0';
elsif(clk'event and clk='1') then
fk_tmp_out <= fk_tmp xor dk_tmp;
end if;
end process;
end struct;


Вот синхронный проект с сигналом разрешения
CODE
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.numeric_std.all;

entity xor_check is
port(
clk : in std_logic;
reset : in std_logic;
fk_tmp : in std_logic;
dk_tmp : in std_logic;
fk_tmp_out : out std_logic
);
end xor_check;

architecture struct of xor_check is

begin
process(clk,reset)
begin
if(reset = '1') then
fk_tmp_out <='0';
elsif(clk'event and clk='1') then
if(dk_tmp = '1') then
fk_tmp_out <= not fk_tmp;
else
fk_tmp_out <= fk_tmp;
end if;
end if;
end process;
end struct;
KP580BM80
Цитата(tAmega @ May 8 2011, 13:47) *
Строка "fk_tmp <= fk_tmp xor dk_tmp" вообще смысла не имеет.

Смысл она имеет. fk_tmp - фаза AMI-подобного кода и она должна каждый раз при передаче единцы (в dk_tmp) меняться на противоположную. При передачи нуля фаза не изменяется, да и не используется. fk_tmp и dk_tmp - сигналы формируемые внутри процесса. Ваш же вариант:

CODE

...
begin
process(clk,reset)
begin
if(reset = '1') then
fk_tmp_out <='0';
elsif(clk'event and clk='1') then
fk_tmp_out <= fk_tmp xor dk_tmp;
end if;
end process;
...

просто ксорит два входа и результат выдаёт на выход. Вы меня не поняли (или я плохо объяснил sm.gif). В любом случае, ваше пояснение подтвердило мою уверенность, что мой код:
CODE

if(clk'event and clk='1') then
...
fk_tmp <= fk_tmp xor dk_tmp;
...
end if;

таки синхронен. Благодарю.
des333
Цитата(tAmega @ May 8 2011, 13:47) *
Не надо "считать" или "не считать". Надо синтезировать проект и посмотреть что показывает RTL схема.


Только надо смотреть, что покажет не RTL, а Technology Viewer.


Потому как (на примере кода, приведенного мной выше) RTL во втором случае показывает latch, в первом - нет. Но по факту синтезируется одно и тоже.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.