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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Нужна помощь. Обработка группы кнопок с применение процедур
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 Текстовая версия Сейчас: 8th July 2025 - 21:38
Рейтинг@Mail.ru


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