реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Многоразрядный накапливающий сумматор, vhdl, принцип
kkosik
сообщение Sep 10 2012, 18:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 8-09-12
Пользователь №: 73 445



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

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

Наверняка, кто-нибудь да сталкивался с такой задачей. Подскажите, а? wacko.gif
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Sep 11 2012, 04:30
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Не понял, зачем преообразовывать в integer. Стандартная библиотечная функция
Код
function "+" (L, R: UNSIGNED) return UNSIGNED;
позволяет складывать векторы любых разрядностей.
Go to the top of the page
 
+Quote Post
kkosik
сообщение Sep 11 2012, 06:14
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 8-09-12
Пользователь №: 73 445



У меня шина std_logic_vector. То есть ты предлагаешь преобразовать её в unsigned? или каким-то образом записать в _?сигнал?_ unsigned. А потом складывать?
Go to the top of the page
 
+Quote Post
Boris_TS
сообщение Sep 11 2012, 06:29
Сообщение #4


Злополезный
****

Группа: Свой
Сообщений: 608
Регистрация: 19-06-06
Из: Russia Taganrog
Пользователь №: 18 188



Цитата(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. И приведите код, который у Вас не синтезируется - так будет легче общаться.
Go to the top of the page
 
+Quote Post
ivan219
сообщение Sep 11 2012, 06:44
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 350
Регистрация: 16-11-08
Пользователь №: 41 680



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

Сообщение отредактировал ivan219 - Sep 11 2012, 06:52
Go to the top of the page
 
+Quote Post
kkosik
сообщение Sep 11 2012, 06:55
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 8-09-12
Пользователь №: 73 445



Цитата
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
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Sep 11 2012, 07:17
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(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.
Go to the top of the page
 
+Quote Post
kkosik
сообщение Sep 11 2012, 08:06
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 8-09-12
Пользователь №: 73 445



Код
# -- 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
Go to the top of the page
 
+Quote Post
Timmy
сообщение Sep 11 2012, 08:40
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(andrew_b @ Sep 11 2012, 11:17) *
Мешает кривая либа std_logic_arith, которая всё конвертирует в целые, и поэтому ограничена 32-битами. Стандартная библиотека numeic_std поддерживает векторы любой разрядности.

Это где Вы такую std_logic_arith откопали, можно посмотреть? Аж интересно стало. Может быть, когда-то давно и было так, но сейчас я никогда не сталкивался с ограничением длины в std_logic_arith. И в коде исходников std_logic_arith нет преобразований в целые и ограничений длины, там всё в цикле по одному биту складывают.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Sep 11 2012, 09:37
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(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
Go to the top of the page
 
+Quote Post
kkosik
сообщение Sep 11 2012, 10:34
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 8-09-12
Пользователь №: 73 445



Эндрю, как насчет моей ошибки??
Переустановил Либеро - всё та же ересь...
Цитата
# ** Error: (vsim-3170) Could not find 'E:\Libero_Projects\easy1\simulation\postsynth.testbench'.


Ошибку победил!! ура
Оказалось, что необходимо в настройках вручную изменять имя сущности тестбэнча..... cranky.gif cranky.gif cranky.gif
Go to the top of the page
 
+Quote Post
Alexey K
сообщение Sep 11 2012, 13:46
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 14-07-11
Пользователь №: 66 220



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

Кстати мне связка std_logic_arith + std_logic_unsigned (std_logic_signed) разонравилась когда в одном модуле нужно было работать и со знаковыми и с беззнаковыми числам.
Варианта обойти кроме кроме как разбить на несколько модулей не придумал. Может есть рецепт, но я его не знаю.
Go to the top of the page
 
+Quote Post
DTF
сообщение Sep 12 2012, 01:26
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 87
Регистрация: 6-11-09
Пользователь №: 53 453



Константин, попробуйте поискать проекты сумматоров на http://opencores.org/ .
Go to the top of the page
 
+Quote Post
анатолий
сообщение Sep 12 2012, 10:06
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 221
Регистрация: 10-12-05
Из: Украина
Пользователь №: 12 052



std_logic_signed образуется из std_logic_vector простым переходом типа, т.к. первый - подтип второго.
std_logic_vector может быть любой длины.
Но если разрядность больше 32 - он преобразуется в integer - для контроля - неадекватно, в зависимости от симулятора.
Для этого приходится вектор рубить на части длиной до 32 разряда, преобразовать части в целое, затем в real и смасштабировав сложить в что-то удобоваримое.
Если нужно складывать очень быстро (с частотой до мегагерц 500),
то можно, например, в xilinx задействовать длинный сумматор в DSP48.

Go to the top of the page
 
+Quote Post
kkosik
сообщение Sep 12 2012, 10:11
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 8-09-12
Пользователь №: 73 445



так всё-таки получится у меня "+" (плюсом) складывать два logic_vector'a? или это чревато чем-либо?
Мб действительно писать второй сумматор как компонент, подключить его к 32-ух разрядному?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 14:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.04305 секунд с 7
ELECTRONIX ©2004-2016