Forum: FPGA, VHDL & Co. VHDL/DCM für Spartan-3E


von jo_weber (Gast)


Lesenswert?

Hallo zusammen,
es ist fast vier Jahren her das ich VHDL programmiert habe.
Deshalb brauche ich dringend Hilfe.
Ich möchte aus einem 66MHz externen Clock 33 MHz erzeugen. Sehr gerne 
würde ich das DCM für Spartan-3E benutzen.
Hat mir jemand vielleicht einen komplettes beispiel?
Herzlichen dank

von Gast (Gast)


Lesenswert?

Schau mal in der ISE unter Langauge Templates, da ist eine komplette 
DCM-Instanziierung dabei. Copy/Paste und schon bist du fertig ;)

von jo_weber (Gast)


Lesenswert?

kann ich das nicht ohne weiteres in meinen vorhandene VHDL file
einfügen?
Bei mir kommt immer ein Error und sagt, dass ich das nicht in den 
bestehenden file einfügen kann.
Gruss,
Jo

von jo_weber (Gast)


Lesenswert?

Es hat doch geklappt.
Nun muss ich alle Eingänge verbinden und deklarieren?
Herzlichen dank

von Jan M. (mueschel)


Lesenswert?

Es reicht, den Clock-Eingang, den Clock-Feedback und die von dir 
benötigten Ausgänge anzuschließen. Im ISE libraries guide, im Datenblatt 
des FPGA und in zahlreichen application notes (suche: xapp dcm) steht 
dazu noch etwas mehr.

von Gast (Gast)


Lesenswert?

So wie Jan schon gesagt hat, reicht es eine Clock und den Feedback 
anzulegen. Dann noch den gewünschten Teiler einstellen und den Ausgang 
davon als Clock für dein weiteres Design verwenden. Die restlichen 
Ausgänge legst Du einfach auf "open"

von jo_weber (Gast)


Lesenswert?

hm,
das funktioniert leider nicht nicht.
ich zeige euch am besten den bsp code.
Zurzeit probiere ich einfach rum, damit ich mehr Übung rein bekomme.
Hoffe das ist euch nicht zu wider, meine code zu lesen.
-----
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.numeric_std.ALL;
library UNISIM;
use UNISIM.Vcomponents.ALL;


---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity test02 is
    Port (led       : out STD_LOGIC_VECTOR (7 downto 0);
    clk       : in  STD_LOGIC;
    SW0       : in  STD_LOGIC;
    SW1       : in  STD_LOGIC;
    SW2       : in  STD_LOGIC;
    SW3       : in  STD_LOGIC);
end test02;


architecture Behavioral of test02 is

  signal sw    : STD_LOGIC_VECTOR (3 downto 0);
  signal CLKIN    : STD_LOGIC;
  signal CLK2X180          : STD_LOGIC;
  signal CLKFB    : STD_LOGIC;
  signal CLKDV    : STD_LOGIC;
  signal CLK0          : STD_LOGIC;
  signal CLK180    : STD_LOGIC;
  signal CLK270    : STD_LOGIC;
  signal CLK2X    : STD_LOGIC;
  signal CLK90    : STD_LOGIC;
  signal PSCLK    : STD_LOGIC;

------------------------------------------------------------------------ 
------------
--
-- declaration of KCPSM3
--
  component kcpsm3
    Port (          reset : in std_logic);
    end component;


begin

sw(0) <= SW0;
sw(1) <= SW1;
sw(2) <= SW2;
sw(3) <= SW3;

CLKIN <= clk;
CLKFB <= CLK2X180;
-----------------------------------------------------------------


   DCM_SP_inst : DCM_SP
   generic map (
      CLKDV_DIVIDE => 2.0, --  Divide by: 
1.5,2.0,2.5,3.0,3.5,4.0,4.5,5.0,5.5,6.0,6.5
                           -- 
7.0,7.5,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0 or 16.0
      CLKFX_DIVIDE => 1,   --  Can be any interger from 1 to 32
      CLKFX_MULTIPLY => 4, --  Can be any integer from 1 to 32
      CLKIN_DIVIDE_BY_2 => FALSE, --  feature
      CLKIN_PERIOD => 0.0, --  Specify period of input clock
      CLKOUT_PHASE_SHIFT => "NONE",
      CLK_FEEDBACK => "1X",
      DLL_FREQUENCY_MODE => "LOW",
      DUTY_CYCLE_CORRECTION => TRUE,
      FACTORY_JF => X"C080",
      PHASE_SHIFT => 0,        255
      STARTUP_WAIT => FALSE)
   port map (
      --CLK0 => "open",     -- 0 degree DCM CLK ouptput
      --CLK180 => "open", -- 180 degree DCM CLK output
      --CLK270 => "open", -- 270 degree DCM CLK output
      --CLK2X => "open",   -- 2X DCM CLK output
      --CLK2X180 => "open", -- 2X, 180 degree DCM CLK out
      --CLK90 => "open",   -- 90 degree DCM CLK output
      CLKDV => CLKDV,   -- Divided DCM CLK out (CLKDV_DIVIDE)
      --CLKFX => "open",   -- DCM CLK synthesis out (M/D)
      --CLKFX180 => "open", -- 180 degree CLK synthesis out
      --LOCKED => LOCKED, -- DCM LOCK status output
      --PSDONE => PSDONE, -- Dynamic phase adjust done output
      --STATUS => STATUS, -- 8-bit DCM status bits output
      CLKFB => CLKFB,   -- DCM clock feedback
      CLKIN => CLKIN   -- Clock input (from IBUFG, BUFG or DCM)
      --PSCLK => PSCLK,   -- Dynamic phase adjust clock input
      --PSEN => PSEN,     -- Dynamic phase adjust enable input
      --PSINCDEC => PSINCDEC, -- Dynamic phase adjust 
increment/decrement
      --RST => RST        -- DCM asynchronous reset input
   );

   -- End of DCM_SP_inst instantiation-

-----------------------------------------------------------------


output_ports: process(clk)
  begin


    if (clk'event and clk ='1') then


      case sw is
        when "0000" => led <= "00000000";
        when "1111" => led <= "10000001";
        when "0001" => led <= "11111111";
        when "0010" => led <= "01010101";
        when "0100" => led <= "11001100";
        when "1000" => led <= "00110011";

        when others =>
        end case;
    end if;


  end process output_ports;

end Behavioral;

von Amania (Gast)


Lesenswert?

warum machst du nicht mit Schematic? es ist übersichlicher und 
einfacher, auch mit DCM

von jo_weber (Gast)


Lesenswert?

Ich hab schon damals(vor 4 Jahren) in VHDL das ganze gemacht.
Deswegen würde ich ganz gerne das ganze wieder in VHDL machen.
Aber danke trotzdem

von Jan M. (mueschel)


Lesenswert?

CLKFB <= CLK2X180;
Wo kommt denn die feedback-clock her?

CLKFB muss mit CLK0 verbunden sein (allenfalls noch CLK2x, aber nicht 
einen der anderen Ausgaenge)

von jo_weber (Gast)


Lesenswert?

Danke Jan, den CLK_FB habe ich korrigiert.
Aber es läuft immer noch nicht. Ich versuche es mit mein TestBanch zum 
laufen zukriegen. Aber vergeblich.
Also, ich habe folgende parameter:
CLK = 20MHz
und das will ich auf 10MHz teilen. So sieht nun der Code aus:
-------------------
------------------------------------------------------------------------ 
--------
-- Copyright (c) 1995-2007 Xilinx, Inc.  All rights reserved.
------------------------------------------------------------------------ 
--------
--   ___  ___
--  /   /\/   /
-- ___  \  /    Vendor: Xilinx
-- \   \   \/     Version : 9.2.04i
--  \   \         Application : xaw2vhdl
--              Filename : DCM.vhd
-- ___   /\     Timestamp : 06/04/2008 08:55:03
-- \   \  /  \
--  \___\/\___\
--
--Command: xaw2vhdl-intstyle D:/VHDLTutorial/LEDMITDOFILE-5/DCM.xaw -st 
DCM.vhd
--Design Name: DCM
--Device: xc3s500e-4fg320
--
-- 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;
          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 CLK0_BUF   : std_logic;
   signal GND_BIT    : std_logic;
begin
   GND_BIT <= '0';
   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);

   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_IN,
                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;

Ich muss doch nur noch folgendes machen:
CLKIN <= CLK;
und
CLKFB <= CLK0;

und wenn ich simuliere, dann muss ich doch am Pin CLKDV 10MHz haben, 
oder?

von Jan M. (mueschel)


Lesenswert?

Zur Sicherheit solltest du noch die richtige Zeit bei CLKIN_PERIOD 
angeben.

Wie hast du die Simulation getestet? Ich weiss gerade nicht genau, wie 
die Simulation der DCM aussieht, aber in Wirklichkeit braucht sie bis 
ein ordentlicher Takt am Ausgang anliegt eine ganze Weile.
Wie lange liegt der Reset an? Die DCM braucht ein relativ langes Signal 
hier.

von jo_weber (Gast)


Lesenswert?

Hallo Jan,
die Simulation war nicht richtig.
Jetzt habe ich das ganze in den FPGA geladen und es funktioniert.
Herzlichen dank an alle.

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.