Округление с нуля в конце
Мы можем округлить число, скажем, от 23 или 74 до 20 и 70, увидев числа lsb(самый правый бит) и 26 или 78 до 30 и 80.. Я сомневаюсь, возможно ли это в кодах verilog... Я хочу знаю, что после преобразования в цифровую форму эта концепция станет возможной.
2 ответа
Если вы просто хотите сделать LSB любого регистра нулем, вы всегда можете сделать что-то вроде этого
reg [7:0] a;
reg [7:0] b = 23;
a = {b[7:1], 1'b0};
В общем, чтобы округлить целые числа из базы n, вы добавляете n/2 и делите на n (отбрасывая остаток), а затем умножаете на n. Итак, ваши примеры выше:
(23+5)/10 * 10 = 20
(28+5)/10 * 10 = 30
Делать это с двоичной логикой немного дороже, так как вам нужно делить и умножать. Однако, если вы работаете с числами из базы 2, тогда эти операции бесплатны, так как это всего лишь сдвиг.
Для примера в двоичном коде, скажем, вы хотите округлить 61 до ближайшего кратного 8, что будет 64. В двоичном случае 61 равен 6'b011101. Добавьте к этому 8/2 (6'b000100), и вы получите 6'b100001, который равен 65. Теперь разделите на 8 и умножьте на 8. Поскольку это просто сдвиг вправо на 3 и затем сдвиг влево на три, мы можем просто обнулить 3 фунта, чтобы получить 6'b100000, что составляет 64.