1234567891011121314151617181920212223242526272829303132333435 |
- //----------------------------------------------------------------------
- // Multiply: Complex Multiplier
- //----------------------------------------------------------------------
- module Multiply #(
- parameter WIDTH = 16
- )(
- input signed [WIDTH-1:0] a_re,
- input signed [WIDTH-1:0] a_im,
- input signed [WIDTH-1:0] b_re,
- input signed [WIDTH-1:0] b_im,
- output signed [WIDTH-1:0] m_re,
- output signed [WIDTH-1:0] m_im
- );
-
- wire signed [WIDTH*2-1:0] arbr, arbi, aibr, aibi;
- wire signed [WIDTH-1:0] sc_arbr, sc_arbi, sc_aibr, sc_aibi;
-
- // Signed Multiplication
- assign arbr = a_re * b_re;
- assign arbi = a_re * b_im;
- assign aibr = a_im * b_re;
- assign aibi = a_im * b_im;
-
- // Scaling
- assign sc_arbr = arbr >>> (WIDTH-1);
- assign sc_arbi = arbi >>> (WIDTH-1);
- assign sc_aibr = aibr >>> (WIDTH-1);
- assign sc_aibi = aibi >>> (WIDTH-1);
-
- // Sub/Add
- // These sub/add may overflow if unnormalized data is input.
- assign m_re = sc_arbr - sc_aibi;
- assign m_im = sc_arbi + sc_aibr;
-
- endmodule
|