Цитата
а на VHDL можно? или в схематике? я мало что понял из программы.
Ну барин, тут помощник нужен... я ща по памяти правильно на VHDL не напишу, опишу словами%)
выделение фронта - это 2 D триггера идущие друг за другом на одном клоке, один фиксирует текущее состояние входа, другой текущее состояние этого триггера, фактически прошлое состояние входа. Когда один из них 0, другой 1 - значит это фронт.
Дальше есть еще счетчик (счетчик - считает),
Если счетчик 0 и на триггерах описанных выше фронт, - это нажатие кнопки, как только мы это получили в счетчик загружается какое-то число и он начинает считать к 0. Тем самым пропускает все следующие фронты пока не досчитает до 0.
Дребезг - это много много много фронтов, первый мы поймаем, запустим счетчик, обработаем нажатие, а последующие пропустим, так как счетчик будет считать.
Величина счетчика определяет задержку, малая величина пропустить дребезг, большая снизит реакцию на повторное нажатие кнопки, ищите баланс.
Цитата
и что такое метастабильность?
Знание того что это отличает новичка от мастера
Изначально понятие означает некое кривое состояние схемы. На пальцах Представьте себе Д триггер, на входе которого меняется сигнал
каждый клок он защелкивает текущее состояние на входе, на входе 1 - на выходе 1, на входе 0 - на выходе 0. А теперь представьте что клок попал ровно на смену сигнала, то есть грубо на входе было 0.5, клок щелкнул и на выходе триггера будет 0.5, то есть какой-то залипший уровень, который часть схемы поймет как 1, а часть как 0, а по сути это ни 0 и ни 1.
Вот это состояние называется мета-стабильностью, к счастью оно не вечно и триггер в скором времени свалиться в одно из правильных устойчивых состояний....
Чтобы себя защитить от этого ставят 2 триггера друг за другом. В момент клока 1 триггер берет значение сигнала, а 2 триггер значение первого. То есть на входе 2 триггера всегда верный сигнал. Если первый триггер поймает мета-стабильность, то с практически 100% вероятностью, к следующему фронту клока он уже будет в правильном устойчивом состоянии, и со вторым клоком в схему пойдет верное значение....
Но понятие мета-стабильность со временем расширилось до следующего.
представьте себе конструкцию (надеюсь правильно опишу, но думаю смысл вы поймете)
Код
if(clk'event and clk = 1)
if (InSignal = 1) then
А := 2;
B := 3;
endif
endif
для вас это одно условие по которому А станет 2 а В станет 3.
на самом деле это 2 схемы в кристале физически, А становиться 2 по клоку если сигнал 1, и В становиться 3 по клоку если сигнал 1. Теперь эти штуки могут быть в кристале где угодно и время распространения значения InSignal у них может быть разное. И если InSignal смениться очень близко к клоку, может так оказаться что первая схема получит его состояние как 0, а вторая как 1. То есть реально при таких схемах у вас может выполняться только часть условий, а другая нет.
Новичков при отладки это рубит насмерть

... Защита от этого очень простая, защелкнуть InSignal в триггер по фронту, а потом уже от этого одного элемента распространять сигнал на всю схему, пути этого распространения проверит синтезатор и все будет работать как положено.
Объединяя 1 и 2 получаем что на вход всех сигналов миняющихся черти как относительно клока просто надо ставить 2 д триггера и все будет хорошо....