Forum: FPGA, VHDL & Co. Aufbau eines VHDL-Projekts


von Kim33 (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgendes Problem:
Ich habe in VHDL mit ISE 11.1 mehrere, voneinander unabhängige Projekte 
beschrieben, wie z.B. einfacher Counter, Sinusgenerator,...
Nun möchte ich auf meinem Spartan 3E die Switch-Schalter nutzen, um 
zwischen diesen Projekten umherzuschalten und jeweils einen anderen 
Ausgang auszugeben.
Meine Frage ist sehr prinzipieller Natur: Wie kann ich so ein Projekt in 
ISE aufbauen. Ich stelle mir dabei ein Top-Model vor und viele 
Untermodelle, auf die das Top-Model zugreifen kann.
Doch wie kann ich Models für das Top-Model sichtbar machen? Oder muss 
ich dazu Packages benutzen?

Ich hoffe es kann mir jemand helfen, und bin für jede Hilfe offen.

Gruß

von jaja (Gast)


Lesenswert?

Was du brauchst ist component und portmap

von Kim33 (Gast)


Lesenswert?

Vielen Dank schon mal für die Antwort. Jetzt kann ich mir schon ein 
bisschen besser vorstellen, wie ich das Projekt aufzubauen habe. Jedoch 
habe ich noch Probleme mit der Syntax.
Mein main-Code sieht bis jetzt so aus:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
7
---- Uncomment the following library declaration if instantiating
8
---- any Xilinx primitives in this code.
9
--library UNISIM;
10
--use UNISIM.VComponents.all;
11
12
entity main is
13
    Port ( CLK : in  STD_LOGIC;
14
        SW0 : in  STD_LOGIC;
15
           SW1 : in  STD_LOGIC;
16
           SW2 : in  STD_LOGIC;
17
           SW3 : in  STD_LOGIC;
18
           WAVE_OUT : out  STD_LOGIC_VECTOR (7 downto 0));
19
20
end entity main;
21
22
architecture Behavioral of main is
23
24
component Zaehler is
25
    Port ( clk   : in  STD_LOGIC;    
26
           counter_out : out  STD_LOGIC_VECTOR (7 downto 0));
27
end component Zaehler;
28
29
component generator is
30
  Port (   CLK   : in  STD_LOGIC;
31
        YOUT  : out STD_LOGIC_VECTOR(7 downto 0));
32
end component generator;
33
34
for all: Zaehler use entity WORK.Zaehler(Behavioral);
35
for all: generator use entity WORK.generator(Behavioral);
36
37
begin
38
  process(CLK)
39
  begin
40
  if SW0 = '1' then
41
  Zaehler1: zaehler 
42
  port map(CLK => CLK, counter_out => WAVE_OUT);
43
  
44
  else then
45
  PRBS: generator
46
  port map(CLK => CLK, YOUT => WAVE_OUT);
47
48
  end if;
49
end process;
50
end Behavioral;

Dabei liegt das Problem in der If-Anweisung, denke ich. Ich bekomme den 
Fehler:
ERROR:HDLParsers:808 - Line 59. = can not have such operands in this 
context.
ERROR:HDLParsers:164 - Line 61. parse error, unexpected PORT, expecting 
OPENPAR or TICK or LSQBRACK

Wie kann ich diesen Fehler verhindern, und auf die jeweilige Stellung 
der Switche ein anderes Signal auf den Ausgang geben?

Grüße
Kim

von Christian R. (supachris)


Lesenswert?

So geht das nicht. Alles, was du instanziierst, muss zur Kompile-Zeit 
feststehen. Wenn du das umschalten willst, musst du alle Module parallel 
in den FPGA implementieren und nur den Ausgang mit einem Multiplexer 
umschalten.

von D. I. (Gast)


Lesenswert?

so macht man das nicht, port maps macht man nicht in einem process.

Du könntest es so machen:

Alles instantiieren, und dann die Ausgaenge deiner Module auf den output 
multiplexen

von D. I. (Gast)


Lesenswert?

zwei doofe ein gedanke

von Kim33 (Gast)


Lesenswert?

Alles klar. Vielen Dank für die Tipps. Ich werde es so versuchen!

Grüße
Kim

von Christian R. (supachris)


Lesenswert?

Ansonsten wenn´s zur Synthese-Zeit bekannt ist, ähnlich wie #ifdef unter 
C kann man das mit "generate" machen. Aber das geht nicht mit deinen 
Schaltern.

von Kim33 (Gast)


Lesenswert?

Danke schön, das funktioniert soweit. Das main-Modul wird so zwar etwas 
größer als ich mir das so vorgestellt hatte, aber seinen Zweck erfüllt 
es ;-).

Grüße

von Matthias G. (mgottke)


Lesenswert?

Alternativ könnte man auch Multi-Boot-System erstellen. Daher: Man 
erstellt mehrere Designs die alle im Config-PROM abgelegt werden. Man 
kann dann, über den FPGA gesteuert, das jeweilige Design laden. Das ist 
aber definitiv nichts für Anfänger.

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.