aabmail 0 8 февраля, 2014 Опубликовано 8 февраля, 2014 · Жалоба Здравствуйте! Знает ли кто-нибудь библиотеку VHDL, позволяющую писать выражения вида a, b, c : std_logic_vector(...); a <= b/c; ? Понятно, что уже есть готовое IP-ядро divider, однако хотелось бы максимально упростить код. Заранее благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 8 февраля, 2014 Опубликовано 8 февраля, 2014 · Жалоба поглядите как реализуется делитель в процессорах, и вы поймете что этим вы никак не упростите код:)... Деление - очень долгая, дорогая, и неприятная процедура, имеющая много реализаций в зависимости от соотношения ресурсы - скорость, в свое время на просторах интернета нашел чужой код делителя, поищите "двоичный делитель VHDL" у меня не сохранилось:(... Но если у вас есть IP ядро, лучше использовать его! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 8 февраля, 2014 Опубликовано 8 февраля, 2014 · Жалоба Здравствуйте! Понятно, что уже есть готовое IP-ядро divider, однако хотелось бы максимально упростить код. Заранее благодарен. табличка... просто до невозможности... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aabmail 0 8 февраля, 2014 Опубликовано 8 февраля, 2014 · Жалоба поглядите как реализуется делитель в процессорах, и вы поймете что этим вы никак не упростите код:)... Деление - очень долгая, дорогая, и неприятная процедура, имеющая много реализаций в зависимости от соотношения ресурсы - скорость, в свое время на просторах интернета нашел чужой код делителя, поищите "двоичный делитель VHDL" у меня не сохранилось:(... Но если у вас есть IP ядро, лучше использовать его! Тогда интересно, почему a <= b*c написать можно, а b/c - нельзя? Ведь умножение - тоже не самая простая процедура :) . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 8 февраля, 2014 Опубликовано 8 февраля, 2014 · Жалоба умножение - это сложение, это просто... а деление хрен там, ни разу ни вычитание. Потому и 1 тактовых умножителей полно, а делителей за 1 такт? АРМ умножает 1 такт, а делит несколько тысяч тактов. Все не спроста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Skryppy 1 8 февраля, 2014 Опубликовано 8 февраля, 2014 · Жалоба Советую прочитать статью "Методы цифрового анализа параметров радиолокационных сигналов в реальном масштабе времени" (М.Е. Галашин),стр 12. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 8 февраля, 2014 Опубликовано 8 февраля, 2014 · Жалоба Советую прочитать статью "Методы цифрового анализа параметров радиолокационных сигналов в реальном масштабе времени" (М.Е. Галашин),стр 12. не слишком долгий путь для указания на то что деление можно заменить умножением на обратную величину взятую из таблицы? только ТС не сказал разрядность векторов, так как для 32 бит табличка будет не хилой... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 8 февраля, 2014 Опубликовано 8 февраля, 2014 · Жалоба Знает ли кто-нибудь библиотеку 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 8 февраля, 2014 Опубликовано 8 февраля, 2014 · Жалоба с<=a/b вот например ... правда это модуль, который выполняет целочисленное деление... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 9 февраля, 2014 Опубликовано 9 февраля, 2014 · Жалоба Ну разумеется знает. Забудьте язык ада, оставьте его профессорам и академикам студентов учить и лечить... Просто возьмите верилог... И 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! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 10 февраля, 2014 Опубликовано 10 февраля, 2014 · Жалоба Интересно, что, судя по расходу слайсов, Синплифай в случае и verilog и vhdl использует неэффективный алгоритм деления с мультиплексированием разности и уменьшаемого. Есть более эффективный "non-restoring" алгоритм, когда результат вычитания/сложения всегда используется на следующем шаге, и, в зависимости от знака остатка, на следующем шаге выполняется либо сложение с делителем, либо вычитание. Тогда в данном примере должно использоваться 8*5 блоков CCU2B, то есть всего 40 слайсов. Видимо, в связи с малой распространенностью такого способа синтеза делителя, разработчики синтезатора на него забили:). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aabmail 0 10 февраля, 2014 Опубликовано 10 февраля, 2014 · Жалоба Ну разумеется знает. Спасибо всем за ответы :) . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 февраля, 2014 Опубликовано 10 февраля, 2014 · Жалоба АРМ умножает 1 такт, а делит несколько тысяч тактов. Все не спроста. Cortex-M3 умножает за 1 такт, а делит за максимум 12, в зависимости от чисел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 10 февраля, 2014 Опубликовано 10 февраля, 2014 · Жалоба Cortex-M3 умножает за 1 такт, а делит за максимум 12, в зависимости от чисел. а это вам не заменил добрый компилятор деление умножением? Чет последний раз у меня получалось сильно больше 12 при делении... Это я про чистое ядро, без помощников... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ZASADA 0 10 февраля, 2014 Опубликовано 10 февраля, 2014 · Жалоба Cortex-M3 умножает за 1 такт, а делит за максимум 12, в зависимости от чисел. что-то в соседней теме я не заметил 12 тактов на деление. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться