www.mikrocontroller.net

Forum: FPGA, VHDL & Co. xilinx cpld vhdl, bad synchronous description


Autor: marcel block (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich bin totaler neuling in diesem bereich und mache gerade meine ersten
gehversuche :)

dieser code hier soll bei einer fallenden flanke an iow einen internen
zähler erhöhen und den wert ausgeben, genau andersrum bei fallender
flanke an ior

aber ich bekomme folgende fehlermeldung die ich nicht ganz verstehe:

>> Signal temp cannot be synthesized, bad synchronous description.

könntet ihr mir da bitte weiterhelfen? :)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity main is
  port ( abus : in std_logic_vector(7 downto 0);
         dbus : in std_logic_vector(7 downto 0);
         ior  : in std_logic;
      iow  : in std_logic;
      m1   : in std_logic;
      count : out std_logic_vector(3 downto 0));
end main;

architecture Behavioral of main is
  signal temp : std_logic_vector(3 downto 0) := "0000";
begin

  process(ior, iow, m1)
  begin
    if(iow = '0' and iow'event) then
   temp <= temp + 1;
    end if;
    if(ior = '0' and ior'event) then
      temp <= temp - 1;
    end if;
  end process;

  count <= temp;

end Behavioral;

gruß -mb-

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du einen Systemtakt oder soll es ein asychrone Schaltung werden?

Autor: marcel block (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
systemtakt? wie meinste das? kann/muss ich dem ding extern nen takt
geben?

sorry für meine unfähigkeit g

gruß

Autor: high_speed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
help_sig <= iow or ior ;


process(ior, iow, m1)
  begin

  if(help_sig = '0' and help_sig'event) then
    if(iow = '0') then
      temp <= temp + 1;
    elseif(ior = '0') then
      temp <= temp - 1;
    end if;
  end if;
end process;

Du darfst in einem Prozess nur eine flankengesteuerte Funktion
verwenden.

Autor: high_speed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es muss naturlich elsif heißen.

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann es takten, man muss aber nicht. Mit asychronen Schaltungen hab
ich nur schlechte Erfahrungen gemacht und probiere sie so weit es geht
zu vermeiden.

Autor: high_speed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat keiner den Fehler gesehen?

help_sig <= iow and ior ;

Autor: marcel block (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nabend,

doch doch :) den fehler hab ich bemerkt... es lässt sich jetzt
"kompilieren" oder wie auch immer man das 'hier' nennen mag :) aber
funktioniern tuts irgendwie nicht... ich werds morgen nochmal versuchen
muss jetzt leider n bissle schlafen (morgen schule)

jörn (oder jemand anders) könntest du mal zwei "typische" beispiele
für asychrone schaltungen und systemtakt-schaltungen posten? dann
versteh ich vielleicht was du meint :)

gruß
-mb-

Autor: high_speed (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich haben das Modell jetzt selber auf einem FPGA (Cyclon) ausgeführt.
Wie du schon geschrieben hast, funktioniert es bei mir auch nicht.
Dafür kenne ich jetzt das Problem. In dem Moment, wo die Flanke erkannt
wird liegt noch kein Low-Pegel an.
Im Anhang habe ich einen lauffähigen Zähler.

Was soll es denn werden?
Einfacher ist es natürlich, wenn du ein Umschaltsignal hast zwischen Up
und Down.

Autor: marcel block (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich arbeite seit einer weile (dezember oder so) an einem eigenen
z80-rechnersystem. ursprünglich war das mal ein "kleines"
schulprojekt... meine 15punkte habe ich abkassiert gebe mich mit dem
ergebnis noch lange nicht zufrieden :)

nun bin ich an einem punkt an dem ich gerne ein "eingabe-system"
hätte. ich dachte mir ich baue mir dazu ein modul (steckkarte) welches
mir die möglichkeit bietet eine ps2 tastatur+maus anzuschließen.
zunächst dachte ich da an eine schaltung komplett auf ttl bausteinen...
da ich aber schon länger mal was mit diesen tollen cpld-teilen machen
will hab ich mir gedacht entwerf ich den tastatur-controller auf einem
solchen baustein... so viel zur geschichte :)

ich habe hier jetzt diesen jtag-programmer von xilinx (der mit den zwei
HC125) zwei XC9536 und einen XC9572 (reichelt) und ...

... fragen: :)
- was ist denn eine macrozelle?
- kann ich im vhdl-code fest zuweißen welche pins meine einzelnen ports
bekommen? und wenn ja, verringert das dann die leistung/kapazität wegen
irgendwelchen komischen umwegen oder so?

ich habe nun mal versucht einen kleinen "test-controller" zu basteln
welchen ich mit meinem z80-system 'verbinden' kann... er hat
8Datenpins, 2Adresspins, IO-Read, IO-Write, M1... wenn ich einen wert
"in" ihn schreibe soll er diesen intern speichern und bei einem
lese-vorgang diesen gespeicherten wert auf den datenbus ausgeben...
ansonsten soll 'sein' datenbus im Z-State sein. Die Adressdecodierung
findet größten teils extern statt und über "abus" sollen vier interne
register beschrieben/gelesen werden können... außerdem fehlt noch ein
CS-Pin :)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity main is
  port ( abus : in std_logic_vector(1 downto 0);
         dbus : inout std_logic_vector(7 downto 0) := "ZZZZZZZZ";
         ior  : in std_logic;
      iow  : in std_logic;
      m1   : in std_logic;
      count : out std_logic_vector(3 downto 0));
end main;

architecture Behavioral of main is
  signal reg : std_logic_vector(7 downto 0) := "00000000";
begin
   
  process(iow)
  begin  
    if(iow = '0' and m1 = '1') then
      reg <= dbus;
    end if;
  end process;

  process(ior)
  begin
    if(ior = '0' and m1 = '1') then
      dbus <= reg;
    elsif(ior = '1' and m1 = '1') then
      dbus <= "ZZZZZZZZ";
    end if;
  end process;

end Behavioral;

wenn ich das für meinen XC9536 synthesize dann steht im fit-bericht das
ich 47% meiner macrozellen (was auch immer das bedeutet) bereits
verwendet habe... und wenn hier bereits die hälfte "verbraucht" ist
glaub ich kaum das ich das umsetzen kann was ich mir so gedacht habe...
kann man den obigen code irgendwie optimieren oder brauch ich da nen
größeren cpld/fpga? wenn ja, wo bekomme ich diese denn her? bei
reichelt gibts nur den XC9536 und den XC9572...

so... g ich hoffe dieser text ist einigermaßen verständlich und hab
hoffentlich nix vergessen

gruß
marcel

Autor: high_speed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein CPLD besitzt eine 2 stufige Logik. Die Eingänge einer Macrozelle
werde UND- verknüpft und dann über eine ODER- Verknüpfung auf den
Ausgang ausgegeben.
In einem solchen CPLD sind dann noch Verbindungsmatrizen zwischen den
IO’s und den Macrozellen. Schau am besten in das Datenblatt, da ist der
genaue Aufbau erklärt.

Dagegen werden in einem FPGA die Logischen Verknüpfungen über Luck up
Tables verwirklicht. (kleine Wahrheitstabellen)

Ein FPGA ist in jedem Fall leistungsstärker als ein CPLD. Man kann
sogar einen ganzen Prozessor in einem FPGA generieren. Den FPGA den ich
hier habe hat 12 000 Logikzellen.
Ein 32 Bit Prozessor (NIOS II) benötigt 2300 Logikzellen. In der Anzahl
sind schon einige Controller für externes RAM und serielle Schnittstelle
enthalten.

MfG
Holger

Autor: marcel block (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und was sind da so die "gängisten" fpga's die man als schüler günstig
und einfach erwerben kann? :)

gruß

Autor: high_speed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Marcel

Bei Reichelt gibt es auch einige FPGA’s von Xilinx. (Spartan und
Spartan II)
Mit diesen FPGA’s habe ich noch nichts gemacht, deswegen kann ich auch
nichts dazu sagen. Was im Reichelt Katalog als Macrocells dabei
angegeben wird, ist die Anzahl der Logikzellen.

Bis jetzt habe ich nur etwas mit einem FPGA von Altera gemacht, den
Cyclon.
Es gibt natürlich noch weitere Hersteller für FPGA’s.

www.xilinx.com, www.altera.com, http://www.latticesemi.com, ....

Bei solchen speziellen Bauteilen gibt es meist das Problem, dass sie
nicht gerade billig sind und dass man sie als Privatperson schwer
beschaffen kann.
Dazu besitzen Diese Bausteine meistens wegen der hohen Pinzahl Gehäuse,
bei denen das Anlöten nicht gerade einfach ist.
z.B. FBGA mit 324 Pins (Lötpunkte unter dem Chip)

Vielleicht ist auch ein kleines FPGA Board mit SRAM / SDRAM , Flach für
einen interne CPU und einem Modellspeicher besser.
Ein FPGA besitzt meist eine SRAM Struktur, so dass man ihm nach dem
Einschalten neu programmieren muss oder es wird ein bestimmter
Konfigurations- Baustein Verwendet.

MfG
Holger

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.