Forum: FPGA, VHDL & Co. VHDL code to infere DCM


von Martin (Gast)


Lesenswert?

Gestern in einem englischen Forum gelesen, dass es auch möglich
sein soll auf DCM Wizard zu verzichten und DCM aus dem Code inferieren
zu lassen. Es war der Verweis auf lib.pdf, in welchem ich auch
nachgeschaut habe. Fand dort allerdings nichts. lib.pdf ist 2008 datiert
und ist leicht mit google zu finden: library xilinx

Now I am looking for the vhdl code pattern which would let xst
to infere DCM. Does someone of you guys know how do it?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Eat this  ;-)

Top-level module:
1
:
2
:
3
   component xilinx_dcm
4
      Port ( clkin  : in  STD_LOGIC;
5
             reset  : in  STD_LOGIC;
6
             clkout : out  STD_LOGIC
7
      );
8
   end component;
9
:
10
:
11
   CLOCK_x7 : xilinx_dcm
12
   port map ( clkin  => lvdsclkin,
13
              reset  => resetdcm,
14
              clkout => CLK
15
   );
16
:

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Inferieren bedeutet ja, dass man einen allgemeinen VHDL-Befehl schreibt, 
der auf verschiedener Hardware verschieden umgesetzt werden könnte, und 
das Synthese Tool erkennt das und inferiert dann eben ein Element der 
jeweiligen Zielhardware (so wie ein if CLK='1' and CLK'event ein FF 
inferiert, obwohl das nicht direkt daraus hervorgeht).
Die Library jedoch ist eine Sammlung von Macros und Primitives, die 
direkt verschiedene Elemente der Hardware repräsentieren - LUT's, FF's, 
IOB's, BRAM's, und eben auch DCM's (beim Spartan heißt es DCM_SP). Diese 
primitives kann man in VHDL-Code verwenden, das ist aber dann 
hardwareabhängig und nennt sich Instantiation. So kann man ohne 
DCM-Wizard direkt in VHDL-Code DCM's verwenden - aber es ist halt nicht 
inferieren.
Der Hinweis auf eine Library im Zusammenhang mit Inferieren ist also 
widersprüchlich.
Diese Library wird automatisch verwendet, wenn du mit der ISE ein 
Projekt für einen bestimmten FPGA anlegst, du kannst die Primitives 
sofort im VHDL-Code verwenden.
Im ISE Manual Index 
(http://www.xilinx.com/itp/xilinx10/books/manuals.pdf) befinden sich 
Links zu den Anleitungen der Libraries der einzelnen FPGA-Typen (dort 
heißen sie Libraries Guide).

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Das implizite Inferieren eines DCM war mir so abwegig, dass ich nicht 
mal auf die Idee kam, es könnte damit nicht Instantiieren gemeint sein.
 :-o

Es stimmt natürlich:
Abhängig von der Beschreibung kann die Synthese z.B. selbständig aus 
einer generischen Beschreibung eines getakteten RAMS ein Block-RAM 
inferieren. Der Code bleibt portabel.

Ich kann das Bauteil aber auch von Hand instantiieren und verdrahten. 
Dieser Code kann nur für Xilinx-FPGAs verwendet werden.

Beides läuft aber auf reiner VHDL-Beschreibung ohne irgendwelche 
Wizzards ab.

EDIT:
> Links zu den Anleitungen der Libraries der einzelnen FPGA-Typen
Erwähnenswert hierbei auch die Datei xst.pdf, wo beschrieben ist, was 
die Xilinx-Synthese selber erkennen kann und was daraus gemacht wird.
Bzw. im Umkehrschluss, wie eine Beschreibung aussehen muß, dass ein 
bestimmtes Bauteil daraus synthetisiert wird.

von Amel E. (imilia)


Lesenswert?

hallo,
ich habe ein problem ,kann jemand von euch mir helfen?
ich habe ein programm geschrieben und habe ein problem dass die 
simulation nicht ganz fonktioniert wie ich das vorgestellt habe.
ich will 256 bits in einem speicher als 8 mal 32 bits speichern dafür 
habe ich einen Zähler verwendet. der zähler zählt von 0 bis 7 und jedes 
mal sollen 32 bits zu einem speicher(fsl_M_Data) geschickt werden dh 8 
mal sollen 32 bits gespeichert. wenn jede paket bzw 32bits zum speicher 
(FSL_M_Data) angekomen sind ,soll das code FSL_M_Full='1' eingesetzt 
wird das soll nach jeder paket passieren .aber FSL_M_FULL wird auf 1 
eingesetzt nur nach erster pakete. mein programm sieht so aus:
states : process (

current_state,
CRPT_Clk,

CRPT_result_rdy
)
variable l: integer := 0;

Begin
CASE current_state IS
WHEN Adapter =>

 m <= CRPT_result;
 crpt_next_result<='1';

WHEN MP_Ubergabe =>


FSL_M_Full<='0'  ;

FSL_M_Data<=m(((32*L)+0) to ((32*L)+31));
--(da werden die pakete dh jede 32 bits  zum FSL_M_data geschickt)

L:= L + 1;  --das ist der Zähler

--hier habe ich FSL_M_Data mit dem wert erster 32 bits eingesetzt
if (FSL_M_data="00000000000000000000000000000001")then
 FSL_M_Full<='1';

 was soll ich machen  wenn FSL_M_full ='1' ist wenn jedes mal FSL_M_Data 
32bits bekommt? dh FSL_M_Full='1'wenn fSL_M_Data sich wechselt ?
danke schön.

von Duke Scarring (Gast)


Lesenswert?

@Amel Elh (imilia):

Bitte mach mit Deiner Frage ein neues Thema auf. Außerdem ist komplette 
Quelltext (inklusive einer Testbench!) viel eher zur Fehlersuche 
geeignet, als irgendwelche Codeschnipsel.

Duke

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.