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

Здравствуйте!

 

Знает ли кто-нибудь библиотеку VHDL, позволяющую писать выражения вида

a, b, c : std_logic_vector(...);
a <= b/c;

?

 

Понятно, что уже есть готовое IP-ядро divider, однако хотелось бы максимально упростить код.

 

Заранее благодарен.

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


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

поглядите как реализуется делитель в процессорах, и вы поймете что этим вы никак не упростите код:)...

Деление - очень долгая, дорогая, и неприятная процедура, имеющая много реализаций в зависимости от соотношения ресурсы - скорость, в свое время на просторах интернета нашел чужой код делителя, поищите "двоичный делитель VHDL" у меня не сохранилось:(... Но если у вас есть IP ядро, лучше использовать его!

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


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

Здравствуйте!

 

Понятно, что уже есть готовое IP-ядро divider, однако хотелось бы максимально упростить код.

 

Заранее благодарен.

 

табличка... просто до невозможности...

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


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

поглядите как реализуется делитель в процессорах, и вы поймете что этим вы никак не упростите код:)...

Деление - очень долгая, дорогая, и неприятная процедура, имеющая много реализаций в зависимости от соотношения ресурсы - скорость, в свое время на просторах интернета нашел чужой код делителя, поищите "двоичный делитель VHDL" у меня не сохранилось:(... Но если у вас есть IP ядро, лучше использовать его!

 

Тогда интересно, почему a <= b*c написать можно, а b/c - нельзя? Ведь умножение - тоже не самая простая процедура :) .

 

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


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

умножение - это сложение, это просто... а деление хрен там, ни разу ни вычитание.

Потому и 1 тактовых умножителей полно, а делителей за 1 такт? АРМ умножает 1 такт, а делит несколько тысяч тактов. Все не спроста.

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


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

Советую прочитать статью "Методы цифрового анализа параметров радиолокационных сигналов в реальном масштабе времени" (М.Е. Галашин),стр 12.

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


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

Советую прочитать статью "Методы цифрового анализа параметров радиолокационных сигналов в реальном масштабе времени" (М.Е. Галашин),стр 12.

 

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

 

только ТС не сказал разрядность векторов, так как для 32 бит табличка будет не хилой...

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


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

Знает ли кто-нибудь библиотеку VHDL, позволяющую писать выражения вида

 

Ну разумеется знает. Забудьте язык ада, оставьте его профессорам и академикам студентов учить и лечить... Просто возьмите верилог... И synplify (xilinx, lattice) или квартус (altera) спокойно решат все Ваши проблемы:

 

берем модуль:

 

module test(clk, a, b, c);
output reg [7:0] c;
input clk;
input [7:0] a, b;

always @(posedge clk)
    c <= a/b;

endmodule

 

получаем комбинаторный делитель:

Device utilization summary:

 

IOLOGIC 8/196 4% used

PIO (prelim) 25/174 14% used

25/100 25% bonded

SLICE 113/2376 4% used

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


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

с<=a/b

вот например ... правда это модуль, который выполняет целочисленное деление...

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


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

Ну разумеется знает. Забудьте язык ада, оставьте его профессорам и академикам студентов учить и лечить... Просто возьмите верилог... И synplify (xilinx, lattice) или квартус (altera) спокойно решат все Ваши проблемы:

На адском языке тоже так можно:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity test is
    port(
        clk:std_logic;
        a,b:std_logic_vector(7 downto 0);
        o:out std_logic_vector(7 downto 0)
    );
end entity;
architecture arch of test is 
begin
    o <= std_logic_vector(unsigned(a)/unsigned(b)) when rising_edge(clk);
end architecture;

Resource Usage Report

Part: lfe2_6e-5

 

Register bits: 8 of 6000 (0%)

PIC Latch: 0

I/O cells: 25

 

 

Details:

CCU2B: 53

GSR: 1

IB: 17

INV: 8

OB: 8

OFS1P3DX: 3

OFS1P3JX: 5

ORCALUT4: 52

PUR: 1

VHI: 1

VLO: 1

Mapper successful!

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


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

Интересно, что, судя по расходу слайсов, Синплифай в случае и verilog и vhdl использует неэффективный алгоритм деления с мультиплексированием разности и уменьшаемого. Есть более эффективный "non-restoring" алгоритм, когда результат вычитания/сложения всегда используется на следующем шаге, и, в зависимости от знака остатка, на следующем шаге выполняется либо сложение с делителем, либо вычитание. Тогда в данном примере должно использоваться 8*5 блоков CCU2B, то есть всего 40 слайсов. Видимо, в связи с малой распространенностью такого способа синтеза делителя, разработчики синтезатора на него забили:).

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


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

АРМ умножает 1 такт, а делит несколько тысяч тактов. Все не спроста.

Cortex-M3 умножает за 1 такт, а делит за максимум 12, в зависимости от чисел.

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


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

Cortex-M3 умножает за 1 такт, а делит за максимум 12, в зависимости от чисел.

 

а это вам не заменил добрый компилятор деление умножением? Чет последний раз у меня получалось сильно больше 12 при делении... Это я про чистое ядро, без помощников...

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


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

Cortex-M3 умножает за 1 такт, а делит за максимум 12, в зависимости от чисел.

что-то в соседней теме я не заметил 12 тактов на деление.

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


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

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

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

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

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

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

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

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

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

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