Добро пожаловать, Гость
Логин: Пароль: Запомнить меня

ТЕМА:

Вопросы по языку Verilog 10 года 10 мес. назад #4786

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
Констрейны только для Xilinx давно писал, забыл напрочь. Для Альтеры мне еще не требовалось, хватало настроек по-умолчанию. I/O регистры - в особых случаях (клок или DDR выводить), надо мегафункции использовать, в простых - вроде как галочка где-то есть, не помню. Но для начала этим можно не заморачиваться. Но просто клок подцепить на выходной пин, прямо или через логику, - так делать в синхронном дизайне нельзя.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Вопросы по языку Verilog 10 года 7 мес. назад #5446

Помогите чайнику...
Хочу сделать "антидребезговую" задержку в 1 мс (5 мс), для обработки каналов квадратурного энкодера.
написал свой опус:
ВНИМАНИЕ: Спойлер!

Застрял на месте, где хочу разрешить работу счётчика, для деления тактовой до 1000 Гц (1 мс). Понимаю, что задание в условии по фронту - это мягко говоря злостное надругательство, но я хотел донести этим смысл.
if (posedge CLK)
Собственно не знаю как описать в одном модуле, разбивать на несколько, чтобы запускать отдельный счётчик, не хотелось бы.

Спасибо.

PS: Блин! все комментарии искажены :( Как кодировку поправить?
Вот сам файл, если что:

Вложенный файл:

Имя файла: encoder.txt
Размер файла:1 KB
"Холодает" - подумал Волк и натянул Красную Шапочку по самые уши...
Вложения:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Серый Волк. Причина: файл не вставился

Вопросы по языку Verilog 10 года 7 мес. назад #5447

Серый Волк пишет: Застрял на месте, где хочу разрешить работу счётчика, для деления тактовой до 1000 Гц (1 мс). Понимаю, что задание в условии по фронту - это мягко говоря злостное надругательство, но я хотел донести этим смысл.

if (posedge CLK)
Собственно не знаю как описать в одном модуле, разбивать на несколько, чтобы запускать отдельный счётчик, не хотелось бы.

Спасибо.

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
Спасибо сказали: Серый Волк

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Chaosorg.

Вопросы по языку Verilog 10 года 7 мес. назад #5448

  • Leka
  • Leka аватар
  • Не в сети
  • Живу я здесь
  • Живу я здесь
  • Сообщений: 635
  • Спасибо получено: 54
И сколько повторять про синхронный дизайн?

CLK надо использовать _только_ в конструкциях вида: "always@(posedge CLK)", и больше _нигде_.

Для антидребезга можно просто считывать состояния входов в регистр с частотой 1КГц, по счетчику в том-же always.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Вопросы по языку Verilog 10 года 7 мес. назад #5449

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. У меня в задаче надо было выделять фронт именно для неизвестного сигнала, асинхронного моей схеме - стал подсказывать по аналогии

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Chaosorg.

Вопросы по языку Verilog 10 года 7 мес. назад #5450

Народ, читайте внимательно - я же написал про то, что использовал перепад по фронту в условии специально - чтобы донести смысл, а не для того чтобы код с ним работал.

Как я понял без управления сторонним счётчиком на 1 кГц не обойтись?
В данном модуле у меня always уже занят опросом фронтов каналов энкодера.
"Холодает" - подумал Волк и натянул Красную Шапочку по самые уши...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Серый Волк.

Вопросы по языку Verilog 10 года 7 мес. назад #5451

Серый Волк пишет: Народ, читайте внимательно - я же написал про то, что использовал перепад по фронту в условии специально - чтобы донести смысл, а не для того чтобы код с ним работал.

Как я понял без управления сторонним счётчиком на 1 кГц не обойтись?
В данном модуле у меня always уже занят опросом фронтов каналов энкодера.


почему Вы не хотите просто внутри одного always с Вашим самым быстрым клоком считать длительность положительных, например, площадок дребезжащего сигнала через q = q+1 , сбрасывая q на ноль если сигнал тоже упал на ноль? С отрицательными площадками тоже так же можно. А полезный сигнал брать из переменной, которую устанавливать в единицу или ноль если счетчики продолжительности площадок достигли какой-то величины определяющей силу антидребезга?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Chaosorg.

Вопросы по языку Verilog 10 года 7 мес. назад #5452

  • 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
	q <= q + 1;
	if(q >= Time) begin
		q <= 0;
		A_out <= A_in; 	// просто копируем значение из входа на выход
		B_out <= B_in;
	end
end

endmodule

Если нужна защита от импульсных помех/наводок, а не только антидребезг, надо какой-либо фильтр именно от импульсных помех. Дребезг от импульсных помех отличается тем, что переходные процессы возникают только при переключении.
Спасибо сказали: Серый Волк

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Leka.

Вопросы по языку Verilog 10 года 7 мес. назад #5453

  • 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
Спасибо сказали: Серый Волк

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Вопросы по языку Verilog 10 года 7 мес. назад #5454

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
в каких ситуациях подводит Ваш первый способ затрудняюсь сразу сказать, но в каких-то случаях он ложно срабатывает
Спасибо сказали: Серый Волк

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от Chaosorg.
Время создания страницы: 0.151 секунд
Работает на Kunena форум