MVV, я здесь время с корыстью вообще никогда не провожу.
А что, обучение ты будешь оплачивать? Или уже сразу преподавать там будешь? :)
Вид для печати
MVV, я здесь время с корыстью вообще никогда не провожу.
А что, обучение ты будешь оплачивать? Или уже сразу преподавать там будешь? :)
При работе с ПЛИС рано или поздно нужно будет знакомиться с конечными автоматами (state mashine), думаю на примере антидребезга можно и ознакомиться с этой парадигмой программирования.
В принципе там ничего сложного и вкратце работу алгоритма антидребезга на конечном автомате можно описать пимерно так:
1. есть несколько устойчивых состояний - в данном случае их два.
2. для перехода из одного состояния в другое должны опрашиваться какие-то внешние события, либо соблюдение условий.
Под спойлером готовый фрагмент программы антидребезга, но попробуй сначала сам что-нибудь написать)
Скрытый текст
Можно конечно сам сигнал state использовать как output, но для наглядности ввёл его отдельно.Код:signal input: std_logic;
signal output: std_logic;
signal state: std_logic:=0;
signal counter: std_logic_vector (7 downto0):= '00000000';
process (clk,input,state)
if rising_edge(clk) then
if state = '0' then
if input='1' then
state <='1' ;
output<='1';
endif
else
counter <= counter +1;
if counter = '11111111' then
output<='0';
state<='0';
endif;
endif;
end if;
end process;
[свернуть]
Не? такой вариант не годится?Код:process(CLK,In_put,cnt)
begin
if (rising_edge(CLK)) then
if (In_put = x"3F") then -- ни одна из десяти кнопок не нажата, везде высокий
cnt <= "0000000000";
elsif (cnt /= 255) then -- счет до 255, и на этом тормозимся.
cnt <= cnt+1;
end if;
if (cnt = 255) then
Out_put <= not In_put; -- если дотикало, то на выход - единица в разр. нажатой кнопы.
end if;
end if;
end process;
---------- Post added at 15:26 ---------- Previous post was at 15:19 ----------
Не, я еще слишком маленький и глупый. Просто делюсь тем, чему сам научился. В том числе и благодаря тебе :)
У вас код антидребезга нерабочий.
Поясню:
1. код, который в процессе просто увеличивает счётчик когда на вход поступает '1', а так как '1' на входе будет появляться хаотично в течение небольшого промежутка времени, то и счетчик будет увеличиваться так же неравномерно - больше тот код ничего другого не делает.
2. int1_0 будет все время в единице, кроме одного периода тактовой когда счётчик будет в нулях.
в общем код нерабочий - я уже запутался - там вход сканируется только 1 период клока, а 255 клоков никак не влияет на результат.
смысл антидребезга немного по другому устроен:
1. ждём на входе '1' - если да идём к п.2
2. 256 (или сколько надо) периодов клока безразличны ко входу, после чего переходим к п.1.
К моему последнему варианту тоже относится?
---------- Post added at 15:43 ---------- Previous post was at 15:41 ----------
Пораскинув мозгами, да... Если проскочит ноль при зафиксированном уже нажатии, то всё начнется заново, со сброса в ноль выходного сигнала...
Надо отлавливать и нажатие, и отпускание.
Виктор, ты бы хоть источники указывал... Или названия сигналов свои придумывал :)
Скрытый текст
Код:if a=b then
c:=a;
elsif b<c then
d:=b;
b:=c;
else
do_it;
end if;
Learning By Example Using VHDL Advanced Digital Design With a Nexys 2 FPGA BoardКод:If statements may be used to specify conditional assignments or state transitions in a finite state machine:
case READ_CPU_STATE is
when WAITING =>
if CPU_DATA_VALID = '1' then
CPU_DATA_READ <= '1';
READ_CPU_STATE <= DATA1;
end if;
when DATA1 =>
-- other branches of the case statement
end case;
http://dl.rutracker.org/forum/dl.php?t=3701607
Digital Design Using Diligilent FPGA Boards VHDL/Active-HDL Edition
http://dl.rutracker.org/forum/dl.php?t=3701599
[свернуть]