Цитата(sazh @ Nov 2 2007, 19:29)

process(clk2,en)
begin
if rising_edge(clk2) then
if en = '1' then
measuring_counter <= x"00000000";
data_out <= measuring_counter;
Может статься, что в интервал en уложатся два передних фронта clk2.
Нужно корректно перейти из одного клокового домена в другой (Сделать длительность en в период clk2).
Вчера я вас ввел в заблуждение. Частота clk1 выше, чем clk2
Поэтому может статься, что сфомированный по clk1 интервал en может пропускаться триггером, работающим по фронту clk2.
Нужно корректно перейти из одного клокового домена в другой (Сделать длительность en в период clk2).
Примерно так.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity count is
Port (
clk125, clk100 : in std_logic;
data_out : out std_logic_vector(3 downto 0));
end count;
architecture Behavioral of count is
signal base_counter: std_logic_vector(4 downto 0);
signal measuring_counter: std_logic_vector(3 downto 0);
signal en_sr: std_logic_vector(2 downto 0);
signal en, dff_a, en_a: std_logic;
begin
process(clk125)
begin
if rising_edge(clk125) then
if base_counter = "10000" then
base_counter <= "00001";
else
base_counter <= base_counter + 1;
end if;
end if;
end process;
en <= base_counter(4);
process(clk100, en)
begin
if en = '1' then
dff_a <= '1';
elsif rising_edge(clk100) then
dff_a <= '0';
end if;
end process;
en_a <= NOT en_sr(2) AND en_sr(1);
process(clk100)
begin
if rising_edge(clk100) then
en_sr <= en_sr(1 downto 0) & dff_a;
if en_a = '1' then
data_out <= measuring_counter;
end if;
if en_a = '1' then
measuring_counter <= x"0";
else
measuring_counter <= measuring_counter + 1;
end if;
end if;
end process;
end Behavioral;