Maciej
G.
Projektant /
Programista, Famor
S.A.
Temat: ElbertV2 - problem z zegarem z IPCore - PLL
Witam,ponieważ potrzebowałem szybszego zegara niż znajduje się na płytce Elbert V2 (12 MHz) - zewnętrzny generator kwarcowy postanowiłem użyć IPCore (ISE Webpack 14.7) "Single DCM_SP" dla Spartan 3A. Patrz obrazek:
http://www.dropbox.com/s/5jjenuc71ui5xbs/IPCore_PLL.pn...
Oczywiście wcześniej utworzyłem nowy projekt w ISE Webpack.
Gdy otworzyły się okna do ustawiania parametrów IP Core, wybrałem następujące opcje (patrz obrazki):
https://www.dropbox.com/s/23zw9f09mxh083f/ClockWiz1.png...
https://www.dropbox.com/s/fsmrrfa2emigyyt/ClockWiz2_.pn...
Środkowy ekran z parametrami (opcje buforów) zostawiłem domyślnie. Częstotliwość wyjściową pętli PLL ustawiłem na 16 MHz.
Gdy IP Core się wygenerował wszedłem na wygenerowany template VHDL dla pętli pll i wkleiłem kod do projektu:
https://www.dropbox.com/s/j4qiodxwu8sjfur/ISE_PLL_Proj....
Oto główny plik projektu (projekt.vhd):
library IEEE;
library UNISIM;
use IEEE.STD_LOGIC_1164.ALL;
use UNISIM.VComponents.all;
entity projekt is
Port ( clk : in STD_LOGIC;
rst : in STD_LOGIC;
clkSynth : inout STD_LOGIC;
clkout : out STD_LOGIC);
end projekt;
architecture Behavioral of projekt is
COMPONENT pll
PORT(
CLKIN_IN : IN std_logic;
RST_IN : IN std_logic;
CLKFX_OUT : OUT std_logic;
CLKIN_IBUFG_OUT : OUT std_logic;
CLK0_OUT : OUT std_logic;
CLK0_OUT1 : OUT std_logic
);
END COMPONENT;
component divider is
Port ( clk : in STD_LOGIC;
clk_out : inout STD_LOGIC := '0');--clk_out 1MHZ
end component;
signal clkBuf : STD_LOGIC;
signal clkPLL : STD_LOGIC;
signal clkO1 : STD_LOGIC;
begin
zegar : pll PORT MAP(
CLKIN_IN => clk,
RST_IN => rst,
CLKFX_OUT => clkPLL,
CLKIN_IBUFG_OUT => clkBuf,
CLK0_OUT => clkout,
CLK0_OUT1 => clkO1
);
dzielnik : divider port map (clkPLL, clkSynth); --2MHz clock out
end Behavioral;
Tutaj kod dzielnika częstotliwości(divider.vhd):
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
entity divider is
generic (
NBit : natural := 25;
Div : natural := 16_000_000
);
Port ( clk : in STD_LOGIC;
clk_out : inout STD_LOGIC := '0');
end divider;
architecture divider_arch of divider is
signal cnt: std_logic_vector(Nbit -1 downto 0) := (others=>'0');
begin
process(clk)
begin
if (clk'event and clk='1') then
if cnt < Div then
cnt <= cnt+1;
else
cnt <= (others=>'0');
clk_out <= not clk_out;
end if;
end if;
end process; end divider_arch;
A tutaj plik ucf dla projektu:
NET "clk" LOC = "P129" | PERIOD = 12MHz;
NET "rst" LOC = "P80" | PULLUP;
NET "clkSynth" LOC = "P46"; //LED
NET "clkout" LOC = "P11";
Tutaj zamieszczam cały kod projektu "ISE Webpack":
https://www.dropbox.com/s/dk6ywxybuo2tvns/PLL1.zip?dl=0
Problem polega na tym, że nie mogę obejrzeć na oscyloskopie, czy analizatorze stanów logicznych (ten drugi pasmo do 100MHz) wygenerowanego z pętli PLL zegara (dzieliłem go także na dzielniku częstotliwości przez różne wartości) widzę tylko bardzo cienki "szpilki co jakiś czas. Dałem też zegar z pętli PLL na dzielnik, a po nim na rejestr przesuwny z wyjściami na 8 LED (bez pętli PLL ten projekt działa poprawnie).
Zmieniałem piny wyjściowe w Elbercie, kombinowałem z różnymi parametrami dla generacji IP Core - wszystko bez żadnego rezultatu.
Macie może jakieś pomysły co robię nie tak ?
Na "Maximatorze" z "Max10" Altery IP core z pętlą PLL działa (chociaż przebiegi są mocno odkształcone). Siedzę nad tym problemem już drugi dzień i powoli kończą mi się pomysły.
PozdrawiamTen post został edytowany przez Autora dnia 28.12.17 o godzinie 11:28