Jump to content

    

ЕвгенийЗлыднев

Участник
  • Content Count

    14
  • Joined

  • Last visited

Community Reputation

0 Обычный

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Доделал свою версию, добавил коменты. -----Author: Zlydnev E.N. -----function: chastye elementy -- Revision history -- Version 1.0 : -- Date: 13/09/2019 -- Comments : Original ---- library IEEE;-- vklychaem biblioteki use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.numeric_std.all; entity chastye_elementy is -- vhodnie/vyhodnye signals port( clk : in std_logic; GO : in std_logic; clr : in std_logic; ------------------------------------------------ ------------------------------------------------ ------------------------------------------------ nomer : out std_logic_vector(7 downto 0);--vyhodnoe chislo ibn1 : in std_logic_vector(7 downto 0);-- chisla vhodnie. ibn2 : in std_logic_vector(7 downto 0);-- ibn3 : in std_logic_vector(7 downto 0);-- -//- ibn4 : in std_logic_vector(7 downto 0);-- -//- ibn5 : in std_logic_vector(7 downto 0);-- -//- ibn6 : in std_logic_vector(7 downto 0);-- -//- ibn7 : in std_logic_vector(7 downto 0);-- -//- ibn8 : in std_logic_vector(7 downto 0);-- -//- ibn9 : in std_logic_vector(7 downto 0); ibn10 : in std_logic_vector(7 downto 0);-- -//- ibn11 : in std_logic_vector(7 downto 0);-- ibn12 : in std_logic_vector(7 downto 0);-- ibn13 : in std_logic_vector(7 downto 0);-- ibn14 : in std_logic_vector(7 downto 0);-- ibn15 : in std_logic_vector(7 downto 0);-- ibn16 : in std_logic_vector(7 downto 0);-- ibn17 : in std_logic_vector(7 downto 0);-- ibn18 : in std_logic_vector(7 downto 0);-- ibn19 : in std_logic_vector(7 downto 0);-- ibn20 : in std_logic_vector(7 downto 0);-- ibn21 : in std_logic_vector(7 downto 0);-- ibn22 : in std_logic_vector(7 downto 0);-- ibn23 : in std_logic_vector(7 downto 0);-- ibn24 : in std_logic_vector(7 downto 0);-- ibn25 : in std_logic_vector(7 downto 0);-- ------------------------------------------ done : out std_logic --kogda vse sdelal ipmuls edinica ); end chastye_elementy; architecture rtl of chastye_elementy is type reg is array (25 downto 1) of std_logic_vector(7 downto 0);--type danyx dlya xraneniya nomerov signal ibn :reg := (others => (others =>'0')); signal i : integer range 0 to 25;-- kolichestvo nomerov = 25 signal j : integer range -25 to 25;-- j peremenaya dlya podcheta elementov sovpavhiz signal temp_nomer : std_logic_vector(7 downto 0);-- promezytochnoe xranenie nomera begin G3: process(clr,clk) variable calk,donev: std_logic;-- peremeniy dlya vychesleniy begin if clr = '1' then -- acinxronyi sbros regictrov ibn <= (others => (others =>'0')); nomer <= (others =>'0'); temp_nomer <= (others =>'0'); i <= 0; calk := '0'; donev := '0'; elsif rising_edge(clk) then -- nachalo raboty donev := '0'; -- done = 0 tak kak rabota idet if go = '1' then -- go = 1 zhachit nahinaem raboty ibn(1) <= ibn1; ibn(2) <= ibn2; ibn(3) <= ibn3; ibn(4)<=ibn4 ;ibn(5)<= ibn5 ; ibn(6) <= ibn6;--vhodnyy infu po registram ibn(7) <= ibn7; ibn(8) <= ibn8; ibn(9) <= ibn9; ibn(10)<= ibn10; ibn(11)<=ibn11 ; ibn(12)<=ibn12 ;--vhodnyy infu po registram ibn(13) <= ibn13; ibn(14)<= ibn14; ibn(15)<= ibn15; ibn(16)<= ibn16; ibn(17)<= ibn17 ; ibn(18) <= ibn18;--vhodnyy infu po registram ibn(19) <= ibn19; ibn(20)<= ibn20; ibn(21) <= ibn21; ibn(22)<=ibn22 ; ibn(23) <= ibn23; ibn(24) <= ibn24;ibn(25)<=ibn25 ;--vhodnyy infu po registram i <= 0;--obnylyaem i j <= 0;--obnylyaem j calk := '1';-- calk = 1 kogda idet vychislenie elsif calk = '1' then -- calk = 1 kogda idet vychislenie if i=25 then -- i=25 znachit konec agoritma nomer <= temp_nomer; -- vydaem okonchatelnyy rezyltat donev := '1'; -- danev = 1 kogda konec alhoritma calk := '0'; -- vychislenie zakonchilosb elsif j = 0 then -- temp_nomer <= ibn(i);-- ecli j=0, to zapisivaem tekyzhiy nomer v temp i<= i + 1; -- inkerement j,i j<= j + 1; else if temp_nomer = ibn(i) then -- esli kandidat = nomery to inkerement j,i i<= i + 1; -- j<= j + 1; else -- esli net to ymenshaem j. I v lybom slychae inkrement i<=i + 1; j<= j - 1; end if; end if; end if; end if; done <= donev;--done = 1 kogda konec alhoritma end process; end rtl; Основная проблема была в неправильном обнулении всех значений в начале алгоритма. И не правильном расположении if else в синхроном блоке(после rising edge). Все остальное почти так и осталось. Работает вроде нормально. Доделаю второй проход, но за одну или две операции. Чтобы быстрее было все это. Спасибо всем кто помогал. Все остальные варианты тоже рассмотрю и постараюсь реализовать/проверить. Ну и сравню со своим кодом по месту. chastye_elementy.vwf chastye_elementy.vhd
  2. Меняются по клоку. Модел сим это. Сделал так чтобы i менялось по нормально, но чет все равно не работает. Число нормально не защелкивается из temp в nomer.
  3. В симуляторе проверяю.
  4. К сожалению, не всегда как видно можно даже простые алгоритмы на Плис реализовать. Хоть за 3 такта хоть за 25. Поэтому ваш потом попробую написать.
  5. Все понял про что вы :-) Про количество входных сигналов . В симуляции я же задаю сигналы, я знаю что там содержится. Если бы там его не было и выдавал бы странное значение это было бы нормально. Но он все равно не работает. Вторым проходом можно заняться когда уже первый будет нормальный. Т.е. хотя бы для начала первый сделать надо. Самое странное то что я задаю напрямую не хочет показать.
  6. то есть надо просто сложить все числа входные и вычесть их из константы 1+2+3+...225? и получим результат? Не увидел ваших замечаний, и проверил сразу в матлабе. не работает алгоритм если как и вашем примере сумма элементов меньше.
  7. Если не обнаружил такого то пусть нули выдает. На самом деле там скорее всего либо одно и тоже число, либо нули. На всякий случай нужен это алгоритм для проверки. int* majority(int[] array, int N) { int confidence = 0; // количество людей, не нашедших пары и оставшихся стоять int* candidate = NULL; // последний человек, не нашедший пару -- // возможно, его элемент встречается чаще всего // проходим по массиву и усаживаем пары с разными элементами for (int i = 0; i<N; i++) { // если до сих пор все сидят, то следующему пока придётся постоять if (confidence == 0) { candidate = array+i; confidence++; } // иначе следующий либо садится с одним из стоящих, // либо будет стоять вместе с ними, если у него такой же элемент else if (*candidate == array[i])) confidence++; else confidence--; } return confidence > 0 ? candidate : NULL; } В исходном алгоритме в последней строке возвращается candidate, если confidence больше нуля. А если меньше то NULL возращает. У меня там же есть условие что j должно быть больше 0. j аналог confidence. Т.е вроде все соблюдено. Что такое длина 3 ? не совсем понял.
  8. Что касается не правильного исходного алгоритма то я попробовал на Матлабе его реализовать. У меня все работает как надо. Но на плис не хочет это синтезировать. a1 = [46,46,46,46,46,46,46,46,46,46,46,46,46,11,10,9,8,7,6,5,4,3,2,1,0]; %массив conf = 0;% начальное значение и количество, не нашедших пары и оставшихся "стоять" candidate = 1; %начальное значение "кандидата" b = randsample(a1,25);% перемещиваем исходный массив for i=1:length(b)% начинаем алгоритм поиска наиболее частого значения в массиве if (conf == 0) % если нет "одиноких" чисел, то присваеиваем значение текущего "одинокому" candidate = b(i); conf=conf+1; elseif candidate == b(i)% если есть "одинокие", то сравниваем рядом стоящие conf=conf+1; else conf=conf-1; end conf candidate end А можете по коду еще посмотреть в чем может быть ошибка? может с индексами что не так? или из-за того что я i и j ограничил по разрядности? Вчера к сожалению не тот снимок привел. Вот более подробная диаграмма. Опишу алгоритм подробнее: 1) По уровню "1" на сигнале Go начинаем сортировать. Когда все по нулям просто увеличиваем счетчики i и j на 1. Значение ibn записываем в регистр temp. 2) Далее, сравниваем предыдущий элемент со следующим. Если равны то увеличиваем значение j и также в temp перезаписываем значение которое там уже есть. Если не равны то уменьшаем j и переписываем значение ibn(i+1) в temp. Каждое сравнение это один такт, i увеличиваем каждый такт. 3) Когда алгоритм отработал (i=24) если j больше нуля то записываем в регистр nomer данные из регистра temp. Если j больше нуля то записываем нули (у меня в коде 1, это для эксперимента было). Когда алгоритм отработал он ставит сигнал done в единицу. После этого возникают вопросы: Почему I не с нуля стартует, а с 3. И то увеличивается, то уменьшается. Хотя я четко обозначил что на каждом шагу она должна только увеличиваться. Почему номер не выдается как нужно? Кто-то может просто повторить это алгоритм? Был бы очень признателен. Он очень ведь компактный. Всего несколько строк. Видео урок как это подобное реализуется в учебнике и примеры я выложил. Там вроде все доступно. Если честно не думал, что вызовет столько затруднений мой пример у людей. Что касается других вариантов и алгоритмов то это круто что столько отзывов последовало. Но у меня уже какой-то азарт реализовать это алгоритм, Потому что учебные примеры так легко получились, и так ясно работают что мне как-то обидно за себя что я не могу простейший алгоритм реализовать. Хотя вся информация уже есть, и видео уроки и учебник (( Если получатся несколько вариантов то я хоть сравню их. И выберу лучший, так даже более правильно будет. Если что для другого случая применю потом. Я все компоненты свои сохраняю, и потом как типовые использую. Просто меняю разрядность и т.п. Так что несколько вариантов лишними не будут.
  9. Вот цитата из статьи которую я привел. Она говорит почему я не хочу таблицы. В несколько раз больше исходного массива это слишком. Мне нужно чтобы поменьше ресурсов тратить. Самое часто встречаемое и в тоже время больше половины раз. Т.е из 13 из 25 если встретилось то это оно. Если даже 12 из 25, то выдавать нули. Я обязательно попробую ваш вариант. Хотя бы для сравнения с моим. Спасибо.
  10. нашел видеоурок по данному вопросу. Тут за 6 минут не целиком разобрана глава из книги. Но никак не могу добиться чтобы этот алгоритм заработал на ПЛИС. В следующем видео 99 идут подробности для метода Евклида. они уже не так интересны.
  11. Блоки памяти использовать не желательно. Параллельная слишком много займет. Необходимо плюс минус 300 ЛЭ, 25 тактов. лучше одно число за один такт, чем больше ресурсов потратить. Посмотрите мой алгоритм, он как раз за один такт одно число обрабатывает. Не подскажете в чем ошибка? Или если возможно попробуйте повторить его, может у вас получится реализовать.
  12. Будем считать что данные пришли уже. То есть записаны в регистры. Когда записаны, тогда сортируем.Специальный сигнал запуска Go. Отсортировать планирую за 25 тактов clk, либо меньше если возможно. Так как каждый ход алгоритма равен одному такту clk. Не хочу таблицами сортировать, так как это требует много ресурсов. Нужно держать в памяти все возможные значения. Про гистограммы не совсем понял.
  13. Не подскажете, в какой 'крохотной плис' нашлось 211 ног на ввод/вывод? Или у вас данные идут последовательно? Исходный алгоритм обрабатывает массив именно последовательно, т.е. всё можно посчитать на лету это отдельный компонент, он будет использован вместе с другими файлами. Так что "ноги" напрямую кроме clr, clk использоваться не будут. То есть я сначала отлаживаю отдельный компонент, потом формирую общий топовый файл где соединяю их вместе. Данные идут таким образом: эти регистры заполняются другим внешним компонентом по определенному закону. Точнее даже они входят в него. Это экспериментальный код, для отлаживания самого принципа.Так что не обращайте на это внимание, все эти 209 ног будут внутренними сигналами в самой плис. Когда он все сформировал, то посылает сигнал GO начала операции по выявлению этого самого повторяющегося элемента. А данный алгоритм за 25 тактов должен выявить повторяющийся элемент. Если у Вас есть идеи как сделать "на лету", я обязательно рассмотрю ваш вариант. Что касается кода, я понимаю что он не очень. Хотя бы из-за того что не работает) Но я приложил примеры из литературы на которые ориентировался. В них подобным образом все организовано и работает. Я лично проверял эти алгоритмы, тем более в учебнике приложены другие необходимые компоненты для проверки. К сожалению не могу скинуть книгу целиком. Но вот эта схема для проверки алгоритма Евклидов НОД. Я имею другую отладочную плату, но тем не менее приспособил данную схему под себя и все работает. Не говоря уже о времнных диаграммах. В любом случае буду рад если Вы предложите свой вариант реализации данного алгоритма, либо же другого, но схожего по функциям и занимаемому пространству на плис.
  14. Здравствуйте. Не получается решить следующую задачу. Есть 25 чисел, каждое 8 бит. Надо найти наиболее часто встречающиеся среди них т.е. если число встречается 13 и больше раз, это то что мы ищем. Если такого не нашлось, то надо выдать 8 нулей. Когда алгоритм отработал нужен импульс который сообщит о этом. Опишу что я сделал и как решал эту задачу. 1) https://habr.com/ru/post/167177/ Прочитал эту статью. Взял как образец. Там как раз для маленьких устройств рассмотрено. Этот алгоритм. int* majority(int[] array, int N) { int confidence = 0; // количество людей, не нашедших пары и оставшихся стоять int* candidate = NULL; // последний человек, не нашедший пару -- // возможно, его элемент встречается чаще всего // проходим по массиву и усаживаем пары с разными элементами for (int i = 0; i<N; i++) { // если до сих пор все сидят, то следующему пока придётся постоять if (confidence == 0) { candidate = array+i; confidence++; } // иначе следующий либо садится с одним из стоящих, // либо будет стоять вместе с ними, если у него такой же элемент else if (*candidate == array[i])) confidence++; else confidence--; } return confidence > 0 ? candidate : NULL; } 2) В учебнике Digital Design Using Diligilent FPGA Boards VHDL/Active-HDL Edition. Richard E. Haskell, Darrin M. Hanna 2010. Со страницы 278 там показывается как правильно реализовывать такие алгоритмы на плис на примере поиска корня и евклидов НОД. Рисунки 1 и 2 не синтезируемый код этих алгоритмов. Рисунок 3 и 4 синтезируемые на плис реализации этих алгоритмов. 3) Попытался адаптировать этот алгоритм для синтеза. Получилось следующие, точнее изначально был другой код, но я много раз пытался его исправить, но особо ничего не менялось. И я уже не помню какой он был изначально. -----Author: Zlydnev E.N. -----function: vybiraem nomera -- Revision history -- Version 1.0 : -- Date: 6/09/2019 -- Comments : Original ---- library IEEE;-- vklychaem biblioteki use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.numeric_std.all; entity chastye_elementy is -- vhodnie/vyhodnye signals port( clk : in std_logic; GO : in std_logic; clr : in std_logic; ------------------------------------------------ ------------------------------------------------ ------------------------------------------------ nomer : out std_logic_vector(7 downto 0); ibn1 : in std_logic_vector(7 downto 0);-- nomer borta na pervom zaprose ibn2 : in std_logic_vector(7 downto 0);-- nomer borta na vtorom zaprose ibn3 : in std_logic_vector(7 downto 0);-- -//- ibn4 : in std_logic_vector(7 downto 0);-- -//- ibn5 : in std_logic_vector(7 downto 0);-- -//- ibn6 : in std_logic_vector(7 downto 0);-- -//- ibn7 : in std_logic_vector(7 downto 0);-- -//- ibn8 : in std_logic_vector(7 downto 0);-- -//- ibn9 : in std_logic_vector(7 downto 0); ibn10 : in std_logic_vector(7 downto 0);-- -//- ibn11 : in std_logic_vector(7 downto 0);-- ibn12 : in std_logic_vector(7 downto 0);-- ibn13 : in std_logic_vector(7 downto 0);-- ibn14 : in std_logic_vector(7 downto 0);-- ibn15 : in std_logic_vector(7 downto 0);-- ibn16 : in std_logic_vector(7 downto 0);-- ibn17 : in std_logic_vector(7 downto 0);-- ibn18 : in std_logic_vector(7 downto 0);-- ibn19 : in std_logic_vector(7 downto 0);-- ibn20 : in std_logic_vector(7 downto 0);-- ibn21 : in std_logic_vector(7 downto 0);-- ibn22 : in std_logic_vector(7 downto 0);-- ibn23 : in std_logic_vector(7 downto 0);-- ibn24 : in std_logic_vector(7 downto 0);-- ibn25 : in std_logic_vector(7 downto 0);-- nomer borta na 25 zaprose ------------------------------------------ done : out std_logic --dalnostb po poslednemy impulsu ); end chastye_elementy; architecture rtl of chastye_elementy is type reg is array (25 downto 1) of std_logic_vector(7 downto 0);--type danyx dlya xraneniya IBN signal ibn :reg := (others => (others =>'0')); signal i : integer range 0 to 25; signal j : integer range -25 to 25; signal temp_nomer : std_logic_vector(7 downto 0); begin G3: process(clr,clk) variable calk,donev: std_logic; begin if clr = '1' then ibn <= (others => (others =>'0')); nomer <= (others =>'0'); temp_nomer <= (others =>'0'); i <= 1; j <= 0; calk := '0'; donev := '0'; elsif rising_edge(clk) then donev := '0'; if go = '1' then ibn(1) <= ibn1; ibn(2) <= ibn2; ibn(3) <= ibn3; ibn(4)<=ibn4 ;ibn(5)<= ibn5 ; ibn(6) <= ibn6; ibn(7) <= ibn7; ibn(8) <= ibn8; ibn(9) <= ibn9; ibn(10)<= ibn10; ibn(11)<=ibn11 ; ibn(12)<=ibn12 ; ibn(13) <= ibn13; ibn(14)<= ibn14; ibn(15)<= ibn15; ibn(16)<= ibn16; ibn(17)<= ibn17 ; ibn(18) <= ibn18; ibn(19) <= ibn19; ibn(20)<= ibn20; ibn(21) <= ibn21; ibn(22)<=ibn22 ; ibn(23) <= ibn23; ibn(24) <= ibn24;ibn(25)<=ibn25 ; i <= 1; j <= 0; temp_nomer <= (others =>'0'); nomer <= (others =>'0'); calk := '1'; elsif calk = '1' then if i=24 then if j > 0 then nomer <= temp_nomer; else nomer <= "00000001"; end if; donev := '1'; calk := '0'; elsif j = 0 then temp_nomer <= ibn(i+1); j<= j + 1; i<= i + 1; elsif temp_nomer = ibn(i+1) then i<= i + 1; j<= j + 1; temp_nomer <= temp_nomer; else i<=i + 1; j<=j - 1; temp_nomer <= ibn(i+1); end if; end if; end if; done <= donev; end process; end rtl; Расскажу про код ibn 1-25 - входные данные. nomer - выходное число, результат. Go- сигнал для начала алгоритма Done - сигнал для конца алгоритма Сlk - частота, clr - сброс. Остальное сделал по аналогии с примерами из учебника. Получил плохие результаты. рисунок 5. Хотя тут показана только одна попытка сделать так чтобы схема заработала. ПРОБЛЕМЫ всегда одни и та же: 1) Сигнал i не увеличивается на каждом шаге на 1, а почему то так же как и джей то увеличивается то возрастает. Также он стартует не с 0, а с 3. Хотя я прописал что i=0. 2) В результате (signal nomer) всегда выдается просто значение ibn25 Прошу помогите разобраться в этом вопросе. P.S Сейчас алгоритм занимает 270 ЛЭ. Плис крохотная как я говорил, хочется чтобы занимало это все как можно меньше места. Скорость работы не так важна. Частота у меня 37 МГц.