Segnali sfasati di 90° fase e quadratura in VHDL per FPGA
In questo articolo andremo a vedere come realizzare in VHDL 4 differenti segnali sfasati di 90° ciascuno o, in altri termini, posti rispettivamente in fase ed in quadratura partendo da un segnale di clock comune. Il codice VHDL realizzato è sia simulabile che sintetizzabile da qualsiasi tool di sintesi e fitting per FPGA.
In alcune particolari applicazioni è necessario realizzare un segnale in fase ed uno in quadratura partendo da un segnale di clock comune. Questo può essere necessario, ad esempio, all’interno di DSP oppure per realizzare campionamenti molto “estremi” oltre il classico DDR (Dual Data Rate) utilizzato nelle memorie DDR.
Realizzare questi 4 segnali è molto semplice ed istruttivo ed è realizzabile usando 2 Flip-Flop di tipo D (FFD) ed una porta logica NOT. In VHDL questa applicazione può essere descritta con l’utilizzo di 2 processi a descrivere i due FFD ed una manciata di porte NOT.
Schematicamente l’applicazione è implementabile in questo modo:

Segnali in Fase ed in Quadratura
dove CLK è il segnale di clock a frequenza f mentre ogni uscita è sfasata di 90° ed ha una frequenza pari a f/2. Notare come il secondo FF sia identico al primo a meno della porta NOT che inverte il segnale di clock in ingresso.
Questo semplice circuito digitale può essere descritto in VHDL dal seguente codice che non penso abbia necessità di molti commenti.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
-- -- Project: PhaseQuadrature Example -- -- Description: Simple four signals generator -- with 90grad phase shift. -- Created for ACEInnova website -- blog article. -- -- -- Date: 18-03-2023 -- Author: A. Carpini -- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY PhaseQuadrature IS PORT( clock_i : IN STD_ULOGIC; reset_i : IN STD_ULOGIC; sigOne_o : OUT STD_ULOGIC; sigTwo_o : OUT STD_ULOGIC; sigThree_o : OUT STD_ULOGIC; sigFour_o : OUT STD_ULOGIC ); END ENTITY PhaseQuadrature; ARCHITECTURE Behaviour OF PhaseQuadrature IS SIGNAL netOne_s : STD_ULOGIC; SIGNAL netTwo_s : STD_ULOGIC; SIGNAL nClock_s : STD_ULOGIC; BEGIN sigOne_o <= netOne_s; sigThree_o <= NOT(netOne_s); FFOneProcess : PROCESS(clock_i, reset_i) BEGIN IF(reset_i = '1') THEN netOne_s <= '0'; ELSIF(RISING_EDGE(clock_i)) THEN netOne_s <= NOT netOne_s; END IF; END PROCESS; nClock_s <= NOT(clock_i); sigFour_o <= netTwo_s; sigTwo_o <= NOT(netTwo_s); FFTwoProcess : PROCESS(nClock_s, reset_i) BEGIN IF(reset_i = '1') THEN netTwo_s <= '0'; ELSIF(RISING_EDGE(nClock_s)) THEN netTwo_s <= NOT netTwo_s; END IF; END PROCESS; END ARCHITECTURE Behaviour; |
Il codice è stato simulato tramite QuestaSim e nel seguito lo screenshot della simulazione dove sono ben visibili le 4 forme d’onda sfasate ed il clock globale.

Fase Quadratura Simulazione
Il codice non è solo simulabile ma anche sintetizzabile su qualsiasi FPGA di qualsiasi costruttore, Intel, Xilinx, Microsemi, Lattice, ecc. Quindi…buona sintesi e buon divertimento.
Saluti ed alla prossima!!!