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

 
 
> Нужна помощь. Обработка группы кнопок с применение процедур
seldim
сообщение Apr 9 2012, 16:15
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



Есть задача: 30 кнопок на входе - вектор А, на выходе должна быть информация о нажатии кнопки после фильта (антидребезг) вектор В и информация о залипании кнопок (фильтра на залипание) - вектор С. Как решить задачу в лоб понятно, но вот как ее решить не создавая кучу переменных. Я анализирую каждый бит входного вектора и создаю на каждый из них кучу переменных, счетчиков для фильтров. В результате код громадный и наверняка могут быть ошибки. Нет лист с виду правильный но почемуто есть взаимное влияние входов на реальной железке. Хочется переписать грамотно.
С процедурами и функциями пока не работал. Если кто может подскажите как их правильно применить для данной задачи или какие есть альтернативные методы. Рабосаю с VHDL.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 21)
vetal
сообщение Apr 9 2012, 16:25
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



1. Реализуйте нужную задачу для одной кнопки.
2. Размножте реализацию на нужное количество книпок.
3. Вынесите общие элементы за скобку.
Go to the top of the page
 
+Quote Post
R.A.K.
сообщение Apr 9 2012, 16:27
Сообщение #3


Участник
*

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180



Сути задачи, честно говоря, не понял, но может Вам лучше попробовать generate?
Go to the top of the page
 
+Quote Post
seldim
сообщение Apr 9 2012, 17:03
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



Для одной кнопки все реализовано, но когда начинаю код распространять на все 30 кнопок код разрастается количество переменных увеличивается в 30 раз. Вот generate можно попробовать только осталось с ним разобраться.

Кто нибудь может дать пример простой и понятный как использовать generate
Go to the top of the page
 
+Quote Post
Builder
сообщение Apr 9 2012, 18:14
Сообщение #5


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



Цитата(seldim @ Apr 9 2012, 19:15) *
Есть задача: 30 кнопок на входе - вектор А, на выходе должна быть информация о нажатии кнопки после фильта (антидребезг) вектор В и информация о залипании кнопок (фильтра на залипание) - вектор С. Как решить задачу в лоб понятно, но вот как ее решить не создавая кучу переменных. Я анализирую каждый бит входного вектора и создаю на каждый из них кучу переменных, счетчиков для фильтров. В результате код громадный и наверняка могут быть ошибки. Нет лист с виду правильный но почемуто есть взаимное влияние входов на реальной железке. Хочется переписать грамотно.
С процедурами и функциями пока не работал. Если кто может подскажите как их правильно применить для данной задачи или какие есть альтернативные методы. Рабосаю с VHDL.
Ещё, как вариант - использовать что-то типа пикоблаза, если работаете на ксалинксе. Не переносимо, зато удобно.
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 9 2012, 18:15
Сообщение #6


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(Builder @ Apr 9 2012, 13:14) *
Не переносимо, зато удобно.

вообще то переносимо wink.gif и уже давно


--------------------
Go to the top of the page
 
+Quote Post
R.A.K.
сообщение Apr 9 2012, 18:23
Сообщение #7


Участник
*

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180



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

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


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

Интрига! sm.gif Может наводку дадите? (можно даже на водку biggrin.gif )
Go to the top of the page
 
+Quote Post
Builder
сообщение Apr 9 2012, 18:35
Сообщение #8


iBuilder©
****

Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322



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

тем кто хочет посмотреть, изучите ссылку:
http://electronix.ru/forum/index.php?showtopic=67269
Go to the top of the page
 
+Quote Post
seldim
сообщение Apr 10 2012, 02:08
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



ПРоцессор не подойдет нужно сделать все на внутренней логике.
Go to the top of the page
 
+Quote Post
dm.pogrebnoy
сообщение Apr 10 2012, 03:09
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 747
Регистрация: 11-04-07
Пользователь №: 26 933



Цитата(seldim @ Apr 10 2012, 06:08) *
ПРоцессор не подойдет нужно сделать все на внутренней логике.


Формально picoblaze - конечный автомат выполненный на внутренней логике.


--------------------
Go to the top of the page
 
+Quote Post
XVR
сообщение Apr 10 2012, 10:14
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Делаете RAM на 30 ячеек, каждая хранит состояние (и счетчики) для каждого входа. Далее делаете КА который сканирует ваши входы и обрабатывает каждый их них, используя ячейку в RAM для хранения всех переменных.
Будет очень компактно
Go to the top of the page
 
+Quote Post
Leka
сообщение Apr 10 2012, 11:46
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 075
Регистрация: 30-09-05
Пользователь №: 9 118



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

Алгоритм на Си какой?
Go to the top of the page
 
+Quote Post
Leka
сообщение Apr 10 2012, 13:29
Сообщение #13


Профессионал
*****

Группа: Участник
Сообщений: 1 075
Регистрация: 30-09-05
Пользователь №: 9 118



Думал, задачка подходящая для отладки синтеза Си --> 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;
Go to the top of the page
 
+Quote Post
seldim
сообщение Apr 10 2012, 15:00
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



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

Можно ли в Qvartus 11.1 переместить место физической реализации счетчиков в ПЛИС?
Go to the top of the page
 
+Quote Post
R.A.K.
сообщение Apr 10 2012, 16:32
Сообщение #15


Участник
*

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180



Цитата(seldim @ Apr 10 2012, 19:00) *
Си не знаю, но судя по написанному вроде похоже на правду только для VHDL будет отличаться. Буду пробовать generate.

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

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

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

Сообщение отредактировал R.A.K. - Apr 10 2012, 16:34
Go to the top of the page
 
+Quote Post
seldim
сообщение Apr 10 2012, 17:33
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



С последовательным резистором самый правильный вариант но еть проблема корпус 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';




Сообщение отредактировал seldim - Apr 10 2012, 17:28
Go to the top of the page
 
+Quote Post
R.A.K.
сообщение Apr 10 2012, 18:04
Сообщение #17


Участник
*

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180



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

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

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

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

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


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

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

Предложение посмотреть пример использования generic в сорцах пикоблэйза еще в силе. Их там много (только на FPGA смотрите, не берите на CPLD).

Сообщение отредактировал R.A.K. - Apr 10 2012, 18:07
Go to the top of the page
 
+Quote Post
seldim
сообщение Apr 11 2012, 01:54
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



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

А насчет книжек полное название подскажете?
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Apr 11 2012, 04:22
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



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

Не смешивайте в одном условии детектор клока и enable, это плохой стиль кодироваания.
Go to the top of the page
 
+Quote Post
seldim
сообщение Apr 11 2012, 15:20
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



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

А что в этом плохого?
Go to the top of the page
 
+Quote Post
R.A.K.
сообщение Apr 11 2012, 16:07
Сообщение #21


Участник
*

Группа: Validating
Сообщений: 55
Регистрация: 6-04-11
Пользователь №: 64 180



Цитата(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.
Go to the top of the page
 
+Quote Post
seldim
сообщение Apr 11 2012, 18:30
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



Спасибо за пример. Вот это действительно компактный код. И ненужен никакой пикоблайз :-)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 06:53
Рейтинг@Mail.ru


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