Страница 1 из 2
оптимальный фильтр на ПЛИС - побитное умножение
Добавлено: Ср янв 18, 2012 20:19:41
Prosperous
Здравствуйте! Необходимо реализовать оптимальный фильтр на ПЛИС, состоящий из элементов линии задержки (16 штук), биты с выходов линии умножаются на коэффициенты +/- 1 попарно (т.е. первая пара на +1, вторая пара на -1, третья на +1 и т.д. всего 8 пар (16бит)). Далее эти коэффициенты суммируются. Линию задержки реализовал (ниже привожу фрагмент кода), а вот с побитным умножением и последующим суммированием проблема. Буду благодарен за помощь.
Код: Выделить всё
entity rs_422 is
port (
INPUT_RS422: in std_logic :='0';
CLK : in std_logic;
);
end rs_422;
architecture Behavioral of rs_422 is
signal shift_register: std_logic_vector (15 downto 0);
signal tmp: std_logic_vector (15 downto 0);
begin
shift_reg: process (CLK)
begin
if (rising_edge(CLK)) then
tmp <= tmp (14 downto 0) & INPUT_RS422;
end if;
end process;
shift_register <= tmp;
end Behavioral;
Re: оптимальный фильтр на ПЛИС - побитное умножение
Добавлено: Чт янв 19, 2012 07:15:13
Meteor
Раз множители +-1, то от умножения можно отказаться
Все что надо. это создать 16 регистров, скажем variable Reg1, Reg2...Reg16: integer
unsigned(нужная разрядность downto 0);
В отдельном процессе производить параллельный перенос
reg2:=reg1; и так для всех (можно в for объеденить)
А затем складывать
Data:=Reg1-reg2+reg3-reg4...+reg15-reg16
И самое главное, в архитектуре назначить сигнальную шины, через которые будут попадать данные в этот процесс и уходить из него.
Поправил тип данных
Re: оптимальный фильтр на ПЛИС - побитное умножение
Добавлено: Чт янв 19, 2012 15:23:23
Prosperous
На самом деле не совсем так. Как раз от множителей отказаться нельзя. Т.к. они, так сказать, как раз и являются фильтрующими звеньями (т.е. они заранее известны). Поясню. Блок должен запускаться при приходе на него 16 битной последовательности +1+1 -1-1+1+1-1-1+1+1-1-1+1+1-1-1. При перемножении на коэффиценты в такой же последовательности и последующем суммировании получится число 16. Что есть истина и блок получит импульс запуска. Если придет последовательность скажем +1+1+1+1+1+1+1+1+1+1+1+1+1+1+1-1. Сумма получится уже иной. Следовательно пришла помеха и блок запускаться не будет. Проблема как раз в реализации такого алгоритма

Re: оптимальный фильтр на ПЛИС - побитное умножение
Добавлено: Чт янв 19, 2012 15:51:00
Meteor
Ваши множители - это всего лишь знак перед значением. А для данного случая - всего лишь признак операции либо складывать либо вычитать.
Посмотрите внимательнее и увидите все сами.
Например, работаем массивом из 4х чисел и в момент i в регистрах содержатся значения 129, 364, -127, 284.
В результате получим на выходе 129-364+-127-284=-646
В момент i+1 поступил новый отсчет равный 571 и в регистрах будет 571, 129,364,-127.
Результатом станет 571-129+364--127=933.
Re: оптимальный фильтр на ПЛИС - побитное умножение
Добавлено: Чт янв 19, 2012 20:05:53
Prosperous
Ну да, вы, наверное, правы. Только в моем случае сумма будет выглядеть так, если не ошибаюсь: Data:=Reg1+reg2-reg3-reg4...-reg15-reg16. Спасибо за помощь

Re: оптимальный фильтр на ПЛИС - побитное умножение
Добавлено: Чт янв 19, 2012 20:20:25
Meteor
Одно меня смущает. У вас есть некие "пары" - двойки регистров. Как я понял каждый регистр - 8 бит. Но сами значения данных, они 16 бит или 8?
Если исходные по 8 бит, то безусловно reg1+reg2-reg3-reg4...
Но если у вас данные 16 битным кодом, то правильнее сразу указать 8 регистров по 16 бит. И их уже складывать\вычитать reg1-reg2+reg3-...-reg8.
Re: оптимальный фильтр на ПЛИС - побитное умножение
Добавлено: Чт янв 19, 2012 21:15:23
Prosperous
Чето, честно говоря, я запутался немного. Привожу блок - схему структуры, которую надо реализовать. Приведенные на ней линии задержки я получил путем преобразования последовательного кода в параллельный (фрагмент кода выше). А первые ваши рассуждения, мне кажутся правильными. Правда я только недавно начал заниматься этой работой, поэтому могу ошибаться.
Re: оптимальный фильтр на ПЛИС - побитное умножение
Добавлено: Чт янв 19, 2012 21:30:39
Meteor
Посмотрел. С учетом моих ошибок и вашей структуры надо писать reg1+reg2-reg3-reg4...-reg16. В этом вы правы
Преобразование типов в VHDL
Добавлено: Вс янв 29, 2012 11:52:31
Prosperous
Здравствуйте! У меня возник вопрос как в VHDL преобразовать последовательность типа std_logic 10101010 в 1 -1 1 -1 1 -1 1 -1 Спасибо.
Re: Преобразование типов в VHDL
Добавлено: Вс янв 29, 2012 14:57:02
Meteor
Что понимаете под -1? Это скольки разрядный код?
Самое простое решение - побитно назначать значения командой
Код: Выделить всё
variable dat_i,dat_o:std_logic_vector(7 downto 0);
if(rising_edge(clk))then
if(dat_i(0)='1')then
dat_o<=01111111;--посылаем код 1
else
dat_o<=11111111;--Посылка минус 1
dat_i(6 downto 0):=dat_i(7 downto 1);--сдвиг
en if;
end if;
Re: Преобразование типов в VHDL
Добавлено: Вс янв 29, 2012 17:05:25
Prosperous
если подробнее, то на вход ПЛИС по rs422 поступает последовательность 10101010. А в самой ПЛИСине надо реализовать корреляционную обработку (ких фильтр с коэф. 1-11-11-11-1 ) след-но чтобы получить максимум функции надо 10101010 перевести в такую же последовательность.
Re: Преобразование типов в VHDL
Добавлено: Вс янв 29, 2012 17:12:56
Meteor
Вы спутали биты и значения.
Вот как может быть трактовано
http://ru.wikipedia.org/wiki/Дополнител ... ние_числа)
Re: Преобразование типов в VHDL
Добавлено: Вс янв 29, 2012 17:28:46
Prosperous
что такое дополнительный код я представляю

Помните вы мне как то недавно помогали с оптимальным фильтром? Эта все еще та же задача. Т.е. подсказали вы все правильно, только после суммирования получается билиберда какая то. Поясню. 1+1-0-0+1+1-0-0+ 1+1-0-0+1+1-0-0=8. А должно получится 16. т.е. 1+1-(-1)-(-1)...=16. Вот поэтому мне и надо представить 10101010 в виде 1-11-11-11-11-1. Т.е. представить 0 в виде -1. (непонятно как это в коде преобразовать). Ну или я что - то недопонимаю. Буду благодарен за помощь в разъяснении.
Re: Преобразование типов в VHDL
Добавлено: Вс янв 29, 2012 17:36:41
Meteor
Prosperous писал(а):недавно помогали с оптимальным фильтром? Эта все еще та же задача.
А почему вы не продолжили тему? Срочно обратитесь к модераторам - пусть объединяют! тогда хоть линия мысли будет видна!
Вернемся к истокам.
У вас дана задача - прогнать значения то с положительным, то с отрицательным знаком.
Насколько я понимаю, после прохождения данных сквозь цепочку буферных регистров, никаких иных преобразований не будет? Только знакопеременная сумма, правильно?
Re: Преобразование типов в VHDL
Добавлено: Вс янв 29, 2012 17:54:18
Prosperous
Новую тему я завел, потому что подумал, что вопрос другой. А так да, вы правы, т.е. после получения суммы, при условии, что пришла нужная последовательность (т.е. фактически корреляционная обработка пришедшего сигнала) выдается прерывание на запуск блока.
Re: Преобразование типов в VHDL
Добавлено: Пн янв 30, 2012 03:45:08
Meteor
Теперь еще вопрос. По последовательному каналу принимаются данные, 1 байт в каждый момент времени. Что должно быть представлено в качестве результата:
1) сумма битов в байте;
2) сумма заданного числа байтов?
(не будем делать разницу между сложением и вычитанием - для итога это сумма).
Re: Преобразование типов в VHDL
Добавлено: Пн янв 30, 2012 08:24:41
Prosperous
Сумма битов в байте.
Re: Преобразование типов в VHDL
Добавлено: Пн янв 30, 2012 09:15:16
Meteor
А так не пробовали (я правда не представляю себе байт длинной 16 бит..)?
Код: Выделить всё
variable dat:std_logic_vector(15 downto 0);
variable sum:unsigned(3 downto 0):="0000";
begin
if(rising_edge(clk))then
sum:=dat(15)+dat(13)+dat(11)+dat(9)+dat(7)+dat(5)+dat(3)+dat(1)+
+not(dat(14))+not(dat(12))+not(dat(10))+not(dat(8))+not(dat(6))+not(dat(4))+not(dat(2))+not(dat(0));
end if;
Re: Преобразование типов в VHDL
Добавлено: Пн янв 30, 2012 09:39:28
Prosperous
не представляю себе байт длинной 16 бит
А 16 бит получается вот откуда. На вход ПЛИС код подается с одной тактовой частотой. А внутри обрабатывается в 2 раза быстрее. Т.е когда на входе 1, на выходе уже 11 ну и т.д.
Спасибо Вам огромное за помощь. Я правда уже сам справился с задачей:)
P.S. Вот только не знаю стоит выкладывать реализацию или это лишнее.
Re: Преобразование типов в VHDL
Добавлено: Пн янв 30, 2012 10:09:10
Meteor
Prosperous писал(а):Я правда уже сам справился с задачей:)
P.S. Вот только не знаю стоит выкладывать реализацию или это лишнее.
Ну уж позвольте полюбопытствовать