Цитата(xamsid @ Jul 31 2009, 19:54)

Если ли очень простой вариант написания кода для двух одинаковых импульсов?
Я не очень хорошо понял, что вы хотите. Попробую ответить в боее-менее общем виде.
Самое простое и бронебойно-правильное решение состоит в том, чтобы передать неизвестно-какие сигналы (от кнопок и т.п.) во временное пространство вашего основного клока CLK, а дальше работать в нем. Передача сигнала производится при помощи 2-х или 3-х каскадного "синхронизатора", ктороый представляет собой по сути просто сдвиговый регистр. В примере внизу я обрабатываю 2 входных сигнала Button1_i и Button2_i совершенно одинаково по сути, но по-разному в написании, получая сигналы button1 и button2
Два замечания к представленному коду:
- Я сознательно предпочитаю где можно пользоваться переменными (variable), а не сигналами (signal), посколку переменные более локальны и за пределами процесса не видны
- Отступы надо "беречь" и пользоваться ими экономно. Основная цель состоит в том, чтобы повысить читаемость текста, а не в том, чтобы долбить по клавишам
Код
resync_pro : process(CLK)
variable b0,b1: std_logic;
variable bb : std_logic_vector(1 downto 0);
begin
if rising_edge(CLK) then
button1<=b1; b1:=b0; b0:= Button1_i; -- сдвиговый регистр "собран из кусочков", так удобно писАть, когда он короткий
button2<=bb(1); bb:=bb(0) & Button2_i; -- сдвиговый регистр в основном сделан вторым выражением, его можно было сделать любой длины
end if; -- CLK
end process resync_pro;
Предположим, что входы Button1_i и Button2_i приходят от одной кнопки с контактом "на переключение", которая замыкает Button1_i на землю при нажатиии кнопки, или замыкает Button2_i на землю при отпускании кнопки (конечно, на входы навешены подтягивающие резисторы). Тогда подавление дребезга элементарно обеспечивается простым RS-триггером. Результирующий сигнал назовем button
Код
debounce_pro : process(CLK)
begin
if rising_edge(CLK) then
if ( button1='0') then
button<='1'; -- кнопка нажата
elsif ( button2='0') then
button<='0'; -- кнопка отжата
end if;
end if; -- CLK
end process debounce_pro;
Теперь создадим короткие импульсы длительностью 1 клок по нажатию кнопки (назовем его button_re, где re означает "rising edge") и по отпусканию кнопки (назовем его button_fe, где fe означает "falling edge")
Код
edges_pro : process(CLK)
variable b :std_logic;
begin
if rising_edge(CLK) then
------------------------
-- rising edge
------------------------
if (button='1') and (b='0') then
button_re<='1';
else
button_re<='0';
end if;
------------------------
-- falling edge
------------------------
if (button='0') and (b='1') then
button_fe<='1';
else
button_fe<='0';
end if;
------------------------
-- 1-битный сдвиговый регистр
------------------------
b:=button; -- это должно быть в конце процесса, а не в начале
end if; -- CLK
end process edges_pro;
Напоследок сделаем простенький одновибратор, запускаемый по одному из фронтов. Второй такой же, запускается по другому фронту.
Выходной сигнал назовем Pulse1_o
Код
pulse1_pro : process(CLK)
variable cnt : unsigned(7 downto 0);
begin
if rising_edge(CLK) then
-------------------------
-- по фронту
-------------------------
if (button_re='1') then
cnt := (others => '0'); -- обнулили счетчик
Pulse1_o <= '1'; -- запустили вых. импульс
-------------------------
-- считаем до тех пор, пока старший разряд счетчика равен 0
-------------------------
elsif (cnt(7)='0') then
if (to_integer(cnt)=55) then -- когда счетчик отсчитал нужное нам число клоков
Pulse1_o <= '0'; -- закончили вых. импульс
end if;
cnt := cnt+1; -- считаем клоки
end if;
end if; -- CLK
end process pulse1_pro;