qcount(1) <= b;
qcount(31 downto 2) <= count;
- comb_event: process (a_prev, b_prev, a, b)
+ comb_event: process (reset, a_prev, b_prev, a, b)
begin
a_rise <= '0';
a_fall <= '0';
b_fall <= '0';
ab_event <= '0';
ab_error <= '0';
- if ((a xor a_prev) and (b xor b_prev)) = '1' then
- -- forbidden double transition
- ab_error <= '1';
- else
- a_rise <= (a xor a_prev) and a;
- a_fall <= (a xor a_prev) and not a;
- b_rise <= (b xor b_prev) and b;
- b_fall <= (b xor b_prev) and not b;
- ab_event <= (a xor a_prev) or (b xor b_prev);
- end if;
+
+ if reset = '0' then
+ if ((a xor a_prev) and (b xor b_prev)) = '1' then
+ -- forbidden double transition
+ ab_error <= '1';
+ else
+ a_rise <= (a xor a_prev) and a;
+ a_fall <= (a xor a_prev) and not a;
+ b_rise <= (b xor b_prev) and b;
+ b_fall <= (b xor b_prev) and not b;
+ ab_event <= (a xor a_prev) or (b xor b_prev);
+ end if;
+ end if;
end process;
- comb_count: process (a_prev, b_prev, a, b, count, count_prev)
+ comb_count: process (reset, a_prev, b_prev, a, b, count, count_prev)
begin
- if (a_prev = '0') and (b_prev = '1') and (a = '0') and (b = '0') then
+ if reset = '1' then
+ count <= count_prev;
+ elsif (a_prev = '0') and (b_prev = '1') and (a = '0') and (b = '0') then
count <= count_prev + 1;
elsif (a_prev = '0') and (b_prev = '0') and (a = '0') and (b = '1') then
count <= count_prev - 1;
end if;
end process;
- seq: process (clk)
+ seq: process (clk, reset, a, b)
begin
- if clk = '1' and clk'event then
+ if reset = '1' then
+ count_prev <= (others => '0');
+ end if;
+
+ if clk = '1' and clk'event then
if reset = '0' then
- count_prev <= (others => '0');
- else
count_prev <= count;
end if;
-
a_prev <= a;
b_prev <= b;
end if;