|
Многоразрядный накапливающий сумматор, vhdl, принцип |
|
|
|
Sep 10 2012, 18:48
|
Участник

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

|
Необходимо реализовать 40-разрядный накапливающий сумматор. Входная шина 32 разряда, выходная тоже 32. Тактовая 20 МГц. Проблема в том как это сделать. Если бы был до 32 разрядов, то входные 32 бита можно было в Integer преобразовать и потом складывать. Но функция преобразования типов больше 32 вроде бы не берет. А вот с 40 желательно еще постараться уменьшить задержку при переносе разряда, чтобы не было конфликтов. Наверняка, кто-нибудь да сталкивался с такой задачей. Подскажите, а?
|
|
|
|
|
Sep 11 2012, 04:30
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Не понял, зачем преообразовывать в integer. Стандартная библиотечная функция Код function "+" (L, R: UNSIGNED) return UNSIGNED; позволяет складывать векторы любых разрядностей.
|
|
|
|
|
Sep 11 2012, 06:14
|
Участник

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

|
У меня шина std_logic_vector. То есть ты предлагаешь преобразовать её в unsigned? или каким-то образом записать в _?сигнал?_ unsigned. А потом складывать?
|
|
|
|
|
Sep 11 2012, 06:29
|
Злополезный
   
Группа: Свой
Сообщений: 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. И приведите код, который у Вас не синтезируется - так будет легче общаться.
|
|
|
|
|
Sep 11 2012, 06:55
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 11 2012, 07:17
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Sep 11 2012, 08:06
|
Участник

Группа: Участник
Сообщений: 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 запустить - вот на этом всё и останавливается...
|
|
|
|
|
Sep 11 2012, 10:34
|
Участник

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

|
Эндрю, как насчет моей ошибки?? Переустановил Либеро - всё та же ересь... Цитата # ** Error: (vsim-3170) Could not find 'E:\Libero_Projects\easy1\simulation\postsynth.testbench'. Ошибку победил!! ура Оказалось, что необходимо в настройках вручную изменять имя сущности тестбэнча.....
|
|
|
|
|
Sep 11 2012, 13:46
|
Участник

Группа: Участник
Сообщений: 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) разонравилась когда в одном модуле нужно было работать и со знаковыми и с беззнаковыми числам. Варианта обойти кроме кроме как разбить на несколько модулей не придумал. Может есть рецепт, но я его не знаю.
|
|
|
|
|
Sep 12 2012, 01:26
|
Частый гость
 
Группа: Участник
Сообщений: 87
Регистрация: 6-11-09
Пользователь №: 53 453

|
Константин, попробуйте поискать проекты сумматоров на http://opencores.org/ .
|
|
|
|
|
Sep 12 2012, 10:11
|
Участник

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

|
так всё-таки получится у меня "+" (плюсом) складывать два logic_vector'a? или это чревато чем-либо? Мб действительно писать второй сумматор как компонент, подключить его к 32-ух разрядному?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|