|
Нужна помощь. Обработка группы кнопок с применение процедур |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 21)
|
Apr 9 2012, 16:27
|
Участник

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

|
Сути задачи, честно говоря, не понял, но может Вам лучше попробовать generate?
|
|
|
|
|
Apr 9 2012, 18:23
|
Участник

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

|
Цитата(Builder @ Apr 9 2012, 22:14)  Ещё, как вариант - использовать что-то типа пикоблаза, если работаете на ксалинксе. Не переносимо, зато удобно. Или даже взять сорцы пикоблэйза в качестве простого и понятного примера generate Цитата(des00 @ Apr 9 2012, 22:15)  вообще то переносимо  и уже давно Интрига!  Может наводку дадите? (можно даже на водку  )
|
|
|
|
|
Apr 9 2012, 18:35
|
iBuilder©
   
Группа: Свой
Сообщений: 519
Регистрация: 14-07-04
Из: Минск
Пользователь №: 322

|
Цитата(des00 @ Apr 9 2012, 21:15)  вообще то переносимо  и уже давно Да, есть, видел. Но как-то по ресурсам многовато жрёт, на той-же альтере. Но как я понял на 5-м циклоне уже можно будет делать что-то близкое. тем кто хочет посмотреть, изучите ссылку: http://electronix.ru/forum/index.php?showtopic=67269
|
|
|
|
|
Apr 10 2012, 13:29
|
Профессионал
    
Группа: Участник
Сообщений: 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;
|
|
|
|
|
Apr 10 2012, 16:32
|
Участник

Группа: 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
|
|
|
|
|
Apr 10 2012, 17:33
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 10 2012, 18:04
|
Участник

Группа: 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 кнопок по одному компоненту. Цепи кнопок для этого удобнее объединить в шину. Фактически это будет просто список цепей, но получиться очень компактный код. Попутно. Код можно обрамлять Код ... и тогда он будет выглядеть так . Попутнее. Я не уверен, что способ ввода обрабатываемх сигналов через асинхронный сброс является устойчивым и живучим методом. Я о метастабильности. Местные гуру, надеюсь, меня поправят (или поддержат  ). Предложение посмотреть пример использования generic в сорцах пикоблэйза еще в силе. Их там много (только на FPGA смотрите, не берите на CPLD).
Сообщение отредактировал R.A.K. - Apr 10 2012, 18:07
|
|
|
|
|
Apr 11 2012, 15:20
|
Частый гость
 
Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142

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

Группа: 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)  А сам квартус вроде слышал допускает вообще список чуствительности не указывать, но решил писать все и в дальнейшем при описании кода самому проще будет. И да, и нет.  Цитата(seldim @ Apr 11 2012, 05:54)  А насчет книжек полное название подскажете? Разумеется.  Е.А. Суворова, Ю.Е. Шейнин "Проектирование цифровых систем на VHDL". Вам конкретно нужен раздел "Структурное описание объекта моделирования" (глава 3, стр.110). Слова "объекта моделирования" пусть Вас не смущают  .
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|