реклама на сайте
подробности

 
 
> помогите в написании кода
xamsid
сообщение Jul 31 2009, 08:20
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 31-07-09
Пользователь №: 51 682



изучаю плис в течении 1 недели, пытаюсь изучить путем решения не сложных задач , научился делать один строго один импульс по нажатию кнопки вот пример кода
Код
entity sig is
    Port ( CLK : in  STD_LOGIC;
           btn : in  STD_LOGIC;
           vix : out  STD_LOGIC);
end sig;

architecture Behavioral of sig is
signal a: std_logic_vector(1 DOWNTO 0):="00" ;
begin
    process (CLK)
        begin
        if rising_edge(CLK) then    
           a<= a(0) & btn;
            if (a = "01") then                
                       vix <= '1';
            else    vix <= '0';
        end if;    
        end if;
    end process;
end Behavioral;

не получается разобратся как сделать 2 импульса разной длинны по нажатию кнопки, причем если кнопку удерживать сигнал должен все равно прикратится. crying.gif
за ранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Maverick
сообщение Jul 31 2009, 08:42
Сообщение #2


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(xamsid @ Jul 31 2009, 11:20) *
изучаю плис в течении 1 недели, пытаюсь изучить путем решения не сложных задач , научился делать один строго один импульс по нажатию кнопки вот пример кода

не получается разобратся как сделать 2 импульса разной длинны по нажатию кнопки, причем если кнопку удерживать сигнал должен все равно прикратится. crying.gif
за ранее спасибо.

Желательно вначале поставить схемку из двух триггеров которая б убирала дребезг контакта кнопки, затем поставить схемку которая фиксировала бы нажатие кнопки, т.е. выдавала бы одиночный импульс (так называемый детектор переднего/заднего форнта импульса), после поставить схемку которая по приходу одиночного импульса заускала счетчик тактовой частоты и как только счетчик набрал необходимое количество импульсов тактовой частоты переставал работать.
Таким оразом можно формировать импульсы различной длительности с помощью дешифратора и JK-тригера.
Примерно таким я вижу ход разработки схемы для Вашего ответа.
ЗЫ под "поставить схемку" = схема описанная на VHDL = схема в нарисованная в схематикедитре
ЗЫ ЗЫ это в том случае если подойти к задаче так как надо. Если упрощенный вариант, тогда схемкой из двух триггеров которая б убирала дребезг контакта кнопки можно пренебречь
Причина редактирования: Излишнее цитирование.


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
xamsid
сообщение Jul 31 2009, 10:24
Сообщение #3





Группа: Новичок
Сообщений: 3
Регистрация: 31-07-09
Пользователь №: 51 682



Цитата(Maverick @ Jul 31 2009, 12:42) *
Желательно вначале поставить схемку из двух триггеров которая б убирала дребезг контакта кнопки, затем поставить схемку которая фиксировала бы нажатие кнопки, т.е. выдавала бы одиночный импульс (так называемый детектор переднего/заднего форнта импульса), после поставить схемку которая по приходу одиночного импульса заускала счетчик тактовой частоты и как только счетчик набрал необходимое количество импульсов тактовой частоты переставал работать.

Спасибо за ответ, но мне все же не понятно ( 1 неделя как вижу код )
Если ли очень простой вариант написания кода для двух одинаковых импульсов?
Просто хочу посмотреть логику реализации.
С длительностью я уже позаморачиваюсь.
Позалуста unsure.gif
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post
=AK=
сообщение Jul 31 2009, 12:51
Сообщение #4


pontificator
******

Группа: Свой
Сообщений: 3 055
Регистрация: 8-02-05
Из: страны Оз
Пользователь №: 2 483



Цитата(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;
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 17:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016