Hallo,
ich habe hier ein kleines Problem, welches ich aktuell noch nicht so
recht lösen kann. Und zwar geht es um einen Transmitter im FPGA, der
serielle Daten mit bis zu 160 MHz auf eine optische Schnittstelle geben
kann. Die 160 MHz werden aus einer externen 40 MHz-Systemclock mit Hilfe
einer PLL erzeugt.
Da der Transmitter-Pfad auch 40 und 80 MHz Datenrate unterstützen soll,
gibt es ein globales Clock-Enable-Signal. Das erzeuge ich mit einem
Zähler:
1 | -- clock enable generation
|
2 | process begin
|
3 | wait until rising_edge(clk160);
|
4 |
|
5 | if reset = '1' then
|
6 | ce_cnt <= 0;
|
7 | ce40 <= '0';
|
8 | ce80 <= '0';
|
9 | else
|
10 | if ce_cnt = 0 then
|
11 | ce40 <= '1';
|
12 | ce80 <= '1';
|
13 | else
|
14 | ce40 <= '0';
|
15 | if ce_cnt = 2 then
|
16 | ce80 <= '1';
|
17 | else
|
18 | ce80 <= '0';
|
19 | end if;
|
20 | end if;
|
21 |
|
22 | if ce_cnt = 3 then
|
23 | ce_cnt <= 0;
|
24 | else
|
25 | ce_cnt <= ce_cnt + 1;
|
26 | end if;
|
27 | end if;
|
28 | end process;
|
Jetzt habe ich jedoch das Problem, dass die 40 MHz Daten möglichst
phasensynchron zur 40 MHz-Clock sein sollen. Wie kann ich es erreichen,
dass die externe 40 MHz-Clock und eine über Enable generierte 40
MHz-Clock diesselbe Phasenlage haben?
Bisher ist mir nicht so viel eingefallen. Eventuell eine Phasendetektion
mittels XOR?
Gruß
Marius