Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Многоразрядный накапливающий сумматор
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
kkosik
Необходимо реализовать 40-разрядный накапливающий сумматор. Входная шина 32 разряда, выходная тоже 32. Тактовая 20 МГц.
Проблема в том как это сделать. Если бы был до 32 разрядов, то входные 32 бита можно было в Integer преобразовать и потом складывать. Но функция преобразования типов больше 32 вроде бы не берет.

А вот с 40 желательно еще постараться уменьшить задержку при переносе разряда, чтобы не было конфликтов.

Наверняка, кто-нибудь да сталкивался с такой задачей. Подскажите, а? wacko.gif
andrew_b
Не понял, зачем преообразовывать в integer. Стандартная библиотечная функция
Код
function "+" (L, R: UNSIGNED) return UNSIGNED;
позволяет складывать векторы любых разрядностей.
kkosik
У меня шина std_logic_vector. То есть ты предлагаешь преобразовать её в unsigned? или каким-то образом записать в _?сигнал?_ unsigned. А потом складывать?
Boris_TS
Цитата(kkosik @ Sep 11 2012, 10:14) *
У меня шина std_logic_vector.

Цитата(kkosik @ Sep 10 2012, 22:48) *
Необходимо реализовать 40-разрядный накапливающий сумматор. Входная шина 32 разряда, выходная тоже 32. Тактовая 20 МГц.

Проблема в том как это сделать. Если бы был до 32 разрядов, то входные 32 бита можно было в Integer преобразовать и потом складывать. Но функция преобразования типов больше 32 вроде бы не берет.

1. А какие проблемы ?
2. Зачем конвертировать std_logic_vector в integer ?
3. Что Вам мешает "просто" сложить два std_logic_vector ?

Цитата(kkosik @ Sep 10 2012, 22:48) *
А вот с 40 желательно еще постараться уменьшить задержку при переносе разряда, чтобы не было конфликтов.

4. Какие именно задержки Вы собрались уменьшать, проиллюстрируйте, пожалуйста, на картинках (можно на кривых, косых, от руки рисованных и отсканированных/сфотографированных) ?
5. Коли зашла речь о частоте, задержках, то хотя бы укажите семейство ПЛИС.

P.S. И приведите код, который у Вас не синтезируется - так будет легче общаться.
ivan219
Если работаете в Quartus II то мегафункция LPM_ADD_SUB или ALTACCUMULATE
kkosik
Цитата
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
Цитата(Boris_TS @ Sep 11 2012, 10:29) *
3. Что Вам мешает "просто" сложить два std_logic_vector ?
Мешает кривая либа std_logic_arith, которая всё конвертирует в целые, и поэтому ограничена 32-битами. Стандартная библиотека numeic_std поддерживает векторы любой разрядности.

Цитата(kkosik @ Sep 11 2012, 10:55) *
Эм, я думал, std_logic_vector может быть максимально (31 downto 0). Я не прав?
Вектор сам по себе может быть любой разрядности и любого диапазона. Но если вы используете синопсисовские пакеты std_logic_{signed,unsigned,arith}, то да, только 32 разряда. Поэтому никогда-никогда не используйте эти пакеты. Стандартный пакет numeric_std полностью предоставляет все четыре арифметические действия как со знаком, так и без и без ограничения разрядности.

Цитата(kkosik @ Sep 11 2012, 10:55) *
Нужно ли вручную написать сумматор
Не нужно. Пусть работает синтезатор. Вряд ли вы напишете лучше него с учётом целевой FPGA.
kkosik
Код
# -- 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.gif
Timmy
Цитата(andrew_b @ Sep 11 2012, 11:17) *
Мешает кривая либа std_logic_arith, которая всё конвертирует в целые, и поэтому ограничена 32-битами. Стандартная библиотека numeic_std поддерживает векторы любой разрядности.

Это где Вы такую std_logic_arith откопали, можно посмотреть? Аж интересно стало. Может быть, когда-то давно и было так, но сейчас я никогда не сталкивался с ограничением длины в std_logic_arith. И в коде исходников std_logic_arith нет преобразований в целые и ограничений длины, там всё в цикле по одному биту складывают.
andrew_b
Цитата(Timmy @ Sep 11 2012, 12:40) *
Это где Вы такую 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
Эндрю, как насчет моей ошибки??
Переустановил Либеро - всё та же ересь...
Цитата
# ** Error: (vsim-3170) Could not find 'E:\Libero_Projects\easy1\simulation\postsynth.testbench'.


Ошибку победил!! ура
Оказалось, что необходимо в настройках вручную изменять имя сущности тестбэнча..... cranky.gif cranky.gif cranky.gif
Alexey K
Если std_logic_arith + std_logic_unsigned (std_logic_signed) что мешает использовать ф-ции SXT(), EXT(), или написать свою функцию.
Если std_numeric, то resize() вам в руки.

Кстати мне связка std_logic_arith + std_logic_unsigned (std_logic_signed) разонравилась когда в одном модуле нужно было работать и со знаковыми и с беззнаковыми числам.
Варианта обойти кроме кроме как разбить на несколько модулей не придумал. Может есть рецепт, но я его не знаю.
DTF
Константин, попробуйте поискать проекты сумматоров на http://opencores.org/ .
анатолий
std_logic_signed образуется из std_logic_vector простым переходом типа, т.к. первый - подтип второго.
std_logic_vector может быть любой длины.
Но если разрядность больше 32 - он преобразуется в integer - для контроля - неадекватно, в зависимости от симулятора.
Для этого приходится вектор рубить на части длиной до 32 разряда, преобразовать части в целое, затем в real и смасштабировав сложить в что-то удобоваримое.
Если нужно складывать очень быстро (с частотой до мегагерц 500),
то можно, например, в xilinx задействовать длинный сумматор в DSP48.

kkosik
так всё-таки получится у меня "+" (плюсом) складывать два logic_vector'a? или это чревато чем-либо?
Мб действительно писать второй сумматор как компонент, подключить его к 32-ух разрядному?
анатолий
Цитата(kkosik @ Sep 12 2012, 12:11) *
так всё-таки получится у меня "+" (плюсом) складывать два logic_vector'a? или это чревато чем-либо?
Мб действительно писать второй сумматор как компонент, подключить его к 32-ух разрядному?

Все получится. Я у себя культивирую арифметику с разрядностью до 200 - все нормально синтезируется, складывается и даже умножается.
Fetronics
Цитата(kkosik @ Sep 12 2012, 13:11) *
так всё-таки получится у меня "+" (плюсом) складывать два logic_vector'a? или это чревато чем-либо?
Мб действительно писать второй сумматор как компонент, подключить его к 32-ух разрядному?



Есть Арифметический (накапливающий ) сумматор у КОТОРОГО ОТСУТСТВУЕТ время переноса
Работа идет вплоть до масимальной рабочей частоты ТРИГГЕРОВ на которых он построен,
так, в Цифровом ситезаторе, максимальное значение на выходе может доходить до ТАКОВОЙ,
тогда как у КЛАССИКИ предел (Найквиста) не более половины тактовой.
Запрос о деталях по Е-mail: vottp.tiv@gmail.com
Fetronics

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.