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

CORDIC и отрицательные числа, как правильно преобразовать

Интересно, синтезатор поймет, что это сумматор и задействует соответствующие аппаратные ресурсы или все на лутах и обычных интерсоннектах разведет?

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


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

Цитата

library ieee;

use ieee.std_logic_1164.ALL;

use ieee.numeric_std.ALL;

library UNISIM;

use UNISIM.Vcomponents.ALL;

use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;

use IEEE.numeric_std.all;

use ieee.std_logic_misc.all;

 

Что это? Зачем всё это? Оставьте первые две строки, остальное вам тут не нужно. unisim -- это библиотека симуляциооных моделе xilinx. Зачем она вам тут, если у вас никаких примитивов не используется?

На будущее: используйте только numeric_std для математики. std_logic_arith и std_logic_unsigned забудьте.

Используйте тег code, иначе читать невозможно.

 

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


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

3 часа назад, Strob сказал:

Интересно, синтезатор поймет, что это сумматор и задействует соответствующие аппаратные ресурсы или все на лутах и обычных интерсоннектах разведет?

То есть есть разница в конечном результате что получится? Я представлял ПЛИС как массив одинаковых логических элементов, вентилейв отличие от CPLD в которых какие-то навороченные блоки. То есть для ПЛИС все-таки есть разница как описывать? Там, выходит, тоже какие-то готовые особо скоростные сумматоры наряду с вентилями? Я представлял ПЛИС как нечто что описано в этой лекции, ключи и диоды и разводка

только всего там больше

Изменено пользователем Aleksey_Serov
Правка текста

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


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

Понимаю что не хочется, но вот тут есть ссылка на документы с описанием разных ресурсов что есть в SPARTAN6 (для примера) https://www.xilinx.com/support/documentation/data_sheets/ds160.pdf на последней странице.

а тут https://www.xilinx.com/support/documentation/user_guides/ug384.pdf  документация на CLB (Configurable Logic Block).

У остальных вендоров ПЛИС тоже есть документация и свои особенности!

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


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

25 minutes ago, Aleksey_Serov said:

Я представлял ПЛИС как массив одинаковых логических элементов, вентилейв отличие от CPLD в которых какие-то навороченные блоки

Это выло в самом начале  - PLA, PAL, GAL... (https://t-way.ru/articles/programmable-logic-device)

26 minutes ago, Aleksey_Serov said:

Там, выходит, тоже какие-то готовые особо скоростные сумматоры наряду с вентилями?

В состав FPGA входят блоки DSP. можно использовать их возможности, если нужно.

28 minutes ago, Aleksey_Serov said:

для ПЛИС все-таки есть разница как описывать?

Если описывать "в лоб" (как тут без ускоренного переноса) и запретить оптимизацию написанного кода - то получите медленно функционирующее устройство, функционируюшее строго как указано.

Но можно отдать процесс синтеза на откуп компилятору (описав устройство более "человеческим" стилем) - синтезатор в соответствии с заложенными в нем алгоритмами и возможностями конкретной микросхемы выберет способ создания нужного устройства из "кирпичиков", содержащихся в этой микросхеме. При этом в настройках компилятора тоже можно указать - к чему он должен стремиться (например - к максимальному быстродействию, или - к экономии ресурсов).

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


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

То есть если хотя бы в CORDIC я заменю свои кондовые сумматоры на entity где происходит:

1 преобразование векторов в integer

2 сложение/вычитание

3 преобразование в векторы

(Я пока так себе представляю более совершенный вариант)

 то уже будет лучше?

или надо все более глубоко менять, отказавшись и от векторов (векторы мне понравились тем что берешь старший бит и используешь его как "ключ", определяющий сложение или вычитание делать в следующей итерации)

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


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

59 minutes ago, Aleksey_Serov said:

То есть если хотя бы в CORDIC я заменю свои кондовые сумматоры на entity где происходит:

1 преобразование векторов в integer

2 сложение/вычитание

3 преобразование в векторы

Вектора разные бывают. Для библиотеки numeric_std, вектора signed и unsigned могут использоваться в арифметических операциях. Поэтому в integer ничего преобразовывать не надо.

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


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

Вот в каком виде я написал CORDIC, в нем все сигналы (линии между блоками) std_logic_vector или просто std_logic, Если я переделываю сумматоры оставляю сигналы как есть и убираю лишние библиотеки, то все становится как надо, я правильно понимаю?, только я думал что вектор бывает только std_logic_vector, про unsigned_vector я ничего не читал, точнее и не знал. Вообще цели проекта две

1 сделать приемник с преобразованием вниз и АЦП 24 бит на частоте в несколько десятков кГц

2 Сделать передатчик КВ диапазона ЧМ, АМ, SSB с прямым синтезом (ЦАП к антенне)

А в будущем желательно сделать CORDIC для приемника с АЦП к антенне, это уже совсем круто, там, как я понимаю разрядность надо оптимизировать (убавить) и быстродействие, про что разговор и ведется сделать как положено в соответствии с максимальным использованием ресурсов ПЛИС

CORDIC_002.JPG

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


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

Aleksey_Serov

про unsigned_vector я ничего не читал

http://www.pldworld.com/_hdl/4/_ref/dz.ee.ethz.ch/vhdl_packages.htm

Прям на месте можно преобразовывать типы, никаких доп. ресурсов это не требует. Можно сделать сумматор-вычитатель одной операцией "+" и манипуляциями с битами векторов.

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


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

1 час назад, Aleksey_Serov сказал:

Вот в каком виде я написал CORDIC, в нем все сигналы (линии между блоками) std_logic_vector или просто std_logic, Если я переделываю сумматоры оставляю сигналы как есть и убираю лишние библиотеки, то все становится как надо, я правильно понимаю?, только я думал что вектор бывает только std_logic_vector, про unsigned_vector я ничего не читал, точнее и не знал. Вообще цели проекта две

1 сделать приемник с преобразованием вниз и АЦП 24 бит на частоте в несколько десятков кГц

2 Сделать передатчик КВ диапазона ЧМ, АМ, SSB с прямым синтезом (ЦАП к антенне)

А в будущем желательно сделать CORDIC для приемника с АЦП к антенне, это уже совсем круто, там, как я понимаю разрядность надо оптимизировать (убавить) и быстродействие, про что разговор и ведется сделать как положено в соответствии с максимальным использованием ресурсов ПЛИС

 

В стандартных библиотеках VHDL нет unsigned_vector, есть unsigned. Если собираетесь дальше писать на VHDL - настоятельно рекомендую разобраться со всеми типами и подтипами в VHDL. 

 

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


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

19 hours ago, Aleksey_Serov said:

Вобщем сделал вычислительную часть, считает синус (Ну и косинус) правильно, все это сделал особым "стилем "(по выражению как написано в книге бибило) стиль в том что сумматоры побитно расписаны и все сигналы - битовые векторы, может это и не совсем правильно - запись громоздкая но судя по той же книге "и чего такого", ни одной записи вроде a+b, только хардкорная логика, может быть переделаю в "другой стиль", осталось только модуль генерации фазы написать

сложно у вас, за мишурой теряются детали алгоритма. По сути все ядро кордика, в развернутом виде (loop unrolling), это 

  always_ff @(posedge iclk) begin
    if (iclk_ena) begin
      if (ival) begin
        dat_x <= (idat_x_resize ^ {cDAT_W{sign_x}}) + sign_x; //    dat_x <= sign_x ? -dat_x : dat_x;
        dat_y <= (idat_y_resize ^ {cDAT_W{sign_x}}) + sign_x; //    dat_y <= sign_x ? -dat_y : dat_y;

        if (sign_x)
          z_rad <= sign_y ? cPI_RAD_MINUS : cPI_RAD_PLUS;
        else
          z_rad <= '0;

        if (sign_x)
          z_deg <= sign_y ? cPI_DEG_MINUS : cPI_DEG_PLUS;
        else
          z_deg <= '0;
      end
    end
  end

  generate
    genvar i;
    for (i = 0; i < pN; i++) begin : step_gen

      assign delta           [i] = (i == 0) ? dat_y[cDAT_W-1] : dat_y_reg[i-1][cDAT_W-1];
      assign dat_x_reg_shift [i] = (i == 0) ? dat_x >>> i     : dat_x_reg[i-1] >>> i;
      assign dat_y_reg_shift [i] = (i == 0) ? dat_y >>> i     : dat_y_reg[i-1] >>> i;

      always_ff @(posedge iclk) begin
        if (iclk_ena) begin
          if (val[i]) begin
            if (i == 0) begin
              if (delta[i]) begin
                dat_x_reg[i] <= dat_x - dat_y_reg_shift[i] ;
                dat_y_reg[i] <= dat_y + dat_x_reg_shift[i] ;

                z_rad_reg[i] <= z_rad - cALPHA_RAD     [i] ;
                z_deg_reg[i] <= z_deg - cALPHA_DEG     [i] ;
              end
              else begin
                dat_x_reg[i] <= dat_x + dat_y_reg_shift[i] ;
                dat_y_reg[i] <= dat_y - dat_x_reg_shift[i] ;

                z_rad_reg[i] <= z_rad + cALPHA_RAD     [i] ;
                z_deg_reg[i] <= z_deg + cALPHA_DEG     [i] ;
              end
            end
            else begin
              if (delta[i]) begin
                dat_x_reg[i] <= dat_x_reg[i-1] - dat_y_reg_shift[i];
                dat_y_reg[i] <= dat_y_reg[i-1] + dat_x_reg_shift[i];

                z_rad_reg[i] <= z_rad_reg[i-1] - cALPHA_RAD     [i];
                z_deg_reg[i] <= z_deg_reg[i-1] - cALPHA_DEG     [i];
              end
              else begin
                dat_x_reg[i] <= dat_x_reg[i-1] + dat_y_reg_shift[i];
                dat_y_reg[i] <= dat_y_reg[i-1] - dat_x_reg_shift[i];

                z_rad_reg[i] <= z_rad_reg[i-1] + cALPHA_RAD     [i];
                z_deg_reg[i] <= z_deg_reg[i-1] + cALPHA_DEG     [i];
              end
            end
          end
        end
      end

    end
  endgenerate

 

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


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

А еще в Xilinx ISE есть графический редактор Schematic. В нем есть смысл чего-то делать, соединять модули, или лучше его не трогать (а то только хуже будет), а все описывать. Я поначалу в нем блоки сумматоров делал из логических элементов, мне так понятнее было, теперь понятно что стиль колхозный, но даже если имеются написанные модули, тоже наверно не стоит создавать символы и в нем соединять?

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


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

11 часов назад, Flip-fl0p сказал:

Если собираетесь дальше писать на VHDL - настоятельно рекомендую разобраться со всеми типами и подтипами в VHDL.

Писал не раз и ещё раз повторю: изучение языка состоит из двух частей: 1) изучение самого языка, его синтаксиса и семантики и 2) изучение стандартных библиотек (если они есть). В VHDL такие библиотеки есть, и они много чего позволяют делать. Не надо изобретать велосипеды, да ещё с некруглыми колёсами.

Только что, Aleksey_Serov сказал:

А еще в Xilinx ISE есть графический редактор Schematic. В нем есть смысл чего-то делать, соединять модули, или лучше его не трогать (а то только хуже будет), а все описывать.

Про схематик забудьте сразу. Только язык. Схемный ввод умер.

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


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

4 minutes ago, andrew_b said:

Про схематик забудьте сразу. Только язык. Схемный ввод умер.

Схематик соглашусь, да, умер, но не  схемный ввод. Много в BD делается быстрее и проще чем кодом, особенно если собирать систему из готовых компонентов.

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


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

1 минуту назад, des00 сказал:

Много в BD делается быстрее и проще чем кодом, особенно если собирать систему из готовых компонентов.

С этим я согласен. Если рисование BD тоже называть схемным вводом, то тоже согласен. Но всё-таки IP и примитивы несколько разные сущности. Я по схемным вводом подразумевал именно "рисование" проекта из примитивов.

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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