2013-09-23 13 views
2

В основном я пытаюсь закодировать синтезируемый модуль в verilog, который выполняет разделение между двумя числами и округляет результат. Например, если я делаю 56/30, тогда результирующее значение равно 1.86, и это значение должно быть округлено до 2 или если я делаю 42/30, результирующее значение равно 1.4, которое должно быть округлено до 1. Может ли синтезируемый код быть записан в verilog для достижения этого?Округление числа в verilog

+0

Необходимо предоставить более подробную информацию. Какой у вас синтезатор? Большинство из них превратят только оператор «/» в делитель, если он на самом деле просто сдвиг - делитель должен быть постоянной силой в два. Каковы ваши числовые форматы? Вы понимаете округление? Вероятно, вам нужно закодировать разделитель - найдите «не восстанавливающее подразделение». – EML

+0

В основном числа, которые я использую для вычислений, являются входами в мой модуль. Таким образом, цифры находятся в формате проводов. Вы упомянули, что делитель должен быть постоянной силой в два. Но во время моделирования я получил вывод 56/30 как 1, который является значением пола для частного. Мое сомнение в том, может ли код быть синтезирован, если делителем является число, отличное от мощности 2? –

+0

Я полагаю, что @EML имел в виду тот факт, что если константа или выбор делителей (знаменателей) были определены как степени 2, вы получили бы переключение, а не делитель. Переключатель имеет очень большую площадь и эффективен по сравнению с делителем. – Morgan

ответ

1

Значение ответов LSB определяется входным форматом. Если вы измените ввод числителя на фиксированную точку, по крайней мере, на 1 бит фракции, а не на целые числа, ваш результат будет иметь значение 0,5, которое вы можете использовать для управления усечением (округлением вниз) или округлением вверх.

module test; 

reg[4:0] a = 5'b0011_0; //3 with 1 Fractional bit 
reg[4:0] b = 5'b00010; //2 no fractional bits 
reg[9:0] c; 

initial begin 
    c = a/b ; //LSB => 0.5 
    // c= 5'b01_1 => 1.5 
    #1 $display("C = %b", c); 
end 
endmodule 
+0

Большое спасибо. Я получил вашу логику ... –

1

Verilog усекает конец номера, если <size> меньше, чем возвращаемое значение. Поэтому, если вы разделите 42/30, возвращаемое значение равно 1.4. Просто определите <size> как 1, а десятичное будет усечено.

Однако имейте в виду, что это решение усекает десятичное число и не округляет его. Я не эксперт в Verilog, но вы могли бы обратиться к here, чтобы решить вашу проблему.

Смежные вопросы