• 0

SERDES doesn't work as expected

Go to solution Solved by asmi,


Hi, my board is Zybo-Z7 20

I am trying to run simple scheme with 2 serdes blocks.

I have got 2 switches and 2 leds. 

I want to run next scheme:

2 switches -> Serializer (2:1) -> ...... TMDS ....... -> Deserializer (1:2)  -> 2 leds


I've connected PMOD JB1 -> JB2 with 2 wires.

But I can't restore a valid signal.

I recieve only 11 or 00. (00->00, 01->11, 10->11, 11->11)


Serializator settings:


Deserializator settings:






clk_10 =10 MHz

clk_20 = 20 Mhz






  design_1 d0 (    




What is wrong ? Should I use some resistors on TMDS line?


Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 0
  • Solution
57 minutes ago, fel88 said:

I've tried to add 50Ohm resistor between lines.

If you want to have any success in FPGA design space, you will need to love reading. In this case, UG471 has everything you need to know.

Specifically, it says this:


TMDS (Transition Minimized Differential Signaling)
TMDS is a differential I/O standard for transmitting high-speed serial data used by the DVI and HDMI video interfaces. The TMDS standard requires external 50Ω pull-up resistors to 3.3V on the inputs. TMDS inputs do not require differential input termination resistors. TMDS is only available in HR I/O banks and requires a VCCO voltage level of 3.3V. The IOSTANDARD is called TMDS_33. Table 1-52 summarizes all the possible TMDS I/O standards.

TMDS belongs to the family of physical standards which are driven by the current as opposed to voltage level as previous ones did. This has a number of important advantages for high-speed communications, but it also requires a complete circuit to actually see the data. Different standards approach this in a different way - some require termination to Vcc, some - to ground, yet some - to a midpoint or some other reference level. TMDS uses termination to the Vcc. So you need to have external termination of ~50 Ohm to VCCIO rail of 3.3 V in order for your loopback to work.

Edited by asmi
Link to post
Share on other sites
  • 0
23 minutes ago, fel88 said:

Should I use some resistors on TMDS line?

If you are using TMDS33 then you MUST have 50 ohm termination. See the Series7 Select IO user guide.

I'm not sure what exactly you are trying to do here but you'd be far better off using an HDL rather than the board design flow. Trying to use really slow clocks out of an MMCM and switch inputs for output data and LEDs for input data is not a very effective way to explore this. 

Link to post
Share on other sites
  • 0

I've also tried 60/120 MHz clocks. 

I've tried to add 50Ohm resistor between lines.

I've tried to set pull-up like this:

set_property -dict {PACKAGE_PIN V8 IOSTANDARD TMDS_33 PULLUP true} [get_ports {jb_out_p[0]}]
set_property -dict {PACKAGE_PIN W8 IOSTANDARD TMDS_33 PULLUP true} [get_ports {jb_out_n[0]}]

Unfortunately, all my attempts didn't bring any meaningful results.

Maybe someone could provide a working SERDES loopback project?

Link to post
Share on other sites
  • 0
2 minutes ago, fel88 said:

I've tried to add 50Ohm resistor between lines.

That's not how TMDS termination works. Read the material that I've suggested. Do not try and connect custom hardware or wires to your board unless you understand supported IOSTANDARD specifications and terminations for your device and bank Vccio. TMDS_33 termination resistors are external. The FPGA IO PULL_UP and PULL_DOWN are not suitable. Again, you need to do your homework before starting any experimentation.

You are not likely to find what you are looking for using Xilinx IP. and the board design flow. You will have better fortunes if you learn Verilog or VHDL. The Digilent staff are keen on the board design approach perhaps you will be lucky and one of them will have some suggestions. But really, the appropriate thing to do here is write your own HDL to experiment with IOSERDES.

Link to post
Share on other sites
  • 0

One thing I remember when using SERDES is that they require a proper reset procedure before they are functional. So try adding a reset block (you can use "Processor Reset Block" to sync incoming async reset to the system frequency if you don't feel like doing so HDL) and connecting it to a reset inputs of your SERDES blocks.

Link to post
Share on other sites
  • 0

Looking at the static levels of digital signals is analogous to looking at a picture of the front of an elephant and trying to peek around to see its rear. You can't because a picture is just a 2D representation of a 3D object. Trying to look at the static state of a signal is similar. You need to have another dimension which is time. For something like SERDES where there are multiple transitions per clock just make things more complicated. I'm glad that you got to your initial goal. I'm hoping that you don't stop there but can take more steps.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now