Forum: FPGA, VHDL & Co. Registerspeicher


von Violat (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Alle zusammen!
Mein Ziel ist es ein Registerspeicher mit 32 Registern und einer 
Adresszuweisung über einen Decoder zuschreiben. Die Ausgabe soll über 2 
Multiplexer laufen. Mit dem Register und dem Decoder hatte ich keine 
Probleme, allerdings erhalte ich verschieden Fehlermeldungen, mit denen 
ich nichts anfangen kann:

60  if (DEC_OUT(0)='1') then
61  if (REG_WRITE='1') then
62  reg1:entity work.reg(behaviour)
63  port map(D=>D_IN,CLK=>CLK1, RST=>RST,EN=>CLK,Q=>D_OUT)
64  end if;
65  end if;

** Error: C:\Dokumente und Einstellungen\regf.vhd(63): near "end": 
expecting ';'

278      if (DEC_OUT(31)='1') then
279  if (REG_WRITE='1') then
280  reg32:entity work.reg(behaviour)
281  port map(D=>D_IN,CLK=>CLK32, RST=>RST,EN=>CLK,Q=>D_OUT)
282    end if;
283  end if;
284
285  end process p1;

** Error: C:\Dokumente und Einstellungen\regf.vhd(284): near "process": 
expecting IF

und noch weitere Fehlermeldungen, die wahrscheinlich auf diesen Fehlern 
aufbauen. Es wäre super, wenn mir jemand erklären könnte, was das 
Problem ist.
MFG vio

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Violat schrieb:
> ** Error: C:\Dokumente und Einstellungen\regf.vhd(63): near "end":
> expecting ';'

Du musst die Fehlermeldung nur richtig bis zum Ende lesen

Tom

von Violat (Gast)


Lesenswert?

Ja, schon klar. Er erwarten in der Nähe von "end" ein Semikolon, aber 
wenn ich eins setze, wird der ganze Ausdruck zum Illegal sequential 
Statement. Mir ist unklar, wo der Fehler sein soll. Die Zuweisung und 
die Syntax müsste so doch eigentlich korrekt sein.

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


Lesenswert?

Violat schrieb:
> Die Zuweisung und die Syntax müsste so doch eigentlich korrekt sein.
Nein. Du kannst nicht die Port Map dynamisch umschalten.
Oder irgendwelche Komponenten dynamisch instatiieren...
> Es wäre super, wenn mir jemand erklären könnte, was das Problem ist.
Was willst du erreichen?
Multiplexer werden anders beschrieben...

Diese Sensitivliste ist in 2 Richtungen sehr extrem verdächtig:
1
p1:process(DEC_OUT,CLK,ADR_W,D_IN,RST,CLK1,CLK2,CLK3,CLK4,CLK5,CLK6,CLK7,CLK8,CLK9,CLK10,CLK11,CLK12,CLK13,CLK14,CLK15,CLK16,CLK17,CLK18,CLK19,CLK20,CLK21,CLK22,CLK23,CLK24,CLK25,CLK26,CLK27,CLK28,CLK29,CLK30,CLK31,CLK32)
2
  begin
Ich habe noch nie eine sooooooooooo lange Senstivliste gebraucht.
Das deutet auf irgendwas Umständliches hin.

Und vor allem: ich habe noch NIEMALS NICHT 32 TAKTE gebraucht!!!!!!!
(Da kann man gar nicht genug Ausrufezeichen machen!!!!!)
An diesem Design MUSS was faul sein.

Was sind das für Takte?
So wird auf jeden Fall kein Takt beschrieben:
CLK1 <= DEC_OUT(0) and REG_WRITE;
Das ist eigentlich ein stinknormales Clock-Enable. Ein Takt wird nicht 
aus Kombinatorik gewonnen. Was, wenn da mal ein Glitch auftritt?


Und jetzt zu dem hier:
1
    P1 : process(CLK,EN,D,RST)  --- überbestimmte Sensitivliste: D ist unnötig, und EN eigentlich auch...
2
    begin
3
      if (CLK'event and CLK = '1' and EN ='1') then -- ungewöhnliche Beschreibung eines Clock-Enables
4
        Q <= D;
5
      end if;
6
      if (RST = '1') then
7
        Q <= (others => '0');
8
      end if;
9
    end process;
Machs so wie der Rest der Welt:
1
    P1 : process(CLK,RST) 
2
    begin
3
      if (RST = '1') then
4
        Q <= (others => '0');
5
      elsif (CLK'event and CLK = '1') 
6
        if and EN ='1'  then 
7
          Q <= D;
8
        end if;
9
      end if;
10
    end process;

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.