Datum:
Hallo! Wenn sich mal jemand wundern sollte, warum in der Simulation aus dem DCM_CLKGEN (nicht DCM_SP, nicht DCM_ADV) nix rauskommt, dann liegt es möglicherweise daran, das der Eingang FREEZEDCM unbeschaltet ist. Im Simulationsmodell wird er zwar intern auf 'L' gezogen, aber das geht bei der Abfrage des Wertes schief (DCM_CLKGEN.vhd 1.23 2011/06/23, Zeile 400, ISE 13.3). Außerdem besitzt der DCM_CLKGEN einen internen Oszillator. Wenn die Simulation automatisch aufhören soll, muß man den Oszillator anhalten (RST = '1'). Meine (nun simulativ funktionierende) Instanziierung sieht so aus:
-- pragma translate_off
dcm_reset <= simulation_stop;
-- pragma translate_on
...
-- use DCM_CLKGEN instead DCM_SP, because enhanced mul/div range
dcm_clkgen_i0: dcm_clkgen
generic map (
clkfx_divide => 125,
clkfx_multiply => 88,
clkin_period => 8.0
)
port map (
rst => dcm_reset,
freezedcm => '0', -- force '0' for working simulation
clkin => clk_125,
clkfx => dcm_clkgen_i0_clkfx
);
|
Duke
Datum:
Hm, komisch, ich arbeite gerade mit dem S6 und nutze einen ähnlichen Clock-GEN-Konstrukt. Bisher keine Probleme. Werde das mal nachvollziehen. Wie treibst Du simulationstechnisch deinen Oszillator?
Datum:
J. S. schrieb: > Wie treibst Du simulationstechnisch deinen Oszillator? Mit meiner Standardmethode:
signal simulation_run : boolean := true;
-- 27 MHz, oscillator socket
constant tb_user_clock_period : time := (1 sec / 27_000_000);
signal tb_user_clock : std_logic := '0';
begin
tb_user_clock <= not tb_user_clock after tb_user_clock_period / 2 when simulation_run;
process
begin
wait <...>;
simulation_run <= false;
report "Simlation ended." severity note;
wait;
end process;
|
Duke