Есть такой процесс:
Код
pr_reg: process( clk ) begin
if( rising_edge( clk ) ) then
if( reset_p='1' ) then
reg_a<=init_val after 1 ns;
elsif( data_en='1' ) then
reg_a( 63 downto 1 ) <= reg_a( 62 downto 0 ) after 1 ns;
reg_a(0) <= reg_a(63) xor reg_a(62) xor reg_a(60) xor reg_a(59) after 1 ns;
end if;
end if;
end process;
if( rising_edge( clk ) ) then
if( reset_p='1' ) then
reg_a<=init_val after 1 ns;
elsif( data_en='1' ) then
reg_a( 63 downto 1 ) <= reg_a( 62 downto 0 ) after 1 ns;
reg_a(0) <= reg_a(63) xor reg_a(62) xor reg_a(60) xor reg_a(59) after 1 ns;
end if;
end if;
end process;
clk - 166 MHz
reset_p - асинхронный, но крайне длительный >100 ms
init_val - это константа.
data_en возникает намного позже reset_p
Я обнаружил при помощи ChipScope, что иногда reg_a инициализируется неправильным значением. После того, как я сделал reset_p синхронным - всё стало нормально.
Собственно вопрос - откуда здесь может быть ошибка ? Скорее всего reset_p заводится на входы сброса/установки, длительность reset_p очень большая. Времени на установку более чем достаточно. Получается, что ошибка возникает при асинхронном снятии reset - вместо сброса в 0 возникает установка в 1. Не понимаю.