Перейти к содержанию
    

Многоразрядный накапливающий сумматор

Необходимо реализовать 40-разрядный накапливающий сумматор. Входная шина 32 разряда, выходная тоже 32. Тактовая 20 МГц.

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

 

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

 

Наверняка, кто-нибудь да сталкивался с такой задачей. Подскажите, а? :wacko:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понял, зачем преообразовывать в integer. Стандартная библиотечная функция

function "+" (L, R: UNSIGNED) return UNSIGNED;

позволяет складывать векторы любых разрядностей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня шина std_logic_vector. То есть ты предлагаешь преобразовать её в unsigned? или каким-то образом записать в _?сигнал?_ unsigned. А потом складывать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня шина 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. И приведите код, который у Вас не синтезируется - так будет легче общаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если работаете в Quartus II то мегафункция LPM_ADD_SUB или ALTACCUMULATE

Изменено пользователем ivan219

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

# -- 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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мешает кривая либа std_logic_arith, которая всё конвертирует в целые, и поэтому ограничена 32-битами. Стандартная библиотека numeic_std поддерживает векторы любой разрядности.

Это где Вы такую std_logic_arith откопали, можно посмотреть? Аж интересно стало. Может быть, когда-то давно и было так, но сейчас я никогда не сталкивался с ограничением длины в std_logic_arith. И в коде исходников std_logic_arith нет преобразований в целые и ограничений длины, там всё в цикле по одному биту складывают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это где Вы такую std_logic_arith откопали, можно посмотреть? Аж интересно стало.
Прошу прощения. Посмотрел не на ту conv_unsigned.

Но тем не менее, при наличии стандарного пакета numeric_std всякая левая проприетарщина не нужна. numeric_std один на всех, во всех САПРах он одинаковый. А синопсисовские либы std_logic_{unsigned,signed,arith} могут различаться в деталях в разных САПРах.

http://vhdlguru.blogspot.com/2010/03/why-l...-preferred.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эндрю, как насчет моей ошибки??

Переустановил Либеро - всё та же ересь...

# ** Error: (vsim-3170) Could not find 'E:\Libero_Projects\easy1\simulation\postsynth.testbench'.

 

Ошибку победил!! ура

Оказалось, что необходимо в настройках вручную изменять имя сущности тестбэнча..... :cranky: :cranky: :cranky:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если std_logic_arith + std_logic_unsigned (std_logic_signed) что мешает использовать ф-ции SXT(), EXT(), или написать свою функцию.

Если std_numeric, то resize() вам в руки.

 

Кстати мне связка std_logic_arith + std_logic_unsigned (std_logic_signed) разонравилась когда в одном модуле нужно было работать и со знаковыми и с беззнаковыми числам.

Варианта обойти кроме кроме как разбить на несколько модулей не придумал. Может есть рецепт, но я его не знаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

std_logic_signed образуется из std_logic_vector простым переходом типа, т.к. первый - подтип второго.

std_logic_vector может быть любой длины.

Но если разрядность больше 32 - он преобразуется в integer - для контроля - неадекватно, в зависимости от симулятора.

Для этого приходится вектор рубить на части длиной до 32 разряда, преобразовать части в целое, затем в real и смасштабировав сложить в что-то удобоваримое.

Если нужно складывать очень быстро (с частотой до мегагерц 500),

то можно, например, в xilinx задействовать длинный сумматор в DSP48.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так всё-таки получится у меня "+" (плюсом) складывать два logic_vector'a? или это чревато чем-либо?

Мб действительно писать второй сумматор как компонент, подключить его к 32-ух разрядному?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...