VitalyM4 0 15 марта, 2007 Опубликовано 15 марта, 2007 (изменено) · Жалоба Здравствуйте!!! Подскажите как реализовать заданную формулу с минимальным использованием ресурсов. лучше если А и В буду регистрами, С тоже,все остальное комбинационно. С=((-А/(abs(A)+abs(B)))+1)/4; A и В знаковые 9 битные регистровые переменные, С-8 битное беззнаковое число (8 разрядов после запятой, так как оно всегда меньше 1). Сейчас это реализовано с применением пакета на fixed_point_c на VHDL, как сделать это на Veriloge без использования арифметики с фиксированной точкой?? Спасибо. Изменено 15 марта, 2007 пользователем -=Vitaly=- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 15 марта, 2007 Опубликовано 15 марта, 2007 · Жалоба Сейчас это реализовано с применением пакета на fixed_point_c на VHDL, как сделать это на Veriloge без использования арифметики с фиксированной точкой?? Никак нельзя без использования арифметики с фикс. точкой. Так как в верилоге вся встроенная арифметика (+-*/) именно такая, и другой нету. Масштабируете "-А" (сдвигаете влево) перед делителем так, чтобы частное содержало нужное кол-во разрядов после запятой. И всех делов на этом. Операция деления в верилоге синтезируемая, и именно в комбинаторный блок. Примерно как-то так, могу где-то с кол-вом бит или нулей обшибится. И еще - C явно не беззнаковое, так как "-A" будет определять знак C. Это учтено в последнем always, где я восстанавливаю знак. reg [8:0] a,b; reg [7:0] c; wire [7:0] absa, absb; wire signa; assign signa = a[8]; assign absa = (a ^ {9{a[8]}}) + a[8]; assign absb = (b ^ {9{b[8]}}) + b[8]; wire [7:0] tmp_a; assign tmp_a = ( {absa, 6'b0} / (absa+absb) ) + 7'b1000000 ); always (@posedge clock) c <= (tmp_a ^ {8{signa}}) + signa; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VitalyM4 0 16 марта, 2007 Опубликовано 16 марта, 2007 · Жалоба Никак нельзя без использования арифметики с фикс. точкой. Так как в верилоге вся встроенная арифметика (+-*/) именно такая, и другой нету. Масштабируете "-А" (сдвигаете влево) перед делителем так, чтобы частное содержало нужное кол-во разрядов после запятой. И всех делов на этом. Операция деления в верилоге синтезируемая, и именно в комбинаторный блок. Примерно как-то так, могу где-то с кол-вом бит или нулей обшибится. И еще - C явно не беззнаковое, так как "-A" будет определять знак C. Это учтено в последнем always, где я восстанавливаю знак. reg [8:0] a,b; reg [7:0] c; wire [7:0] absa, absb; wire signa; assign signa = a[8]; assign absa = (a ^ {9{a[8]}}) + a[8]; assign absb = (b ^ {9{b[8]}}) + b[8]; wire [7:0] tmp_a; assign tmp_a = ( {absa, 6'b0} / (absa+absb) ) + 7'b1000000 ); always (@posedge clock) c <= (tmp_a ^ {8{signa}}) + signa; Спасибо большой :a14: , сделал все заработало, еще вопрос -мне кажется или в vhdl операция деления не синтезируемая за исключением степени 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DM1206 0 16 марта, 2007 Опубликовано 16 марта, 2007 · Жалоба Чем синтезировали ? Из Xilinx XST User Guide, Verilog Language Support: Arithmetic / : Supported only if second operand is a power of 2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v_mirgorodsky 0 17 марта, 2007 Опубликовано 17 марта, 2007 · Жалоба Угу, и сколько ресурсов и какого кристалла это заняло и на какой частоте запустилось :o) Деление всегда было самой ресурсоемкой и медленной операцией во всех FPGA, майнстрим процессорах, ASIC'ах и других цифровых устройствах. Как обстоит дело в этом случае ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 17 марта, 2007 Опубликовано 17 марта, 2007 · Жалоба Эт реализуется например в Квартусе. Ложиться на мегафункцию. Причем тут ресурсы и время. Чтотесть то и есть. Единственное что я бы подправил wire [7:0] absa, absb; на wire [8:0] absa, absb; Код 1_0000_0000 выпадает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться