Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нужна помощь. Обработка группы кнопок с применение процедур
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
seldim
Есть задача: 30 кнопок на входе - вектор А, на выходе должна быть информация о нажатии кнопки после фильта (антидребезг) вектор В и информация о залипании кнопок (фильтра на залипание) - вектор С. Как решить задачу в лоб понятно, но вот как ее решить не создавая кучу переменных. Я анализирую каждый бит входного вектора и создаю на каждый из них кучу переменных, счетчиков для фильтров. В результате код громадный и наверняка могут быть ошибки. Нет лист с виду правильный но почемуто есть взаимное влияние входов на реальной железке. Хочется переписать грамотно.
С процедурами и функциями пока не работал. Если кто может подскажите как их правильно применить для данной задачи или какие есть альтернативные методы. Рабосаю с VHDL.
vetal
1. Реализуйте нужную задачу для одной кнопки.
2. Размножте реализацию на нужное количество книпок.
3. Вынесите общие элементы за скобку.
R.A.K.
Сути задачи, честно говоря, не понял, но может Вам лучше попробовать generate?
seldim
Для одной кнопки все реализовано, но когда начинаю код распространять на все 30 кнопок код разрастается количество переменных увеличивается в 30 раз. Вот generate можно попробовать только осталось с ним разобраться.

Кто нибудь может дать пример простой и понятный как использовать generate
Builder
Цитата(seldim @ Apr 9 2012, 19:15) *
Есть задача: 30 кнопок на входе - вектор А, на выходе должна быть информация о нажатии кнопки после фильта (антидребезг) вектор В и информация о залипании кнопок (фильтра на залипание) - вектор С. Как решить задачу в лоб понятно, но вот как ее решить не создавая кучу переменных. Я анализирую каждый бит входного вектора и создаю на каждый из них кучу переменных, счетчиков для фильтров. В результате код громадный и наверняка могут быть ошибки. Нет лист с виду правильный но почемуто есть взаимное влияние входов на реальной железке. Хочется переписать грамотно.
С процедурами и функциями пока не работал. Если кто может подскажите как их правильно применить для данной задачи или какие есть альтернативные методы. Рабосаю с VHDL.
Ещё, как вариант - использовать что-то типа пикоблаза, если работаете на ксалинксе. Не переносимо, зато удобно.
des00
Цитата(Builder @ Apr 9 2012, 13:14) *
Не переносимо, зато удобно.

вообще то переносимо wink.gif и уже давно
R.A.K.
Цитата(Builder @ Apr 9 2012, 22:14) *
Ещё, как вариант - использовать что-то типа пикоблаза, если работаете на ксалинксе. Не переносимо, зато удобно.

Или даже взять сорцы пикоблэйза в качестве простого и понятного примера generate sm.gif


Цитата(des00 @ Apr 9 2012, 22:15) *
вообще то переносимо wink.gif и уже давно

Интрига! sm.gif Может наводку дадите? (можно даже на водку biggrin.gif )
Builder
Цитата(des00 @ Apr 9 2012, 21:15) *
вообще то переносимо wink.gif и уже давно
Да, есть, видел. Но как-то по ресурсам многовато жрёт, на той-же альтере.
Но как я понял на 5-м циклоне уже можно будет делать что-то близкое.

тем кто хочет посмотреть, изучите ссылку:
http://electronix.ru/forum/index.php?showtopic=67269
seldim
ПРоцессор не подойдет нужно сделать все на внутренней логике.
dm.pogrebnoy
Цитата(seldim @ Apr 10 2012, 06:08) *
ПРоцессор не подойдет нужно сделать все на внутренней логике.


Формально picoblaze - конечный автомат выполненный на внутренней логике.
XVR
Делаете RAM на 30 ячеек, каждая хранит состояние (и счетчики) для каждого входа. Далее делаете КА который сканирует ваши входы и обрабатывает каждый их них, используя ячейку в RAM для хранения всех переменных.
Будет очень компактно
Leka
Цитата(seldim @ Apr 9 2012, 20:15) *
Есть задача: 30 кнопок на входе - вектор А, на выходе должна быть информация о нажатии кнопки после фильта (антидребезг) вектор В и информация о залипании кнопок (фильтра на залипание) - вектор С.

Алгоритм на Си какой?
Leka
Думал, задачка подходящая для отладки синтеза Си --> HDL,
а там, вроде, и автомата то никакого нет - неинтересно получается
(код набросал только для первичной грубой оценки - м/б не рабочим):
Код
static int in, out, bad, max1, max2;
tst(){
    static int new, old, cnt[32];
    static int i=0;
    int sel;

    while(1){
        new=new|(in^old);
        old=in;
        sel=1<<i;
        if(new&sel){
            cnt[i]=0;
            bad&=~sel;
        }else{
            if(cnt[i]>max1)
                out=(out&~sel)|(new&sel);
            if(cnt[i]<max2)
                cnt[i]++;
            else
                bad|=sel;
        }        
        new&=~sel;
        i++;
    }
}


i&=31;
seldim
Си не знаю, но судя по написанному вроде похоже на правду только для VHDL будет отличаться. Буду пробовать generate.
Сейчас проблема перешла немного в другую плоскость. Была ошибка в схеме - на выход сиклона 4 (3.3 В режим выхода) посадил на прямую полевик IRF7103 (300pF по входу) как результат полный абзац внутри ПЛИС при включении транзисторов. Перевел выхода в открытый коллектор, сделал подтяжку слало лучше но не совсем. Обнаружил интересный эфект - при включении транзисторов сбрасываются счетчики - фильтры обработки кнопок, так что оказалась ошибка не в грамоздком коде а в схемотехнике. Остальная часть плис управляющая внешним контроллером работает, хотя там логика покруче чем в обработке кнопок. Буду искать метод как побороть сброс счетчиков.

Можно ли в Qvartus 11.1 переместить место физической реализации счетчиков в ПЛИС?
R.A.K.
Цитата(seldim @ Apr 10 2012, 19:00) *
Си не знаю, но судя по написанному вроде похоже на правду только для VHDL будет отличаться. Буду пробовать generate.

Вы лучше выложите здесь свой код для одной кнопки.

Цитата(seldim @ Apr 10 2012, 19:00) *
Можно ли в Qvartus 11.1 переместить место физической реализации счетчиков в ПЛИС?

Chip Planner, я полагаю. Quartus HandBook Vol.2 наверное. ПМСМ, это лишнее, если в схеме затык. А последовательно резистор к затвору пробовали? Открытый коллектор с подтяжкой не спасает при выключении транзистора (т.е. разряде емкости).
seldim
С последовательным резистором самый правильный вариант но еть проблема корпус BGA, выходов 20, плата маленькая. Оставлю напоследок. Сначала попробую исключить одновременное переключение транзисторов(как времянку), а в дальнейшем переразводку сделаю и дополнительно буфера поставлю. До этого эти функции обработки кнопок и управления транзисторами выполнял процессор через ПЛИС EPM7128. Она настолько дубовая что с транзисторами легко спавлялась. Убрал проц, поставил циклон и наткнулся на сложности, но думаю оно того стоило. При увеличении каоличества входов и выходов получил 5-и кратное сокращение потребляемой мощности на циклоне.



Цитата(R.A.K. @ Apr 10 2012, 20:32) *
Вы лучше выложите здесь свой код для одной кнопки.


Chip Planner, я полагаю. Quartus HandBook Vol.2 наверное. ПМСМ, это лишнее, если в схеме затык. А последовательно резистор к затвору пробовали? Открытый коллектор с подтяжкой не спасает при выключении транзистора (т.е. разряде емкости).

Код следующий

------------------------------ Переменные для обработки кнопки 1 --------------------
signal bt1 : std_logic;
signal en_bt1 : std_logic;
signal er_bt1 : std_logic;
signal start_bt1_count : std_logic;
signal bt1_count : integer range 0 to 31 := 0;
signal bt1_er_count : integer range 0 to 15 := 0;
.
.
.
------------------------------ Обработка кнопки 1 --------------------------------------------------------------------
------------------------------ Антидребезг 0.03 сек ---------------------------------
PROCESS (bt1, CLK_610_Hz, bt1_count)
BEGIN
if bt1 = '1' then bt1_count <= 0;
elsif CLK_610_Hz 'EVENT and CLK_610_Hz = '1' and bt1_count < 18 THEN
bt1_count <= bt1_count + 1;
end if;
END PROCESS;

en_bt1 <= '1' when bt1_count = 18 else '0';

----------------------------- Проверка на залипание 5 сек ---------------------------

PROCESS (bt1, CLK_2_Hz, bt1_er_count)
BEGIN
if bt1 = '1' then bt1_er_count <= 0;
elsif CLK_2_Hz 'EVENT and CLK_2_Hz = '1' and bt1_er_count < 13 THEN
bt1_er_count <= bt1_er_count + 1;
end if;
END PROCESS;

er_bt1 <= '1' when bt1_er_count = 13 else '0';


R.A.K.
Цитата(seldim @ Apr 10 2012, 21:33) *
Код следующий

Ок. (тянет придраться к наличию bt1_count и bt1_er_count в списках чувствительности).

Что такое module instantiation знаете/умеете?
component, port map...

Если нет, то почитайте. Могу Суворова, Шейнин порекомендовать.

Если да, то пишите еще один модуль, в нем будете использовать компонент "сканер одной кнопки "(его код Вы только что привели выше). С помощью generic в цикле подключите на каждую из 30 кнопок по одному компоненту. Цепи кнопок для этого удобнее объединить в шину. Фактически это будет просто список цепей, но получиться очень компактный код.


Попутно. Код можно обрамлять
Код
... и тогда он будет выглядеть так
.

Попутнее. Я не уверен, что способ ввода обрабатываемх сигналов через асинхронный сброс является устойчивым и живучим методом. Я о метастабильности. Местные гуру, надеюсь, меня поправят (или поддержат sm.gif).

Предложение посмотреть пример использования generic в сорцах пикоблэйза еще в силе. Их там много (только на FPGA смотрите, не берите на CPLD).
seldim
bt1_count и bt1_er_count в списках чувствительности вставлял по просьбе Qvartusa, чтоб варнингов меньше было, а кокда пытался с моделсимом работать так он код VHDL (не гейт левел) вообще както плохо отрабатывал, если в список не включить все , что влияет на сигнал. А сам квартус вроде слышал допускает вообще список чуствительности не указывать, но решил писать все и в дальнейшем при описании кода самому проще будет.

А насчет книжек полное название подскажете?
andrew_b
Цитата(seldim @ Apr 11 2012, 04:54) *
bt1_count и bt1_er_count в списках чувствительности вставлял по просьбе Qvartusa, чтоб варнингов меньше было, а кокда пытался с моделсимом работать так он код VHDL (не гейт левел) вообще както плохо отрабатывал, если в список не включить все , что влияет на сигнал.

Не смешивайте в одном условии детектор клока и enable, это плохой стиль кодироваания.
seldim
Цитата(andrew_b @ Apr 11 2012, 08:22) *
Не смешивайте в одном условии детектор клока и enable, это плохой стиль кодироваания.

А что в этом плохого?
R.A.K.
Цитата(seldim @ Apr 11 2012, 05:54) *
bt1_count и bt1_er_count в списках чувствительности вставлял по просьбе Qvartusa, чтоб варнингов меньше было, а кокда пытался с моделсимом работать так он код VHDL (не гейт левел) вообще както плохо отрабатывал, если в список не включить все , что влияет на сигнал.

???
CODE

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity bt_cntrl is
port (
bt : in std_logic;
clk_610_Hz : in std_logic;
clk_2_Hz : in std_logic;
en_bt : out std_logic;
err_bt : out std_logic);
end bt_cntrl;

architecture bt_cntrl of bt_cntrl is

signal bt_cnt : integer range 0 to 31 := 0;
signal bt_err_cnt : integer range 0 to 15 := 0;

begin

process (bt, clk_610_Hz)
begin
if bt = '1' then
bt_cnt <= 0;
elsif clk_610_Hz 'event and clk_610_Hz = '1' then
if bt_cnt < 18 then
bt_cnt <= bt_cnt + 1;
end if;
end if;
end process;

process (bt, clk_2_Hz)
begin
if bt = '1' then
bt_err_cnt <= 0;
elsif clk_2_Hz 'event and clk_2_Hz = '1' then
if bt_err_cnt < 13 then
bt_err_cnt <= bt_err_cnt + 1;
end if;
end if;
end process;

en_bt <= '1' when bt_cnt = 18 else '0';
err_bt <= '1' when bt_err_cnt = 13 else '0';

end bt_cntrl;

----------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity keyboard_cntrl is
port (
bt : in std_logic_vector(0 to 29);
clk_610_Hz : in std_logic;
clk_2_Hz : in std_logic;
en_bt : out std_logic_vector(0 to 29);
err_bt : out std_logic_vector(0 to 29));
end keyboard_cntrl;

architecture keyboard_cntrl of keyboard_cntrl is

component bt_cntrl is
port (
bt : in std_logic;
clk_610_Hz : in std_logic;
clk_2_Hz : in std_logic;
en_bt : out std_logic;
err_bt : out std_logic);
end component bt_cntrl;

begin

BUTTONS : for i in 0 to 29 generate
buttom : bt_cntrl
port map(
bt => bt(i),
clk_610_Hz => clk_610_Hz,
clk_2_Hz => clk_2_Hz,
en_bt => en_bt(i),
err_bt => err_bt(i));
end generate BUTTONS;

end keyboard_cntrl;


Нажмите для просмотра прикрепленного файла


Цитата(seldim @ Apr 11 2012, 05:54) *
А сам квартус вроде слышал допускает вообще список чуствительности не указывать, но решил писать все и в дальнейшем при описании кода самому проще будет.

И да, и нет. sm.gif

Цитата(seldim @ Apr 11 2012, 05:54) *
А насчет книжек полное название подскажете?

Разумеется. sm.gif
Е.А. Суворова, Ю.Е. Шейнин "Проектирование цифровых систем на VHDL".
Вам конкретно нужен раздел "Структурное описание объекта моделирования" (глава 3, стр.110).
Слова "объекта моделирования" пусть Вас не смущают sm.gif.
seldim
Спасибо за пример. Вот это действительно компактный код. И ненужен никакой пикоблайз :-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.