|
|
  |
Нестабильный результат синтеза?, ISE 12.2, XST ,VHDL |
|
|
|
May 7 2011, 12:22
|
Группа: Участник
Сообщений: 14
Регистрация: 27-06-08
Из: г. Челябинск, Россия
Пользователь №: 38 580

|
В работающем, отлаженном процессе меняю конструкцию: if (dk_tmp='1') then fk_tmp <= not fk_tmp; end if; на: fk_tmp <= fk_tmp xor dk_tmp; и получаю нерабочую систему. В тесте на железе появляется порядка 1% ошибок. До замены их не было вообще! Замечены и другие подобные нюансы. В чём могут быть грабли?
|
|
|
|
|
May 7 2011, 12:32
|
Знающий
   
Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219

|
Цитата(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. учите схемотехнику
|
|
|
|
|
May 7 2011, 13:24
|
Группа: Участник
Сообщений: 14
Регистрация: 27-06-08
Из: г. Челябинск, Россия
Пользователь №: 38 580

|
Цитата(VladimirB @ May 7 2011, 15:32)  потому что в первом случае если dk_tmp не равно '1' то, так как if неполный, fk_tmp не изменяет своего состояния - т.е. синтезируется асинхронный триггер или latch а во втором случае просто логика XOR. учите схемотехнику  Спасибо за отклик. Но, вопросов только добавилось. Речь идёт о последовательном процессе, чувствительном для clk. Во втором случае должен иметь место всё-таки синхронный триггер, фиксирующий выход логики XOR. Или я не прав? Чисто для изучения схемотехники  изменил 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; ?
|
|
|
|
|
May 7 2011, 13:55
|
Группа: Участник
Сообщений: 14
Регистрация: 27-06-08
Из: г. Челябинск, Россия
Пользователь №: 38 580

|
Цитата(dmitry-tomsk @ May 7 2011, 16:29)  У Вас там скорее всего асинхронные входы, вот и глючит Вы абсолютно правы - был один такой сигнал со входа ПЛИС. Пропустил его через триггер, стробируя сигналом clk. Теперь работает и с вариантом "fk_tmp <= fk_tmp xor dk_tmp;". Спасибо.
|
|
|
|
|
May 7 2011, 16:19
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

|
Цитата(VladimirB @ May 7 2011, 16:32)  потому что в первом случае если dk_tmp не равно '1' то, так как if неполный, fk_tmp не изменяет своего состояния - т.е. синтезируется асинхронный триггер или latch а во втором случае просто логика XOR. учите схемотехнику  Скажите, на Ваш взгляд два этих куска кода различаются или нет? Код 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
--------------------
|
|
|
|
|
May 8 2011, 08:14
|
Группа: Участник
Сообщений: 14
Регистрация: 27-06-08
Из: г. Челябинск, Россия
Пользователь №: 38 580

|
Цитата(VladimirB @ May 8 2011, 04:47)  извиняюсь был неправ - не заметил что в случае с XORом сигнал сам с собой ксорится - в этом случае похоже тоже latch синтезируется Извиняюсь в свою очередь, но после ваших постов мой уровень понимания только снизился. Я считаю, что "fk_tmp <= fk_tmp xor dk_tmp" - защёлкой не является по причине нахождения в последовательном процессе, синхронизированном по клоку. Если я не прав в своём утверждении, то почему? Вы можете дать фрагмент правильного синхронного кода, реализующего переключение сигнала при наличии '1' на контрольном входе?
|
|
|
|
|
May 8 2011, 09:47
|
Местный
  
Группа: Свой
Сообщений: 474
Регистрация: 20-01-09
Из: НН
Пользователь №: 43 639

|
Цитата(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;
--------------------
пользователь отключен
|
|
|
|
|
May 8 2011, 10:34
|
Группа: Участник
Сообщений: 14
Регистрация: 27-06-08
Из: г. Челябинск, Россия
Пользователь №: 38 580

|
Цитата(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; ...
просто ксорит два входа и результат выдаёт на выход. Вы меня не поняли (или я плохо объяснил  ). В любом случае, ваше пояснение подтвердило мою уверенность, что мой код: CODE if(clk'event and clk='1') then ... fk_tmp <= fk_tmp xor dk_tmp; ... end if;
таки синхронен. Благодарю.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|