Цитата(Евгений Николаев @ Dec 4 2007, 11:59)

sazh, хммм... а ведь данные можно хватать по обоим фронтам без деления частоты клока, а потом уже отсортировывать нужные. Оверсемплинг своего рода с избыточными и абсолютно не нужными данными, зато никаких проблем с расхождением клока и данных во времени.
Сделать два FIFO - с защёлкой по положительному и отрицательному фронтам, а на выходе "подбирать" только данные, защёлкнутые на втрое меньшей частоте.
Кому нужны в стандартном случае работа по обоим фронтам. Тем более, что клок сформированный pll не даст такой возможности. Да и не надо.
Все те схемы, которые приведены были это порождение работы в графических редакторах, оперируя готовыми примитивами. Не задумываясь при этом о структуре кристалла.
Что касается FiFo Зачем двуклоковое. когда можно обойтись одноклоковым. Это ресурсы и латентность.
Поведенческое языковое описание, параметризуемость легко ложиться на одноклоковое описание.
Зачем огород городить.
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity RGB_a is
port (
DATA_FIFO_OUT : in std_logic_vector(7 downto 0);
CLK_x2 : in std_logic;
nRST : in std_logic;
clk_out : out std_logic;
DATA_OUT : out std_logic_vector(23 downto 0)
);
end RGB_a;
architecture RGB_arch of RGB_a is
signal cnt : std_logic_vector(2 downto 0);
signal temp : std_logic;
signal rg_a, rg_b : std_logic_vector(7 downto 0);
begin
process(CLK_x2)
begin
if CLK_x2'event and CLK_x2 = '1' then
if nRST = '0' then cnt <= (others => '0');
elsif cnt = "101" then cnt <= (others => '0');
else cnt <= cnt + 1;
end if;
if cnt = "001" then rg_a <= DATA_FIFO_OUT;
end if;
if cnt = "011" then rg_b <= DATA_FIFO_OUT;
end if;
if cnt = "101" then DATA_OUT <= DATA_FIFO_OUT & rg_b & rg_a;
end if;
if nRST = '0' then temp <= '1';
elsif cnt = "010" then temp <= '1';
elsif cnt = "101" then temp <= '0';
end if;
end if;
end process;
clk_out <= temp;
end RGB_arch;