www.mikrocontroller.net

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


Autor: jo_weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

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

Autor: jo_weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jo_weber (Gast)
Datum:

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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: jo_weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Amania (Gast)
Datum:

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

Autor: jo_weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: jo_weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: jo_weber (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.