-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Констрейны только для Xilinx давно писал, забыл напрочь. Для Альтеры мне еще не требовалось, хватало настроек по-умолчанию. I/O регистры - в особых случаях (клок или DDR выводить), надо мегафункции использовать, в простых - вроде как галочка где-то есть, не помню. Но для начала этим можно не заморачиваться. Но просто клок подцепить на выходной пин, прямо или через логику, - так делать в синхронном дизайне нельзя.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
Серый Волк
-
-
Не в сети
-
Давно я тут
-
-
Сообщений: 82
-
Спасибо получено: 2
-
-
-
|
Помогите чайнику...
Хочу сделать "антидребезговую" задержку в 1 мс (5 мс), для обработки каналов квадратурного энкодера.
написал свой опус:
Застрял на месте, где хочу разрешить работу счётчика, для деления тактовой до 1000 Гц (1 мс). Понимаю, что задание в условии по фронту - это мягко говоря злостное надругательство, но я хотел донести этим смысл. Собственно не знаю как описать в одном модуле, разбивать на несколько, чтобы запускать отдельный счётчик, не хотелось бы.
Спасибо.
PS: Блин! все комментарии искажены :( Как кодировку поправить?
Вот сам файл, если что:
Вложенный файл:
Имя файла:
encoder.txt
Размер файла:1 KB
"Холодает" - подумал Волк и натянул Красную Шапочку по самые уши...
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Серый Волк. Причина: файл не вставился
|
-
Chaosorg
-
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 312
-
Спасибо получено: 18
-
-
-
|
Серый Волк пишет: Застрял на месте, где хочу разрешить работу счётчика, для деления тактовой до 1000 Гц (1 мс). Понимаю, что задание в условии по фронту - это мягко говоря злостное надругательство, но я хотел донести этим смысл. Собственно не знаю как описать в одном модуле, разбивать на несколько, чтобы запускать отдельный счётчик, не хотелось бы.
Спасибо.
PS: Блин! все комментарии искажены :( Как кодировку поправить?
Вот сам файл, если что:
Вложенный файл:
Имя файла:
encoder.txt
Размер файла:1 KB
Я так понял, что posedge имеет смысл только внутри always, влияет на смысл always, а не является полноценным оператором, который можно везде писать. Поэтому в остальных местах надо фронт выделять самому. Для этого надо запоминать предыдущее значение интересующего сигнала и делать логическое И с его НЕ.
reg previous_CLK
wire CLK_pos_edge
wire CLK_neg_edge
assign CLK_pos_edge = CLK & ~previous_CLK
assign CLK_neg_edge = previous_CLK & ~CLK
естественно где-то внутри @always(posedge CLK)
надо сделать
previous_CLK <= CLK
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
И сколько повторять про синхронный дизайн?
CLK надо использовать _только_ в конструкциях вида: "always@(posedge CLK)", и больше _нигде_.
Для антидребезга можно просто считывать состояния входов в регистр с частотой 1КГц, по счетчику в том-же always.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Chaosorg
-
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 312
-
Спасибо получено: 18
-
-
-
|
Leka пишет: И сколько повторять про синхронный дизайн?
CLK надо использовать _только_ в конструкциях вида: "always@(posedge CLK)", и больше _нигде_.
Для антидребезга можно просто считывать состояния входов в регистр с частотой 1КГц, по счетчику в том-же always.
а как к такому отнесетесь?
reg previous_some_signal
wire some_signal_pos_edge
assign some_pos_edge = some_signal & ~previous_some_signal
@always(posedge CLK)
begin
previous_some_signal <= some_signal
end
P.S.
А что Ваш дребезг сделает, если на момент его анализа, проводимого с частотой 1КГц, на входе будет глитч очень короткий?
Про CLK действительно глупость написал - зачем у него posedge выделять, если для этого есть always. У меня в задаче надо было выделять фронт именно для неизвестного сигнала, асинхронного моей схеме - стал подсказывать по аналогии
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Серый Волк
-
-
Не в сети
-
Давно я тут
-
-
Сообщений: 82
-
Спасибо получено: 2
-
-
-
|
Народ, читайте внимательно - я же написал про то, что использовал перепад по фронту в условии специально - чтобы донести смысл, а не для того чтобы код с ним работал.
Как я понял без управления сторонним счётчиком на 1 кГц не обойтись?
В данном модуле у меня always уже занят опросом фронтов каналов энкодера.
"Холодает" - подумал Волк и натянул Красную Шапочку по самые уши...
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Chaosorg
-
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 312
-
Спасибо получено: 18
-
-
-
|
Серый Волк пишет: Народ, читайте внимательно - я же написал про то, что использовал перепад по фронту в условии специально - чтобы донести смысл, а не для того чтобы код с ним работал.
Как я понял без управления сторонним счётчиком на 1 кГц не обойтись?
В данном модуле у меня always уже занят опросом фронтов каналов энкодера.
почему Вы не хотите просто внутри одного always с Вашим самым быстрым клоком считать длительность положительных, например, площадок дребезжащего сигнала через q = q+1 , сбрасывая q на ноль если сигнал тоже упал на ноль? С отрицательными площадками тоже так же можно. А полезный сигнал брать из переменной, которую устанавливать в единицу или ноль если счетчики продолжительности площадок достигли какой-то величины определяющей силу антидребезга?
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Не надо подавать данные на тактовые входы триггеров, это делает дизайн асинхронным.
Надо так: module encoder_delay (CLK, A_in, B_in, A_out, B_out);
input CLK; // Вход тактовой частоты 100 МГц
input A_in, B_in; // Входы каналов квадратурного энкодера
output reg A_out, B_out; // Выходы каналов обработчика энкодера
localparam Fclk = 100000; // тактовая частота 100000 KГц
localparam ms = 1; // задержка 1 мс
localparam Time = Fclk * ms; // считаем делитель
reg [19:0] q; // Регистр счётчика задержки
always @(posedge CLK)
begin
q <= q + 1;
if(q >= Time) begin
q <= 0;
A_out <= A_in; // просто копируем значение из входа на выход
B_out <= B_in;
end
end
endmodule
Если нужна защита от импульсных помех/наводок, а не только антидребезг, надо какой-либо фильтр именно от импульсных помех. Дребезг от импульсных помех отличается тем, что переходные процессы возникают только при переключении.
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Последнее редактирование: от Leka.
|
-
Leka
-
-
Не в сети
-
Живу я здесь
-
-
Сообщений: 635
-
Спасибо получено: 54
-
-
|
Еще вариант - вводим "мертвое время" после переключения: module encoder_delay (CLK, A_in, B_in, A_out, B_out);
input CLK; // Вход тактовой частоты 100 МГц
input A_in, B_in; // Входы каналов квадратурного энкодера
output reg A_out, B_out; // Выходы каналов обработчика энкодера
localparam Fclk = 100000; // тактовая частота 100000 KГц
localparam ms = 1; // задержка 1 мс
localparam Time = Fclk * ms; // считаем делитель
reg [19:0] q; // Регистр счётчика задержки
always @(posedge CLK) begin
if( q != 0 )
q <= q - 1;
else
if( (A_out != A_in;) | (B_out != B_in) ) begin
q <= Time;
A_out <= A_in; // просто копируем значение из входа на выход
B_out <= B_in;
end
end
endmodule
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
-
Chaosorg
-
-
Не в сети
-
Завсегдатай
-
-
Сообщений: 312
-
Спасибо получено: 18
-
-
-
|
Leka пишет: Еще вариант - вводим "мертвое время" после переключения: module encoder_delay (CLK, A_in, B_in, A_out, B_out);
input CLK; // Вход тактовой частоты 100 МГц
input A_in, B_in; // Входы каналов квадратурного энкодера
output reg A_out, B_out; // Выходы каналов обработчика энкодера
localparam Fclk = 100000; // тактовая частота 100000 KГц
localparam ms = 1; // задержка 1 мс
localparam Time = Fclk * ms; // считаем делитель
reg [19:0] q; // Регистр счётчика задержки
always @(posedge CLK) begin
if( q != 0 )
q <= q - 1;
else
if( (A_out != A_in;) | (B_out != B_in) ) begin
q <= Time;
A_out <= A_in; // просто копируем значение из входа на выход
B_out <= B_in;
end
end
endmodule
этот способ понимаю, а первый листинг в каких-то ситуациях, видимо, нехорошо работает
я отталкиваюсь от программных методик и повторял их в железе
вот выдержка из википедии
При программном формировании очищенного от дребезга контакта сигнала наибольшее распространение получили два из них:
1. Путем установки временной задержки — программа, обнаружив замкнутое состояния контакта, игнорирует его состояние на время, заведомо большее длительности дребезга.
2. Методом подсчёта числа совпадающих значений сигнала замкнутости — программа многократно считывает состояние контакта, и, если последовало определённое количество подтверждений замкнутости, (определяется экспериментально и выбирается в пределах от 10 до 100) контакт считается устойчиво замкнутым.
то, о чем я говорил соответствует методу 2, а второй Ваш листинг соответствует методу 1
в каких ситуациях подводит Ваш первый способ затрудняюсь сразу сказать, но в каких-то случаях он ложно срабатывает
|
|
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
|
Время создания страницы: 0.151 секунд