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


von marcel block (Gast)


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? :)
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
entity main is
7
  port ( abus : in std_logic_vector(7 downto 0);
8
         dbus : in std_logic_vector(7 downto 0);
9
         ior  : in std_logic;
10
      iow  : in std_logic;
11
      m1   : in std_logic;
12
      count : out std_logic_vector(3 downto 0));
13
end main;
14
15
architecture Behavioral of main is
16
  signal temp : std_logic_vector(3 downto 0) := "0000";
17
begin
18
19
  process(ior, iow, m1)
20
  begin
21
    if(iow = '0' and iow'event) then
22
   temp <= temp + 1;
23
    end if;
24
    if(ior = '0' and ior'event) then
25
      temp <= temp - 1;
26
    end if;
27
  end process;
28
29
  count <= temp;
30
31
end Behavioral;

gruß -mb-

von Jörn (Gast)


Lesenswert?

Hast du einen Systemtakt oder soll es ein asychrone Schaltung werden?

von marcel block (Gast)


Lesenswert?

systemtakt? wie meinste das? kann/muss ich dem ding extern nen takt
geben?

sorry für meine unfähigkeit g

gruß

von high_speed (Gast)


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.

von high_speed (Gast)


Lesenswert?

Es muss naturlich elsif heißen.

von Jörn (Gast)


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.

von high_speed (Gast)


Lesenswert?

Hat keiner den Fehler gesehen?

help_sig <= iow and ior ;

von marcel block (Gast)


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-

von high_speed (Gast)


Angehängte Dateien:

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.

von marcel block (Gast)


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 :)
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
entity main is
7
  port ( abus : in std_logic_vector(1 downto 0);
8
         dbus : inout std_logic_vector(7 downto 0) := "ZZZZZZZZ";
9
         ior  : in std_logic;
10
      iow  : in std_logic;
11
      m1   : in std_logic;
12
      count : out std_logic_vector(3 downto 0));
13
end main;
14
15
architecture Behavioral of main is
16
  signal reg : std_logic_vector(7 downto 0) := "00000000";
17
begin
18
   
19
  process(iow)
20
  begin  
21
    if(iow = '0' and m1 = '1') then
22
      reg <= dbus;
23
    end if;
24
  end process;
25
26
  process(ior)
27
  begin
28
    if(ior = '0' and m1 = '1') then
29
      dbus <= reg;
30
    elsif(ior = '1' and m1 = '1') then
31
      dbus <= "ZZZZZZZZ";
32
    end if;
33
  end process;
34
35
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

von high_speed (Gast)


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

von marcel block (Gast)


Lesenswert?

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

gruß

von high_speed (Gast)


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

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.