§ Предварительные сведения

Числа представлены в 16-битном формате, имеют фиксированную точность.
Бит    Описание
15     Знак 0-плюс 1-минус
14..12 Целое от 0 до 7
11..0  Мантисса (дробная часть)
Можно представить числа от -7,9997 до 7,9997.

§ Модуль умножения

module mult
(
    input wire  [15:0] a, // Множитель
    input wire  [15:0] b, // Множитель
    output wire [15:0] c  // Произведение
);

wire [31:0] res     = a[14:0] * b[14:0];
assign      c[15]   = a[15] ^ b[15];
assign      c[14:0] = res[26:12];

endmodule

§ Модуль сложения

Данный модуль складывает числа. Чтобы вычесть, необходимо обратить бит 15 для второго слагаемого b.
module summ
(
    input  wire [15:0] a, // Слагаемое
    input  wire [15:0] b, // Слагаемое
    output reg  [15:0] c  // Сумма
);

wire [15:0] ab = a[14:0] - b[14:0];
wire [15:0] ba = b[14:0] - a[14:0];

always @* begin

    case ({a[15], b[15]})

        2'b01: c = ab[15] /* A<B */ ? {1'b1, ba[14:0]} : {1'b0, ab[14:0]}; // +A-B
        2'b10: c = ba[15] /* B<A */ ? {1'b1, ab[14:0]} : {1'b0, ba[14:0]}; // -A+B
        default: c = {a[15], a[14:0] + b[14:0]}; // +A+B | -A-B

    endcase

end

endmodule
20 дек, 2020
© 2007-2022 Отличная клавиатура сидела