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

 
 
 
Reply to this topicStart new topic
> Нестабильный результат синтеза?, ISE 12.2, XST ,VHDL
KP580BM80
сообщение May 7 2011, 12:22
Сообщение #1





Группа: Участник
Сообщений: 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% ошибок. До замены их не было вообще!
Замечены и другие подобные нюансы. В чём могут быть грабли?
Go to the top of the page
 
+Quote Post
tAmega
сообщение May 7 2011, 12:31
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 474
Регистрация: 20-01-09
Из: НН
Пользователь №: 43 639



Самый лучший способ, это посмотреть на RTL модель, который выдает синтезатор. Там четко видно, чем и как отличаются конструкции.


--------------------
пользователь отключен
Go to the top of the page
 
+Quote Post
VladimirB
сообщение May 7 2011, 12:32
Сообщение #3


Знающий
****

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

учите схемотехнику sm.gif
Go to the top of the page
 
+Quote Post
KP580BM80
сообщение May 7 2011, 13:24
Сообщение #4





Группа: Участник
Сообщений: 14
Регистрация: 27-06-08
Из: г. Челябинск, Россия
Пользователь №: 38 580



Цитата(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; ?
Go to the top of the page
 
+Quote Post
dmitry-tomsk
сообщение May 7 2011, 13:29
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 672
Регистрация: 18-02-05
Пользователь №: 2 741



У Вас там скорее всего асинхронные входы, вот и глючит
Go to the top of the page
 
+Quote Post
KP580BM80
сообщение May 7 2011, 13:55
Сообщение #6





Группа: Участник
Сообщений: 14
Регистрация: 27-06-08
Из: г. Челябинск, Россия
Пользователь №: 38 580



Цитата(dmitry-tomsk @ May 7 2011, 16:29) *
У Вас там скорее всего асинхронные входы, вот и глючит

Вы абсолютно правы - был один такой сигнал со входа ПЛИС. Пропустил его через триггер, стробируя сигналом clk. Теперь работает и с вариантом "fk_tmp <= fk_tmp xor dk_tmp;".
Спасибо.
Go to the top of the page
 
+Quote Post
dmitry-tomsk
сообщение May 7 2011, 16:04
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 672
Регистрация: 18-02-05
Пользователь №: 2 741



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

Триггера мало - нужно два. Ищите в форуме слово метастабильность.
Go to the top of the page
 
+Quote Post
des333
сообщение May 7 2011, 16:19
Сообщение #8


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

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(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




--------------------
Go to the top of the page
 
+Quote Post
VladimirB
сообщение May 8 2011, 00:47
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 614
Регистрация: 12-06-09
Из: рядом с Москвой
Пользователь №: 50 219



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

извиняюсь был неправ - не заметил что в случае с XORом сигнал сам с собой ксорится - в этом случае похоже тоже latch синтезируется
Go to the top of the page
 
+Quote Post
KP580BM80
сообщение May 8 2011, 08:14
Сообщение #10





Группа: Участник
Сообщений: 14
Регистрация: 27-06-08
Из: г. Челябинск, Россия
Пользователь №: 38 580



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

Извиняюсь в свою очередь, но после ваших постов мой уровень понимания только снизился. Я считаю, что "fk_tmp <= fk_tmp xor dk_tmp" - защёлкой не является по причине нахождения в последовательном процессе, синхронизированном по клоку. Если я не прав в своём утверждении, то почему? Вы можете дать фрагмент правильного синхронного кода, реализующего переключение сигнала при наличии '1' на контрольном входе?
Go to the top of the page
 
+Quote Post
tAmega
сообщение May 8 2011, 09:47
Сообщение #11


Местный
***

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


--------------------
пользователь отключен
Go to the top of the page
 
+Quote Post
KP580BM80
сообщение May 8 2011, 10:34
Сообщение #12





Группа: Участник
Сообщений: 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;
...

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

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

таки синхронен. Благодарю.
Go to the top of the page
 
+Quote Post
des333
сообщение May 8 2011, 10:40
Сообщение #13


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

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



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


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


Потому как (на примере кода, приведенного мной выше) RTL во втором случае показывает latch, в первом - нет. Но по факту синтезируется одно и тоже.


--------------------
Go to the top of the page
 
+Quote Post

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

 


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


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