Complex Multiplier (complex_multiplier)

Multiplies together two complex values.

Design

The mathematical representation of the implementation is given in (150).

(150)\[z[n] = x[n] * y[n]\]

In (150):

  • \(x[n]\) and \(y[n]\) are the input values.

  • \(z[n]\) is the output values.

A block diagram representation of the implementation is given in Figure 473:.

Block diagram of complex multiplier implementation.

Figure 473: Complex multiplier implementation.

Implementation

The complex multiplication is done as four multiplications, as show in (151).

(151)\[\begin{split}z[n] = \left( \operatorname{Re}(x[n])\operatorname{Re}(y[n]) - \operatorname{Im}(x[n])\operatorname{Im}(y[n]) ) + \\ i( \operatorname{Re}(x[n])\operatorname{Im}(y[n]) + \operatorname{Im}(x[n]) \operatorname{Re}(y[n]) \right)\end{split}\]

This primitive is fully pipelined with two + input_shift_length_g cycles of latency.

The output can be optionally right shifted by setting the bit_drop_g generic. This is useful when it is desired that the inputs and outputs are the same width.

Interface

Generics

  • input_a_size_g (integer): A input bit width of the complex multiplier.

  • input_b_size_g (integer): B input bit width of the complex multiplier.

  • output_size_g (integer): Output bit width of the complex multiplier.

  • bit_drop_g (integer): Number of places to right shift the result of the multiplier by before connecting it to the output port.

  • input_shift_length_g (integer): Sets the number of registers in the input path. Usually absorbed by the DSP slices for timing optimisations.

Ports

  • clk (std_logic), in: Clock. Inputs and outputs registered on rising edge.

  • rst (std_logic), in: Reset. Active high, synchronous with rising edge of clock.

  • enable (std_logic), in: Enable. Primitive enabled when high.

  • a_real (signed, input_a_size_g bits), in: \(\operatorname{Re}(a)\) input.

  • a_imag (signed, input_a_size_g bits), in: \(\operatorname{Im}(a)\) input.

  • b_real (signed, input_b_size_g bits), in: \(\operatorname{Re}(b)\) input.

  • b_imag (signed, input_b_size_g bits), in: \(\operatorname{Im}(b)\) input.

  • p_real (signed, output_size_g bits), out: \(\operatorname{Re}(y)\) output.

  • p_imag (signed, output_size_g bits), out: \(\operatorname{Im}(y)\) output.

Dependencies

The dependencies to other elements in OpenCPI are:

  • None.

There is also a dependency on:

  • ieee.std_logic_1164

  • ieee.numeric_std

Limitations

Limitations of complex_multiplier are:

  • None.