Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
Понадобилось нечто подобное, но при условии, что период дискретизации лишь в 4-6 раз выше периода "единиц" и "нулей" в последовательном коде, который надо принять. выделение фронтов и подавление помех делаю так: Код: VHDL: -- шапку с заданием библиотек/входов/выходов опускаю
signal reg : nibble; -- четырехбитный регистр
begin process (clk) begin if clk'event and clk = vcc then reg <= reg(2 downto 0)&data_in; if reg = "0011" or reg = "1100" then front_detected <= vcc; else front_detected <= gnd; end if;
if reg(3 downto 1) = "111" or reg = "1101" then data_out <= vcc; elsif reg(3 downto 1) = "000" or reg = "0010" then data_out <= gnd; end if;
end if; end;
end; Выделеные фронты подаются на цифровую фапч, которая формирует строб-импульсы, нацеленые на середины передаваемых периодов, чтобы зафиксировать данные. Работает такая штука при передаче данных со скоростью ~41мегабит/сек (250/6) по одному сигнальному проводу. Применяется для передачи тестовой информации из исследуемой схемы на визуализатор, который эти данные на VGA выводит в нужном виде. Для передачи данных используется кусок обычного плоского кабеля длиной 0.5 метра. Интересно, что при передачи с Альтеры на Альтеру скорость 41мегабит/сек плучилась нормально, а вот, при передачи с Xilinx на Альтеру пришлось скорость в 2 раза снизить (схема подавления помех и выделения фронтов осталась прежней)
Понадобилось нечто подобное, но при условии, что период дискретизации лишь в 4-6 раз выше периода "единиц" и "нулей" в последовательном коде, который надо принять.
выделение фронтов и подавление помех делаю так: [code] VHDL: -- шапку с заданием библиотек/входов/выходов опускаю
signal reg : nibble; -- четырехбитный регистр
begin process (clk) begin if clk'event and clk = vcc then reg <= reg(2 downto 0)&data_in; if reg = "0011" or reg = "1100" then front_detected <= vcc; else front_detected <= gnd; end if;
if reg(3 downto 1) = "111" or reg = "1101" then data_out <= vcc; elsif reg(3 downto 1) = "000" or reg = "0010" then data_out <= gnd; end if;
end if; end;
end;[/code]
Выделеные фронты подаются на цифровую фапч, которая формирует строб-импульсы, нацеленые на середины передаваемых периодов, чтобы зафиксировать данные.
Работает такая штука при передаче данных со скоростью ~41мегабит/сек (250/6) по одному сигнальному проводу. Применяется для передачи тестовой информации из исследуемой схемы на визуализатор, который эти данные на VGA выводит в нужном виде. Для передачи данных используется кусок обычного плоского кабеля длиной 0.5 метра. Интересно, что при передачи с Альтеры на Альтеру скорость 41мегабит/сек плучилась нормально, а вот, при передачи с Xilinx на Альтеру пришлось скорость в 2 раза снизить (схема подавления помех и выделения фронтов осталась прежней)
|
|
|
|
Добавлено: Вс июн 24, 2012 05:38 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
mOleg писал(а): ну, так вроде как так быть и должно, сигнал длиной меньше какого-то заданного числа клоков не должен проваливаться сквозь фильтр Именно. И поэтому, если полезный сигнал сильно зашумлен - он не пройдет на выход вообще, хотя правильный фильтр должен подобные шумы давить, если только они сам сигнал окончательно не перебивают. Вот, представим, что сигнал единицы содержит короткие провалы в нуль, а сигнал нуля короткие всплески в единицу. Ни тот ни другой не пройдет, потому что в регистре сдвига будут постоянно присутствовать и нули и единицы.
[quote="mOleg"]ну, так вроде как так быть и должно, сигнал длиной меньше какого-то заданного числа клоков не должен проваливаться сквозь фильтр 8)[/quote]
Именно. И поэтому, если полезный сигнал сильно зашумлен - он не пройдет на выход вообще, хотя правильный фильтр должен подобные шумы давить, если только они сам сигнал окончательно не перебивают.
Вот, представим, что сигнал единицы содержит короткие провалы в нуль, а сигнал нуля короткие всплески в единицу. Ни тот ни другой не пройдет, потому что в регистре сдвига будут постоянно присутствовать и нули и единицы.
|
|
|
|
Добавлено: Пт авг 12, 2011 18:26 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
WingLion писал(а): mOleg писал(а): будет, т.к. на выходе стоит RS триггер Ага, а теперь представим, что пришел сигнал с помехами, так что схемы сравнения не совпадают всегда, т.е. RS-триггер просто не получает сигналы сброса и установки. ну, так вроде как так быть и должно, сигнал длиной меньше какого-то заданного числа клоков не должен проваливаться сквозь фильтр
[quote="WingLion"]mOleg писал(а): будет, т.к. на выходе стоит RS триггер Ага, а теперь представим, что пришел сигнал с помехами, так что схемы сравнения не совпадают всегда, т.е. RS-триггер просто не получает сигналы сброса и установки.[/quote] ну, так вроде как так быть и должно, сигнал длиной меньше какого-то заданного числа клоков не должен проваливаться сквозь фильтр 8)
|
|
|
|
Добавлено: Пт авг 12, 2011 14:56 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
dynamic-wind писал(а): В азиках, кондер--это обратно смещенный диод, или затвор увеличенного полевика. И т.п. В ПЛИСах таких ячеек нет, понял. В ПЛИС такие решения абсолютно противопоказаны. В цифровой электронике, в принципе, тоже - чем меньше норма техпроцесса, тем более противопоказаны. Это же все плывет over PVT.
[quote="dynamic-wind"]В азиках, кондер--это обратно смещенный диод, или затвор увеличенного полевика. И т.п. В ПЛИСах таких ячеек нет, понял.[/quote] В ПЛИС такие решения абсолютно противопоказаны. В цифровой электронике, в принципе, тоже - чем меньше норма техпроцесса, тем более противопоказаны. Это же все плывет over PVT.
|
|
|
|
Добавлено: Чт авг 11, 2011 22:30 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
WingLion писал(а): "больше" - это как? Цифровой фильтр - это 1/1000 от ПЛИС-а, а аналоговый - два компонента рядом с ним... В азиках, кондер--это обратно смещенный диод, или затвор увеличенного полевика. И т.п. В ПЛИСах таких ячеек нет, понял.
[quote="WingLion"]"больше" - это как? Цифровой фильтр - это 1/1000 от ПЛИС-а, а аналоговый - два компонента рядом с ним...[/quote] В азиках, кондер--это обратно смещенный диод, или затвор увеличенного полевика. И т.п. В ПЛИСах таких ячеек нет, понял.
|
|
|
|
Добавлено: Чт авг 11, 2011 22:08 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
dynamic-wind писал(а): Аналоговый фильтр (с конденсатором) будет больше цифрового? Импульс скажем 1мкс. "больше" - это как? Цифровой фильтр - это 1/1000 от ПЛИС-а, а аналоговый - два компонента рядом с ним...
[quote="dynamic-wind"]Аналоговый фильтр (с конденсатором) будет больше цифрового? Импульс скажем 1мкс.[/quote]
"больше" - это как? Цифровой фильтр - это 1/1000 от ПЛИС-а, а аналоговый - два компонента рядом с ним...
|
|
|
|
Добавлено: Чт авг 11, 2011 18:28 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
mOleg писал(а): будет, т.к. на выходе стоит RS триггер Ага, а теперь представим, что пришел сигнал с помехами, так что схемы сравнения не совпадают всегда, т.е. RS-триггер просто не получает сигналы сброса и установки.
[quote="mOleg"]будет, т.к. на выходе стоит RS триггер[/quote]
Ага, а теперь представим, что пришел сигнал с помехами, так что схемы сравнения не совпадают [b]всегда[/b], т.е. RS-триггер просто не получает сигналы сброса и установки.
|
|
|
|
Добавлено: Чт авг 11, 2011 18:24 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
WingLion писал(а): если на вход пройдет регулярная короткая помеха (1 такт длиной и довольно часто), то такая схемка не будет работать, т.к. ни четкого нуля, ни четкой единицы не будет на входе. будет, т.к. на выходе стоит RS триггер
[quote="WingLion"]если на вход пройдет регулярная короткая помеха (1 такт длиной и довольно часто), то такая схемка не будет работать, т.к. ни четкого нуля, ни четкой единицы не будет на входе. [/quote] будет, т.к. на выходе стоит RS триггер 8)
|
|
|
|
Добавлено: Чт авг 11, 2011 15:48 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
Проблема в том, что в произвольно взятом устройстве вряд ли будет гарантия возможности применения конкретных номиналов R и С. Фильтр делается по принципу "чтобы работал", а не "пользователь ответственен за то, чтобы на вход фильтра подавались помехи с характеристиками...". Цифровой фильтр в этом плане более гибок и существенно более стабилен. Фильтр на сброс как раз можно сделать в виде RC, потому что можно вписать требование "длительность сброса не менее ...", и разработчикам обычно не составляет труда обеспечить выполнение этого требования. А вот произвольно взятому источнику часто бывает трудновато объяснить, какие помехи он имеет право генерировать
Проблема в том, что в произвольно взятом устройстве вряд ли будет гарантия возможности применения конкретных номиналов R и С. Фильтр делается по принципу "чтобы работал", а не "пользователь ответственен за то, чтобы на вход фильтра подавались помехи с характеристиками...". Цифровой фильтр в этом плане более гибок и существенно более стабилен. Фильтр на сброс как раз можно сделать в виде RC, потому что можно вписать требование "длительность сброса не менее ...", и разработчикам обычно не составляет труда обеспечить выполнение этого требования. А вот произвольно взятому источнику часто бывает трудновато объяснить, какие помехи он имеет право генерировать :)
|
|
|
|
Добавлено: Чт авг 11, 2011 15:40 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
Хищник писал(а): У аналогового фильтра нет абсолютно никакой гарантии подавить короткие пики. Только фронт завалит. А как же работает фильтр в AVR, который (согласно даташиту) фильтрует слишком короткий RESET? Он это делает при незапущенном тактовом генераторе.
[quote="Хищник"]У аналогового фильтра нет абсолютно никакой гарантии подавить короткие пики. Только фронт завалит.[/quote] А как же работает фильтр в AVR, который (согласно даташиту) фильтрует слишком короткий RESET? Он это делает при незапущенном тактовом генераторе.
|
|
|
|
Добавлено: Чт авг 11, 2011 15:07 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
dynamic-wind писал(а): Аналоговый фильтр (с конденсатором) будет больше цифрового? Импульс скажем 1мкс. У аналогового фильтра нет абсолютно никакой гарантии подавить короткие пики. Только фронт завалит.
[quote="dynamic-wind"]Аналоговый фильтр (с конденсатором) будет больше цифрового? Импульс скажем 1мкс.[/quote] У аналогового фильтра нет абсолютно никакой гарантии подавить короткие пики. Только фронт завалит.
|
|
|
|
Добавлено: Чт авг 11, 2011 10:59 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
Аналоговый фильтр (с конденсатором) будет больше цифрового? Импульс скажем 1мкс.
Аналоговый фильтр (с конденсатором) будет больше цифрового? Импульс скажем 1мкс.
|
|
|
|
Добавлено: Чт авг 11, 2011 09:23 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
mOleg писал(а): а я так делал: если на вход пройдет регулярная короткая помеха (1 такт длиной и довольно часто), то такая схемка не будет работать, т.к. ни четкого нуля, ни четкой единицы не будет на входе. Я с таким уже сталкивался, потому ставил на выходе регистра мажоритар, а не просто сравнение. А потом со счетчиком решил делать.
[quote="mOleg"]а я так делал:[/quote]
если на вход пройдет [b]регулярная[/b] короткая помеха (1 такт длиной и довольно часто), то такая схемка не будет работать, т.к. ни четкого нуля, ни четкой единицы не будет на входе.
Я с таким уже сталкивался, потому ставил на выходе регистра мажоритар, а не просто сравнение. А потом со счетчиком решил делать.
|
|
|
|
Добавлено: Чт авг 11, 2011 04:47 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
а я так делал: Parameters (tau=75,sync=25);
constant cycles = ceil(tau div sync)-1;
SubDesign finp ( clk : input; inp : input; -- вход
pos : output; -- в '1' если сигнал положителен ~ tau ns neg : output; -- в '1' если сигнал отрицателен ~ tau ns o : output; -- в '1' если pos, в '0' если neg )
Variable T[cycles..1] : dffe;
Begin T[] = (T[cycles-1..1],inp); T[].clk = clk; pos = dff(.d=( T[] == -1 ),.clk=clk); neg = dff(.d=( T[] == 0 ),.clk=clk);
o = srff(.s=pos, .r=neg, .clk=clk); End;
а я так делал: [pre]Parameters (tau=75,sync=25);
constant cycles = ceil(tau div sync)-1;
SubDesign finp ( clk : input; inp : input; -- вход
pos : output; -- в '1' если сигнал положителен ~ tau ns neg : output; -- в '1' если сигнал отрицателен ~ tau ns o : output; -- в '1' если pos, в '0' если neg )
Variable T[cycles..1] : dffe;
Begin T[] = (T[cycles-1..1],inp); T[].clk = clk; pos = dff(.d=( T[] == -1 ),.clk=clk); neg = dff(.d=( T[] == 0 ),.clk=clk);
o = srff(.s=pos, .r=neg, .clk=clk); End;[/pre]
|
|
|
|
Добавлено: Ср авг 10, 2011 19:49 |
|
|
|
|
|
Заголовок сообщения: |
Re: AHDL: Цифровой фильтр для однобитного сигнала |
|
|
Параметризованый набросок на VHDL: Код: entity bitfiltr is Port( clk, input_pin, ENA : in std_logic; out_pinn : out std_logic );
end bitfiltr;
arhitecture rtl of BitFiultr is
signal out_pin : std_logic; signal count : integer; constant max : integer := 1000; constant min : integer := 10; constant gap : integer := 500; constant vcc : std_logic := '1';
begin
process (clk) begin
if clk'event and clk=vcc and ENA = vcc then
if input_pin = vcc then if count >max then count <= max+1; else count <=count + 1; end if; else if count < min then count <= min-1; else count <= count - 1; end if; end if;
if count > (max+min+gap)/2 then out_pin <= vcc; elsif count < (max+min-gap)/2 then out_pin <= gnd; else out_pin <= out_pin; end if; out_pinn <= out_pin;
end if;
end process;
end; Не проверено!
Параметризованый набросок на VHDL:
[code]entity bitfiltr is Port( clk, input_pin, ENA : in std_logic; out_pinn : out std_logic );
end bitfiltr;
arhitecture rtl of BitFiultr is
signal out_pin : std_logic; signal count : integer; constant max : integer := 1000; constant min : integer := 10; constant gap : integer := 500; constant vcc : std_logic := '1';
begin
process (clk) begin
if clk'event and clk=vcc and ENA = vcc then
if input_pin = vcc then if count >max then count <= max+1; else count <=count + 1; end if; else if count < min then count <= min-1; else count <= count - 1; end if; end if;
if count > (max+min+gap)/2 then out_pin <= vcc; elsif count < (max+min-gap)/2 then out_pin <= gnd; else out_pin <= out_pin; end if; out_pinn <= out_pin;
end if;
end process;
end;[/code]
Не проверено!
|
|
|
|
Добавлено: Вт авг 09, 2011 20:56 |
|
|
|
|