Jump to content

    
Sign in to follow this  
Aleksey_Serov

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

Recommended Posts

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

Share this post


Link to post
Share on other sites
Цитата

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, иначе читать невозможно.

 

Share this post


Link to post
Share on other sites
3 часа назад, Strob сказал:

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

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

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

Edited by Aleksey_Serov
Правка текста

Share this post


Link to post
Share on other sites

Понимаю что не хочется, но вот тут есть ссылка на документы с описанием разных ресурсов что есть в 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).

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

Share this post


Link to post
Share on other sites
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:

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
59 minutes ago, Aleksey_Serov said:

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

CORDIC_002.JPG

Share this post


Link to post
Share on other sites

Aleksey_Serov

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

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

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

Share this post


Link to post
Share on other sites
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. 

 

Share this post


Link to post
Share on other sites
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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
11 часов назад, Flip-fl0p сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
4 minutes ago, andrew_b said:

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

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

Share this post


Link to post
Share on other sites
1 минуту назад, des00 сказал:

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

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

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this