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

 
 
> Нестабильный результат синтеза?, 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
 
Start new topic
Ответов
VladimirB
сообщение May 7 2011, 12:32
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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
des333
сообщение May 7 2011, 16:19
Сообщение #3


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

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


Знающий
****

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





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


Местный
***

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



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

 


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


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