Forum: FPGA, VHDL & Co. DCM in ModelSim Simulieren


von Gast (Gast)


Lesenswert?

Hallo,
will unbedindt mal das DCM in ModelSim Simulieren.
Hat jemand damit erfahrung oder kann mir jemand das Fertige 
ModelSim-File
geben?
Danke

von Christian R. (supachris)


Lesenswert?

Benutze den DCM doch einfach in einem Design deiner Wahl und simuliere 
es. Die Library dafür ist ja in den Xilinx libs drin. Ich hab fast immer 
einen DCM drin, klappt bestens in der Simulation. (Modelsim XE)

von Gast (Gast)


Lesenswert?

Danke Christian.
Kann ich das Code hier nehmen und dan Simulieren:

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;

entity DCMA is
   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;
          LOCKED_OUT      : out   std_logic);
end DCMA;

architecture BEHAVIORAL of DCMA is
   signal CLKFB_IN        : std_logic;
   signal CLKFX_BUF       : std_logic;
   signal CLKIN_IBUFG     : std_logic;
   signal CLK0_BUF        : std_logic;
   signal GND_BIT         : std_logic;
begin
   GND_BIT <= '0';
   CLKIN_IBUFG_OUT <= CLKIN_IBUFG;
   CLK0_OUT <= CLKFB_IN;
   CLKFX_BUFG_INST : BUFG
      port map (I=>CLKFX_BUF,
                O=>CLKFX_OUT);

   CLKIN_IBUFG_INST : IBUFG
      port map (I=>CLKIN_IN,
                O=>CLKIN_IBUFG);

   CLK0_BUFG_INST : BUFG
      port map (I=>CLK0_BUF,
                O=>CLKFB_IN);

   DCM_SP_INST : DCM_SP
   generic map( CLK_FEEDBACK => "1X",
            CLKDV_DIVIDE => 2.0,
            CLKFX_DIVIDE => 2,
            CLKFX_MULTIPLY => 2,
            CLKIN_DIVIDE_BY_2 => FALSE,
            CLKIN_PERIOD => 30.303,
            CLKOUT_PHASE_SHIFT => "FIXED",
            DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS",
            DFS_FREQUENCY_MODE => "LOW",
            DLL_FREQUENCY_MODE => "LOW",
            DUTY_CYCLE_CORRECTION => FALSE,
            FACTORY_JF => x"C080",
            PHASE_SHIFT => 0,
            STARTUP_WAIT => FALSE)
      port map (CLKFB=>CLKFB_IN,
                CLKIN=>CLKIN_IBUFG,
                DSSEN=>GND_BIT,
                PSCLK=>GND_BIT,
                PSEN=>GND_BIT,
                PSINCDEC=>GND_BIT,
                RST=>RST_IN,
                CLKDV=>open,
                CLKFX=>CLKFX_BUF,
                CLKFX180=>open,
                CLK0=>CLK0_BUF,
                CLK2X=>open,
                CLK2X180=>open,
                CLK90=>open,
                CLK180=>open,
                CLK270=>open,
                LOCKED=>LOCKED_OUT,
                PSDONE=>open,
                STATUS=>open);

end BEHAVIORAL;

von Gast (Gast)


Lesenswert?

Hallo Christian,
das habe ich jetzt gefunden.
nun versuche ich den DCM zu simulieren.
Ich gebe in Bench-File nur den Clock und den RST für min 3 Perioden vor.

          CLKIN_IN        : in    std_logic;
          RST_IN          : in    std_logic;

Eigentlich müsste ich doch am CLKDV_OUT was sehen, oder?

Anbei das Code+Testbench nochmal:

------------------------------------------------------------------------ 
--------
-- Copyright (c) 1995-2007 Xilinx, Inc.  All rights reserved.
------------------------------------------------------------------------ 
--------
--   ___  ___
--  /   /\/   /
-- ___  \  /    Vendor: Xilinx
-- \   \   \/     Version : 9.2.04i
--  \   \         Application : xaw2vhdl
--              Filename : DCM.vhd
-- ___   /\     Timestamp : 06/03/2008 11:27:26
-- \   \  /  \
--  \___\/\___\
--
--Command: xaw2vhdl-intstyle D:/VHDLTutorial/test03/DCM.xaw -st DCM.vhd
--Design Name: DCM
--Device: xc3s250e-4pq208
--
-- Module DCM
-- Generated by Xilinx Architecture Wizard
-- Written for synthesis tool: XST
-- Period Jitter (unit interval) for block DCM_SP_INST = 0.03 UI
-- Period Jitter (Peak-to-Peak) for block DCM_SP_INST = 0.93 ns

library ieee;
use ieee.std_logic_1164.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;

entity DCM is
   port ( CLKIN_IN        : in    std_logic;
          RST_IN          : in    std_logic;
          CLKDV_OUT       : out   std_logic;
          CLKFX_OUT       : out   std_logic;
          CLKIN_IBUFG_OUT : out   std_logic;
          CLK0_OUT        : out   std_logic;
          LOCKED_OUT      : out   std_logic);
end DCM;

architecture BEHAVIORAL of DCM is
   signal CLKDV_BUF       : std_logic;
   signal CLKFB_IN        : std_logic;
   signal CLKFX_BUF       : std_logic;
   signal CLKIN_IBUFG     : std_logic;
   signal CLK0_BUF        : std_logic;
   signal GND_BIT         : std_logic;
begin
   GND_BIT <= '0';
   CLKIN_IBUFG_OUT <= CLKIN_IBUFG;
   CLK0_OUT <= CLKFB_IN;
   CLKDV_BUFG_INST : BUFG
      port map (I=>CLKDV_BUF,
                O=>CLKDV_OUT);

   CLKFX_BUFG_INST : BUFG
      port map (I=>CLKFX_BUF,
                O=>CLKFX_OUT);

   CLKIN_IBUFG_INST : IBUFG
      port map (I=>CLKIN_IN,
                O=>CLKIN_IBUFG);

   CLK0_BUFG_INST : BUFG
      port map (I=>CLK0_BUF,
                O=>CLKFB_IN);

   DCM_SP_INST : DCM_SP
   generic map( CLK_FEEDBACK => "1X",
            CLKDV_DIVIDE => 2.0,
            CLKFX_DIVIDE => 4,
            CLKFX_MULTIPLY => 2,
            CLKIN_DIVIDE_BY_2 => FALSE,
            CLKIN_PERIOD => 15.152,
            CLKOUT_PHASE_SHIFT => "NONE",
            DESKEW_ADJUST => "SYSTEM_SYNCHRONOUS",
            DFS_FREQUENCY_MODE => "LOW",
            DLL_FREQUENCY_MODE => "LOW",
            DUTY_CYCLE_CORRECTION => TRUE,
            FACTORY_JF => x"C080",
            PHASE_SHIFT => 0,
            STARTUP_WAIT => FALSE)
      port map (CLKFB=>CLKFB_IN,
                CLKIN=>CLKIN_IBUFG,
                DSSEN=>GND_BIT,
                PSCLK=>GND_BIT,
                PSEN=>GND_BIT,
                PSINCDEC=>GND_BIT,
                RST=>RST_IN,
                CLKDV=>CLKDV_BUF,
                CLKFX=>CLKFX_BUF,
                CLKFX180=>open,
                CLK0=>CLK0_BUF,
                CLK2X=>open,
                CLK2X180=>open,
                CLK90=>open,
                CLK180=>open,
                CLK270=>open,
                LOCKED=>LOCKED_OUT,
                PSDONE=>open,
                STATUS=>open);

end BEHAVIORAL;

Test-File:

vsim work.dcm
add wave CLK0_BUF
add wave CLKIN_IN
add wave RST_IN
force RST_IN 1
run 400
force RST_IN 0
force CLKIN_IN 0 0, 1 50 -repeat 100
run 1000

von A. F. (chefdesigner)


Lesenswert?

Schon mal probiert, jitter damit zu simulieren?

von Gast (Gast)


Lesenswert?

Das hört sich sicher interessant an.
Probiere ich sofort, wenn ich das einfache DCM zum laufen bringe.

von Klaus F. (kfalser)


Lesenswert?

Soviel ich weiss, muß man beim Simulieren der DCM die zeitliche 
Auflösung des Simulators auf fs (femtosekunde) stellen.
Jedenfalls habe ich immer eine solche Warnung bekommen.
Außerdem solltest Du dir angewöhnen eine richtige Testbench zu 
schreiben. Force-Befehle ersetzen keine Testbench.

von Christian R. (supachris)


Lesenswert?

1ps reicht. Aber je nach FPGA gibts da immer mal Bugs in den Modellen. 
Ich hab hier z.B. den DCM im Spartan 3e, in der Simulation geht das LOCK 
nie auf High, obwohl alles stabil ist. In der Wirklichkeit schon. Ist 
ein Bug in der 9.2.0.4 irgendwo stand, dass das ab SP2 von 10.1 behoben 
ist. Ich hab aber das 10.1 immer noch nicht drauf.

von Duke Scarring (Gast)


Lesenswert?

Christian R. schrieb:
> DCM im Spartan 3e, in der Simulation geht das LOCK
> nie auf High, obwohl alles stabil ist

Kurzes Update: Scheint in der 12.2 immer noch ein Problem zu sein :-(

Duke

von Duke Scarring (Gast)


Lesenswert?

Update Nummer 2: Geht doch. Ich hatte den Reset der DCM fix auf '0' 
gelegt. Das geht in der Praxis, aber nicht in der Simulation. Siehe auch 
hier:

http://forums.xilinx.com/t5/Simulation-and-Verification/DCMs-not-locking-in-ISE10-1-03i-ModelSim6-3c/td-p/30105

Duke

von Michael (Gast)


Lesenswert?

Ist es wirklich nötig, die Buffer, so wie oben angegeben, manuell zu 
instanziieren?  Macht das die Synthese nicht selber?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.