xilinx cpld vhdl, bad synchronous description

Gast #202805
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-
Gast #202808
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.
Gast #202812
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-
Gast #202813
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.
Angehängte Dateien:
Gast #202814
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
Gast #202815
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
Gast #202817
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren