mrflibble
Advanced Member level 5
Short version: How do you handle a clock enable where the clock enable has to travel to the CE pins of flip-flops that are all over the place on the fpga die?
I have a design that uses clock enables, and for the life of me I cannot get it to work. That is to say, I can get it to work, but not without ugly workarounds.
The situation is pretty simple. I have several modules where the flip-flops only have to clock in the data at every other clock cycle. That is, I use clock enable to relax the timing constraints on these modules. So I have lets say 20 modules spread over a large area of the die, and they use:
- the same clock of 375 MHz.
- the same clock enable signal.
For the clock signal we have low skew global clock nets to distribute the clock. Now as I understand it, in a spartan-6 you don't have dedicated nets to distribute clock enables. So how do you distribute the clock enable to all these flip-flops that are spread over a large area? Since the clock frequency is 375 MHz, that only allows for so much routing delay...
I have read about BUFGCE's, but as far as I can tell these would use up an extra global clock net for every "gated" clock. Is this correct? If so, then using BUFGCE's becomes prohibitive real fast because I need more than 1 different clock enable signal.
Ideally the clock enables get generated (by the tool) locally, since there are plenty of spare flip-flops in the various slices. Problem is, how do I specify this in a clean and maintainable way?
I can for example add an extra register to every module. Sortof a "bring your own clock enable signal" thing. But that to me would seem a bit of a kludge, and is not guaranteed to work all the time either...
Soooo, how do you handle a clock enable where the clock enable has to travel to the CE pins of flip-flops that are all over the place on the fpga die?
I have a design that uses clock enables, and for the life of me I cannot get it to work. That is to say, I can get it to work, but not without ugly workarounds.
The situation is pretty simple. I have several modules where the flip-flops only have to clock in the data at every other clock cycle. That is, I use clock enable to relax the timing constraints on these modules. So I have lets say 20 modules spread over a large area of the die, and they use:
- the same clock of 375 MHz.
- the same clock enable signal.
For the clock signal we have low skew global clock nets to distribute the clock. Now as I understand it, in a spartan-6 you don't have dedicated nets to distribute clock enables. So how do you distribute the clock enable to all these flip-flops that are spread over a large area? Since the clock frequency is 375 MHz, that only allows for so much routing delay...
I have read about BUFGCE's, but as far as I can tell these would use up an extra global clock net for every "gated" clock. Is this correct? If so, then using BUFGCE's becomes prohibitive real fast because I need more than 1 different clock enable signal.
Ideally the clock enables get generated (by the tool) locally, since there are plenty of spare flip-flops in the various slices. Problem is, how do I specify this in a clean and maintainable way?
I can for example add an extra register to every module. Sortof a "bring your own clock enable signal" thing. But that to me would seem a bit of a kludge, and is not guaranteed to work all the time either...
Soooo, how do you handle a clock enable where the clock enable has to travel to the CE pins of flip-flops that are all over the place on the fpga die?
Last edited: