How to simulate push-pull dual-drive MZM?




I’m trying to implement a push-pull dual-drive MZM, where each of the 2 arms receives the same bias voltage, and a swing that is opposite in polarity (arm 1: V_bias + swing; arm 2: V_bias - swing). The modulation format is OOK for now, and the source is a PRBS generator, with a NRZ pattern. The MZM is characterized by a measurement table that I imported (attenuation & phase vs V). I mainly care about the eye diagram on the receiver side.

So I have 2 specific questions:

  • Is there a way to implement this drive signal, and if so what do you think is the simplest one? I can’t simply split the signal in 2 and invert one of them, because then the bias is also inverted. I tried to split the digital signal form PRBS generator in 2 and send 1 to a digital inverter (which would solve my problem), but the PRBS only allows for 1 output…

  • Do two PRBS generators, simulated simultaneously with both simulation input set as ‘sequence length’, generate the same bit pattern at the same time? Or are their output uncorrelated? EDIT: Since the initial state is random for both, I guess it’s option 2…

Thank you,



Hi Maxime,

Nice to E-meet you :slight_smile: Regarding your questions:

You can use the element Fork (Element Library/Tools/Fork 1xN) to duplicate the signal, and this element works for variant signal type.

The outputs of the PRBSs can be correlated or uncorrelated depending on the setting of the ‘seed’. If the ‘automatic seed’ is set to ‘true’, then the outputs of the PRBSs are uncorrelated (random signal allocated to all the PRBSs). If the ‘sutomatic seed’ is set to ‘false’, you can specify the ‘seed’ for the PRBSs, to make them have the same or different outputs.

I hope this could help :slight_smile:


Thanks a lot!

Yes, those are exactly the answers I was looking for.



Hi again, I have a new (related) problem I’ trying to solve,

This time I’m simulating QPSK transmission, with each of the MZMs driven in push-pull mode (see file attached). I basically adapted the transmitter side of the QPSK example file (from the knowledge base) to feature push-pull drive on both I & Q arms. I filled the ‘measurement’ table of both ‘MZMs measured’ components with idealized values of attenuation & phase vs V, for simplicity. 3 questions:

  • Whatever the value of V_bias or V_Swing from the NRZ modules, I always get a constellation diagram that if off-centered from (0,0), either on 1 or both axis. In other words, my constellation seems to be restricted to 1 quadrant of the I-Q map only (see image attached). I’ve played with pretty much all transceiver/rendering parameters, and also tried replacing the 2 ‘MZM measured’ components by 4 ‘Optical modulator measured’. Nothing will center my constellation at (0,0). Any idea why?

  • Fort the component ‘MZM measured’, is the uploaded measurement data (attenuation & phase vs V) applied to both arms individually?

  • This is not related to this topic but I didn’t want to make an extra post for nothing: On an eye-diagram, is there any automated way to measure the crossing % ? The crossing level measurement doesn’t seem to be available…

QPSK- Push_pull.icp (1.3 MB)

Thank you very much again,



Hi @maxime.jacques,

I took a look at your simulation file, there is actually no big problems associated with it, but you may need some minor tweaks to get a traditional QPSK modulation result. Regarding your questions

That’s because the modulated signals’ amplitude right after the ‘MZM Measured’ are not centered at 0, which means the real and the quadrature signals are restricted to only one quadrant of the coordinate. The ‘MZM Measured’ element doesn’t has an obvious indication of the amplitude after modulation since the value is related to the absorption you defined in the table. I did try to modify your design a bit to get the conventional result but it didn’t seem to be trivial. A simple fix however is to use the ‘MZM’ element instead. You just need to select ‘dual drive’ or ‘balanced single drive’ (which is a push-pull) for the ‘modulation type’.

Yes, this data is applied to both individual arms. The driving signals modulate two branches of the MZM and then combine at the end. Note that the ‘phase shift’ is applied to one of the branches, with the specified phase value. So in your case, the upper branch of the MZM is modulated by signal [-6,-4] and the lower branch is modulated by signal [-4,-2] (with push-pull driving, the combination for the upper & lower branches driving is either [-4,-4] or [-6,-4]).

Do you mean polarization crosstalk/impairment by ‘crossing’? This part is not simulated in the system, but it is on our list to implement. Let me know if I misunderstood your question for this part.

I hope this could help, let me know if you have other problems :slight_smile:



Thanks for your reply!

I finally managed to get a conventional constellation with push-pull driving and measured MZMs, by tweaking the bias of both NRZ driving module in each arm (see file attached). Thanks again for your help.

Ideal - QPSK- Push_pull.icp (1.3 MB)

For the crossing % on eye diagrams, the definition I was referring to is simply: Crossing level / Amplitude *100. It would be easy to compute it if the crossing level measure was available. For now, a graphical estimation is possible, but rather inaccurate.

Thank you,



Hi @maxime.jacques,

I am glad it worked out. For the eye crossing percentage, I think the ‘threshold’ value under the measurement is the crossing level you want and the ‘amplitude’ is the Amplitude. However, the ‘threshold’ is the exact value but not in relative to the ‘zero level’, so you may want to deduct the ‘zero level mean’ from this value depends on what you want to measure.

I hope this could help :slight_smile: