kkosik 0 10 сентября, 2012 Опубликовано 10 сентября, 2012 · Жалоба Необходимо реализовать 40-разрядный накапливающий сумматор. Входная шина 32 разряда, выходная тоже 32. Тактовая 20 МГц. Проблема в том как это сделать. Если бы был до 32 разрядов, то входные 32 бита можно было в Integer преобразовать и потом складывать. Но функция преобразования типов больше 32 вроде бы не берет. А вот с 40 желательно еще постараться уменьшить задержку при переносе разряда, чтобы не было конфликтов. Наверняка, кто-нибудь да сталкивался с такой задачей. Подскажите, а? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба Не понял, зачем преообразовывать в integer. Стандартная библиотечная функция function "+" (L, R: UNSIGNED) return UNSIGNED; позволяет складывать векторы любых разрядностей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kkosik 0 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба У меня шина std_logic_vector. То есть ты предлагаешь преобразовать её в unsigned? или каким-то образом записать в _?сигнал?_ unsigned. А потом складывать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beby 8 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба У меня шина std_logic_vector. Необходимо реализовать 40-разрядный накапливающий сумматор. Входная шина 32 разряда, выходная тоже 32. Тактовая 20 МГц. Проблема в том как это сделать. Если бы был до 32 разрядов, то входные 32 бита можно было в Integer преобразовать и потом складывать. Но функция преобразования типов больше 32 вроде бы не берет. 1. А какие проблемы ? 2. Зачем конвертировать std_logic_vector в integer ? 3. Что Вам мешает "просто" сложить два std_logic_vector ? А вот с 40 желательно еще постараться уменьшить задержку при переносе разряда, чтобы не было конфликтов. 4. Какие именно задержки Вы собрались уменьшать, проиллюстрируйте, пожалуйста, на картинках (можно на кривых, косых, от руки рисованных и отсканированных/сфотографированных) ? 5. Коли зашла речь о частоте, задержках, то хотя бы укажите семейство ПЛИС. P.S. И приведите код, который у Вас не синтезируется - так будет легче общаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ivan219 0 11 сентября, 2012 Опубликовано 11 сентября, 2012 (изменено) · Жалоба Если работаете в Quartus II то мегафункция LPM_ADD_SUB или ALTACCUMULATE Изменено 11 сентября, 2012 пользователем ivan219 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kkosik 0 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба 1. А какие проблемы ? 2. Зачем конвертировать std_logic_vector в integer ? 3. Что Вам мешает "просто" сложить два std_logic_vector ? Эм, я думал, std_logic_vector может быть максимально (31 downto 0). Я не прав? 4. Какие именно задержки Вы собрались уменьшать, проиллюстрируйте, пожалуйста, на картинках (можно на кривых, косых, от руки рисованных и отсканированных/сфотографированных) ? 5. Коли зашла речь о частоте, задержках, то хотя бы укажите семейство ПЛИС. О задержках мне сказали, мол, перенос старшего разряда в сумматоре имеет задержку. Для её устранения используют некие (пока что не нашел) схемы пересинхронизации и схемы ускоренного переноса Схема ускоренного переноса (вики). И приведите код Кода пока что нет. Я немного недопонимаю, как лучше сделать? Нужно ли вручную написать сумматор или же ""просто" сложить два std_logic_vector" Если работаете в Quartus II то мегафункция LPM_ADD_SUB или ALTACCUMULATE Actel, прога Libero Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба 3. Что Вам мешает "просто" сложить два std_logic_vector ?Мешает кривая либа std_logic_arith, которая всё конвертирует в целые, и поэтому ограничена 32-битами. Стандартная библиотека numeic_std поддерживает векторы любой разрядности. Эм, я думал, std_logic_vector может быть максимально (31 downto 0). Я не прав?Вектор сам по себе может быть любой разрядности и любого диапазона. Но если вы используете синопсисовские пакеты std_logic_{signed,unsigned,arith}, то да, только 32 разряда. Поэтому никогда-никогда не используйте эти пакеты. Стандартный пакет numeric_std полностью предоставляет все четыре арифметические действия как со знаком, так и без и без ограничения разрядности. Нужно ли вручную написать сумматорНе нужно. Пусть работает синтезатор. Вряд ли вы напишете лучше него с учётом целевой FPGA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kkosik 0 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба # -- Loading package standard # -- Loading package std_logic_1164 # -- Loading package std_logic_arith # -- Loading package std_logic_unsigned # -- Compiling entity test # -- Compiling architecture behavior of test # vsim -L apa -L postsynth -t 1ps postsynth.testbench # ** Error: (vsim-3170) Could not find 'E:\Libero_Projects\easy1\simulation\postsynth.testbench'. # Error loading design # Error: Error loading design # Pausing macro execution # MACRO ./run.do PAUSED at line 15 Такая ошибка была у кого-нибудь ?? второй день пытаюсь ModelSim запустить - вот на этом всё и останавливается... :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба Мешает кривая либа std_logic_arith, которая всё конвертирует в целые, и поэтому ограничена 32-битами. Стандартная библиотека numeic_std поддерживает векторы любой разрядности. Это где Вы такую std_logic_arith откопали, можно посмотреть? Аж интересно стало. Может быть, когда-то давно и было так, но сейчас я никогда не сталкивался с ограничением длины в std_logic_arith. И в коде исходников std_logic_arith нет преобразований в целые и ограничений длины, там всё в цикле по одному биту складывают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 16 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба Это где Вы такую std_logic_arith откопали, можно посмотреть? Аж интересно стало.Прошу прощения. Посмотрел не на ту conv_unsigned. Но тем не менее, при наличии стандарного пакета numeric_std всякая левая проприетарщина не нужна. numeric_std один на всех, во всех САПРах он одинаковый. А синопсисовские либы std_logic_{unsigned,signed,arith} могут различаться в деталях в разных САПРах. http://vhdlguru.blogspot.com/2010/03/why-l...-preferred.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kkosik 0 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба Эндрю, как насчет моей ошибки?? Переустановил Либеро - всё та же ересь... # ** Error: (vsim-3170) Could not find 'E:\Libero_Projects\easy1\simulation\postsynth.testbench'. Ошибку победил!! ура Оказалось, что необходимо в настройках вручную изменять имя сущности тестбэнча..... :cranky: :cranky: :cranky: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
protector 0 11 сентября, 2012 Опубликовано 11 сентября, 2012 · Жалоба Если std_logic_arith + std_logic_unsigned (std_logic_signed) что мешает использовать ф-ции SXT(), EXT(), или написать свою функцию. Если std_numeric, то resize() вам в руки. Кстати мне связка std_logic_arith + std_logic_unsigned (std_logic_signed) разонравилась когда в одном модуле нужно было работать и со знаковыми и с беззнаковыми числам. Варианта обойти кроме кроме как разбить на несколько модулей не придумал. Может есть рецепт, но я его не знаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DTF 0 12 сентября, 2012 Опубликовано 12 сентября, 2012 · Жалоба Константин, попробуйте поискать проекты сумматоров на http://opencores.org/ . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aser 0 12 сентября, 2012 Опубликовано 12 сентября, 2012 · Жалоба std_logic_signed образуется из std_logic_vector простым переходом типа, т.к. первый - подтип второго. std_logic_vector может быть любой длины. Но если разрядность больше 32 - он преобразуется в integer - для контроля - неадекватно, в зависимости от симулятора. Для этого приходится вектор рубить на части длиной до 32 разряда, преобразовать части в целое, затем в real и смасштабировав сложить в что-то удобоваримое. Если нужно складывать очень быстро (с частотой до мегагерц 500), то можно, например, в xilinx задействовать длинный сумматор в DSP48. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kkosik 0 12 сентября, 2012 Опубликовано 12 сентября, 2012 · Жалоба так всё-таки получится у меня "+" (плюсом) складывать два logic_vector'a? или это чревато чем-либо? Мб действительно писать второй сумматор как компонент, подключить его к 32-ух разрядному? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться