оптимальный фильтр на ПЛИС - побитное умножение

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Prosperous
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

оптимальный фильтр на ПЛИС - побитное умножение

Сообщение 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;
Реклама
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: оптимальный фильтр на ПЛИС - побитное умножение

Сообщение Meteor »

Раз множители +-1, то от умножения можно отказаться :idea:
Все что надо. это создать 16 регистров, скажем variable Reg1, Reg2...Reg16: integerunsigned(нужная разрядность downto 0);
В отдельном процессе производить параллельный перенос
reg2:=reg1; и так для всех (можно в for объеденить)
А затем складывать
Data:=Reg1-reg2+reg3-reg4...+reg15-reg16
И самое главное, в архитектуре назначить сигнальную шины, через которые будут попадать данные в этот процесс и уходить из него.

Поправил тип данных
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Реклама
Prosperous
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Re: оптимальный фильтр на ПЛИС - побитное умножение

Сообщение 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. Сумма получится уже иной. Следовательно пришла помеха и блок запускаться не будет. Проблема как раз в реализации такого алгоритма :)
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: оптимальный фильтр на ПЛИС - побитное умножение

Сообщение Meteor »

Ваши множители - это всего лишь знак перед значением. А для данного случая - всего лишь признак операции либо складывать либо вычитать.
Посмотрите внимательнее и увидите все сами.
Например, работаем массивом из 4х чисел и в момент i в регистрах содержатся значения 129, 364, -127, 284.
В результате получим на выходе 129-364+-127-284=-646
В момент i+1 поступил новый отсчет равный 571 и в регистрах будет 571, 129,364,-127.
Результатом станет 571-129+364--127=933.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Реклама
Эиком - электронные компоненты и радиодетали
Prosperous
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Re: оптимальный фильтр на ПЛИС - побитное умножение

Сообщение Prosperous »

Ну да, вы, наверное, правы. Только в моем случае сумма будет выглядеть так, если не ошибаюсь: Data:=Reg1+reg2-reg3-reg4...-reg15-reg16. Спасибо за помощь :)
Последний раз редактировалось Prosperous Чт янв 19, 2012 21:35:23, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: оптимальный фильтр на ПЛИС - побитное умножение

Сообщение Meteor »

Одно меня смущает. У вас есть некие "пары" - двойки регистров. Как я понял каждый регистр - 8 бит. Но сами значения данных, они 16 бит или 8?
Если исходные по 8 бит, то безусловно reg1+reg2-reg3-reg4...
Но если у вас данные 16 битным кодом, то правильнее сразу указать 8 регистров по 16 бит. И их уже складывать\вычитать reg1-reg2+reg3-...-reg8.
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Реклама
Prosperous
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Re: оптимальный фильтр на ПЛИС - побитное умножение

Сообщение Prosperous »

Чето, честно говоря, я запутался немного. Привожу блок - схему структуры, которую надо реализовать. Приведенные на ней линии задержки я получил путем преобразования последовательного кода в параллельный (фрагмент кода выше). А первые ваши рассуждения, мне кажутся правильными. Правда я только недавно начал заниматься этой работой, поэтому могу ошибаться.
Вложения
схема.jpg
(24.95 КБ) 477 скачиваний
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: оптимальный фильтр на ПЛИС - побитное умножение

Сообщение Meteor »

Посмотрел. С учетом моих ошибок и вашей структуры надо писать reg1+reg2-reg3-reg4...-reg16. В этом вы правы
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Prosperous
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Преобразование типов в VHDL

Сообщение Prosperous »

Здравствуйте! У меня возник вопрос как в VHDL преобразовать последовательность типа std_logic 10101010 в 1 -1 1 -1 1 -1 1 -1 Спасибо.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Преобразование типов в VHDL

Сообщение 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;
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Prosperous
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Re: Преобразование типов в VHDL

Сообщение Prosperous »

если подробнее, то на вход ПЛИС по rs422 поступает последовательность 10101010. А в самой ПЛИСине надо реализовать корреляционную обработку (ких фильтр с коэф. 1-11-11-11-1 ) след-но чтобы получить максимум функции надо 10101010 перевести в такую же последовательность.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Преобразование типов в VHDL

Сообщение Meteor »

Вы спутали биты и значения.
Вот как может быть трактовано http://ru.wikipedia.org/wiki/Дополнител ... ние_числа)
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Prosperous
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Re: Преобразование типов в VHDL

Сообщение 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. (непонятно как это в коде преобразовать). Ну или я что - то недопонимаю. Буду благодарен за помощь в разъяснении.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Преобразование типов в VHDL

Сообщение Meteor »

Prosperous писал(а):недавно помогали с оптимальным фильтром? Эта все еще та же задача.
А почему вы не продолжили тему? Срочно обратитесь к модераторам - пусть объединяют! тогда хоть линия мысли будет видна!
Вернемся к истокам.
У вас дана задача - прогнать значения то с положительным, то с отрицательным знаком.
Насколько я понимаю, после прохождения данных сквозь цепочку буферных регистров, никаких иных преобразований не будет? Только знакопеременная сумма, правильно?
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Prosperous
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Re: Преобразование типов в VHDL

Сообщение Prosperous »

Новую тему я завел, потому что подумал, что вопрос другой. А так да, вы правы, т.е. после получения суммы, при условии, что пришла нужная последовательность (т.е. фактически корреляционная обработка пришедшего сигнала) выдается прерывание на запуск блока.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Преобразование типов в VHDL

Сообщение Meteor »

Теперь еще вопрос. По последовательному каналу принимаются данные, 1 байт в каждый момент времени. Что должно быть представлено в качестве результата:
1) сумма битов в байте;
2) сумма заданного числа байтов?
(не будем делать разницу между сложением и вычитанием - для итога это сумма).
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Prosperous
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Re: Преобразование типов в VHDL

Сообщение Prosperous »

Сумма битов в байте.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Преобразование типов в VHDL

Сообщение 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;
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Prosperous
Встал на лапы
Сообщения: 129
Зарегистрирован: Ср янв 18, 2012 19:37:10

Re: Преобразование типов в VHDL

Сообщение Prosperous »

не представляю себе байт длинной 16 бит
А 16 бит получается вот откуда. На вход ПЛИС код подается с одной тактовой частотой. А внутри обрабатывается в 2 раза быстрее. Т.е когда на входе 1, на выходе уже 11 ну и т.д.
Спасибо Вам огромное за помощь. Я правда уже сам справился с задачей:)

P.S. Вот только не знаю стоит выкладывать реализацию или это лишнее.
Аватара пользователя
Meteor
Друг Кота
Сообщения: 3961
Зарегистрирован: Пн июл 13, 2009 14:37:39
Откуда: Московская область, наукоград.....
Контактная информация:

Re: Преобразование типов в VHDL

Сообщение Meteor »

Prosperous писал(а):Я правда уже сам справился с задачей:)

P.S. Вот только не знаю стоит выкладывать реализацию или это лишнее.
Ну уж позвольте полюбопытствовать
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»