Forum: FPGA, VHDL & Co. CPLD Xilinx Projekt


von Siegfried S. (dieleena)


Lesenswert?

hallo,
Habe einige Zeile Code geschrieben. Diese ist nur ein Ausschnitt. Ist 
dies so richtig?
Funktion:  ein interner 8bit-Zähler(externer Takt), ein Latch und ein 
8bit-Vergleicher. Das Latch puffert die Daten von "DB". Es sollen die im 
Latch gepufferte Werte mit dem Zähler verglichen werden, ob das Ergebnis 
größer ist. Entsprechend soll "EndV1" 0 oder 1 sein. Muß ich für "EndV1" 
auch einen Zwischenspeicher anlegen?
Noch eine grundlegende Frage. Beim erstellen eines Projekt die 
Signale(Pin) in der Tabelle sofort erstellen oder dies erst später?


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.Numeric_std.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity T3 is
    Port (   clk : in  STD_LOGIC;
    rst : in  STD_LOGIC;
    ALE1  : in     STD_LOGIC;
    DB     : in     STD_LOGIC_VECTOR (7 downto 0);
    EndV1   : out    STD_LOGIC);
end T3;

architecture Behavioral of T3 is

begin

process(clk, rst, ALE1)
variable FahrCount   : STD_LOGIC_VECTOR(7 downto 0):="00000000";
variable FahrBuffer1   : STD_LOGIC_VECTOR(7 downto 0):="00000000";
begin
         if rst = '1' then
    FahrCount   := "00000000";
--    FahrBuffer1  := "00000000";
    EndV1     <= '0';
  elsif rising_edge(clk) then
    FahrCount := std_logic_vector( unsigned(FahrCount) + 1);
  end if;
--
  if (ALE1'event and ALE1 ='0') then
    FahrBuffer1(7 downto 0) := DB(7 downto 0);
  end if;
--
  if (FahrBuffer1 > FahrCount) then
    EndV1 <= '1';
  else
    EndV1 <= '0';
  end if;
end process;

end Behavioral;

Nachtrag: wenn ich "FahrBuffer1  := "00000000";" bei einem Reset auch 
löschen möchte, bekomme ich die Fehlermeldung.
ERROR:Xst:827 - "E:/Xilinix Sourcecode/Test3/T3.vhd" line 41: Signal 
FahrBuffer1 cannot be synthesized, bad synchronous description.


gruß Siegfried

von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>process(clk, rst, ALE1)
>variable FahrCount   : STD_LOGIC_VECTOR(7 downto 0):="00000000";
>variable FahrBuffer1   : STD_LOGIC_VECTOR(7 downto 0):="00000000";
>begin

Als Anfänger sollte man die Finger von Variablen lassen. Das ist in VHDL 
ein wenig tricky. Nimm normale Signale.

>         if rst = '1' then
>    FahrCount   := "00000000";
>--    FahrBuffer1  := "00000000";
>    EndV1     <= '0';
>  elsif rising_edge(clk) then
>    FahrCount := std_logic_vector( unsigned(FahrCount) + 1);

Da reicht ein einfaches

FahrCount <= + 1;

(wenn Fahrcount ein Signal ist). Btw. Schönes Denglisch ;-)

>  end if;
>--
>  if (ALE1'event and ALE1 ='0') then
>    FahrBuffer1(7 downto 0) := DB(7 downto 0);
>  end if;

Das lassen wir mal besser. In einem Prozess gibt es nur ein 
flankensensitives Signal. Also ab damit in einen zweiten Prozess.

>--
>  if (FahrBuffer1 > FahrCount) then
>    EndV1 <= '1';
>  else
>    EndV1 <= '0';
>  end if;
>end process;

Das sollte ebenfalls in den Prozess mit clk, da du dir sonst Glitches 
auf das Ausgangssignal holen könntest.

>Nachtrag: wenn ich "FahrBuffer1  := "00000000";" bei einem Reset auch
>löschen möchte, bekomme ich die Fehlermeldung.
>ERROR:Xst:827 - "E:/Xilinix Sourcecode/Test3/T3.vhd" line 41: Signal
>FahrBuffer1 cannot be synthesized, bad synchronous description.

Ja, siehe oben. Mach zwei Prozesse draus.

MFG
Falk

von Siegfried S. (dieleena)


Lesenswert?

hallo,
habe es jetzt so gemacht, Ergebnis ist warscheinlich nicht korrekt. Es 
wird nur eine Macrocelle verwendet und in Pin-Liste existiert nur 
"EndV1"

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.Numeric_std.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity T3 is
    Port (clk   : in    STD_LOGIC;
  rst   : in    STD_LOGIC;
  ALE1  : in     STD_LOGIC;
  DB     : in     STD_LOGIC_VECTOR (7 downto 0);
  EndV1  : out    STD_LOGIC);
end T3;

architecture Behavioral of T3 is

signal FahrZaehler   : std_logic_vector(7 downto 0);
signal FahrSpeicher1 : std_logic_vector(7 downto 0);

begin

process(clk, rst)

begin
  if rst = '1' then
      FahrZaehler <= "00000000";
      FahrSpeicher1 <= "00000000";
  elsif rising_edge(clk) then
      FahrZaehler <= FahrZaehler + 1;
  end if;
end process;

process(ALE1)
begin
  if (ALE1'event and ALE1 ='0') then
      FahrSpeicher1(7 downto 0) <= DB(7 downto 0);
  end if;
end process;

process(clk, rst)
begin
  if rst = '1' then
      EndV1 <= '0';
  else
      if rising_edge(clk) then
    if (FahrSpeicher1 > FahrZaehler) then
          EndV1 <= '1';
    else
        EndV1 <= '0';
    end if;
      end if;
  end if;
end process;

end Behavioral;

von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>habe es jetzt so gemacht, Ergebnis ist warscheinlich nicht korrekt. Es

Korrekt, es ist nicht korrekt ;-)

>process(clk, rst)
>begin
>  if rst = '1' then
>      FahrZaehler <= "00000000";
>      FahrSpeicher1 <= "00000000";

Wenn dein FahrSpeicher1 in diesem Prozes nicht geschrieben wird, gehört 
es auch nicht hier rein.

>  elsif rising_edge(clk) then
>      FahrZaehler <= FahrZaehler + 1;
>  end if;
>end process;

>process(ALE1)
>begin
>  if (ALE1'event and ALE1 ='0') then

Das muss hier rein, mir deiner Reset-Bedingung von oben.
Da müsst der Compiler eigentlich meckern.

>      FahrSpeicher1(7 downto 0) <= DB(7 downto 0);
>  end if;
>end process;

MfG
Falk

von Siegfried S. (dieleena)


Lesenswert?

Hallo, guten morgen

hoffe das ich es richtig gemacht habe. Habe ein zweites Latch 
hinzugefügt.
Zu den Macrocells. Wenn ich den Fitter Report richtig verstanden habe, 
benötige ich je FF(Intern/Extern) eine Macrocell. Bei diesen Zeilen 
benötige ich 28 Macrozells und für jedes weiteres Latsch nochmals 10 
Macrocells. Besteht eine Möglichkeit, Macrocells einzusparen? In einem 
anderem Thread wurde mir mitgeteilt, das ich für ein Lasch(74273) eine 
Macrocelle benötige. Für mein Projekt hatte ich den XC9572 PLCC84 
gewählt, da dieser genügend Pin bereitstellt. Nun muß ich alles neu 
überarbeiten, und den Chip-Tye neu ermittel.
Kann ich die Anweisung der Latch nicht verkürzen, indem ich alle "rst" 
Anweisungen untereinander schreibe, und nach else die n Latch "takt" 
bzw. Ergebnis mit dem Zähler vergleiche?

entity T3 is
    Port (clk   : in    STD_LOGIC;
  rst   : in    STD_LOGIC;
  ALE1  : in     STD_LOGIC;
  ALE2  : in     STD_LOGIC;
  DB     : in     STD_LOGIC_VECTOR (7 downto 0);
  EndV1  : out    STD_LOGIC;
  EndV2  : out    STD_LOGIC);
end T3;

architecture Behavioral of T3 is

signal FahrZaehler  : std_logic_vector(7 downto 0);
signal FahrSpeicher1  : std_logic_vector(7 downto 0);
signal FahrSpeicher2  : std_logic_vector(7 downto 0);

begin

process(clk, rst)

begin
  if rst = '1' then
    FahrZaehler <= "00000000";
  elsif rising_edge(clk) then
    FahrZaehler <= FahrZaehler + 1;
  end if;
end process;

process(clk, rst, ALE1)
begin
  if rst = '1' then
    EndV1 <= '0';
    FahrSpeicher1 <= "00000000";
  else
--
    if (ALE1'event and ALE1 ='0') then
      FahrSpeicher1(7 downto 0) <= DB(7 downto 0);
    end if;
--
    if rising_edge(clk) then
      if (FahrSpeicher1 > FahrZaehler) then
        EndV1 <= '1';
      else
        EndV1 <= '0';
      end if;
    end if;
  end if;
end process;

process(clk, rst, ALE2)
begin
  if rst = '1' then
    EndV2 <= '0';
    FahrSpeicher2 <= "00000000";
  else
--
    if (ALE2'event and ALE2 ='0') then
      FahrSpeicher2(7 downto 0) <= DB(7 downto 0);
    end if;
--
    if rising_edge(clk) then
      if (FahrSpeicher2 > FahrZaehler) then
        EndV2 <= '1';
      else
        EndV2 <= '0';
      end if;
    end if;
  end if;
end process;

end Behavioral;

Gruß Siegfried

von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>hoffe das ich es richtig gemacht habe. Habe ein zweites Latch
>hinzugefügt.

Du hast es verschlimmbessert.

NUR EIN FLANKENSENSITIVES SIGNAL PRO PROZESS!!!

Durch deine Schreibweise kann man keine Macrozellen sparen.

>Zu den Macrocells. Wenn ich den Fitter Report richtig verstanden habe,
>benötige ich je FF(Intern/Extern) eine Macrocell. Bei diesen Zeilen

Ja, pro FF braucht man eine Macrozelle. Was meinst du mit 
(intern/extern)?

>benötige ich 28 Macrozells und für jedes weiteres Latsch nochmals 10
>Macrocells. Besteht eine Möglichkeit, Macrocells einzusparen? In einem
>anderem Thread wurde mir mitgeteilt, das ich für ein Lasch(74273) eine
>Macrocelle benötige. Für mein Projekt hatte ich den XC9572 PLCC84

Ein 273er hat 8 Bit, also brauchst du 8 Macrozellen.
Es ist doch recht klar. Du hast

1x 8Bit Zähler                  :  8 Macrozellen
2x 8Bit Latch                   : 16 Maxcrozellen
2x 8 BIt VergleicherVergleicher :  2 Macrozellen
-------------------------------------------------------
                                  26 Macrozellen

Wo die beiden anderen verbraten werden weiss ich jetzt nicht. Müsste man 
die Reports anschauen.

>Kann ich die Anweisung der Latch nicht verkürzen, indem ich alle "rst"
>Anweisungen untereinander schreibe, und nach else die n Latch "takt"
>bzw. Ergebnis mit dem Zähler vergleiche?

Nein!

MfG
Falk

von Siegfried S. (dieleena)


Angehängte Dateien:

Lesenswert?

Hallo,
habe ein neues Projekt erstellt, die Signale angelegt, und den Code neu 
geschrieben. Bin gespannt, weches Ergebnis herauskommt.
Bekomme immer noch 28 Macrozellen. Habe anbei die *.rpt Datei.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.Numeric_std.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity VhdlEndTest is
    Port ( DATA     : in  STD_LOGIC_VECTOR (7 downto 0);
           clk     : in  STD_LOGIC;
           rst     : in  STD_LOGIC;
           clkLatch1 : in  STD_LOGIC;
           clkLatch2  : in  STD_LOGIC;
           EndV1     : out  STD_LOGIC;
           EndV2     : out  STD_LOGIC);
end VhdlEndTest;

architecture Behavioral of VhdlEndTest is

signal FahrZaehler  : std_logic_vector(7 downto 0);
signal FahrSpeicher1  : std_logic_vector(7 downto 0);
signal FahrSpeicher2  : std_logic_vector(7 downto 0);

begin

process(clk, rst)
begin
  IF rst = '1' then
    FahrZaehler <= "00000000";
  ELSIF rising_edge(clk) THEN
    FahrZaehler <= FahrZaehler + 1;
  END IF;
end process;


process(rst, clkLatch1)
begin
  IF rst = '1' THEN
    FahrSpeicher1 <= "00000000";
    EndV1 <= '0';
  ELSIF rising_edge(clkLatch1) THEN
    FahrSpeicher1 <= DATA;
      IF FahrSpeicher1 > FahrZaehler THEN
        EndV1 <= '1';
      ELSE
        EndV1 <= '0';
      END IF;
  END IF;
end process;


process(rst, clkLatch2)
begin
  IF rst = '1' THEN
    FahrSpeicher2 <= "00000000";
    EndV2 <= '0';
  ELSIF rising_edge(clkLatch2) THEN
    FahrSpeicher2 <= DATA;
      IF FahrSpeicher2 > FahrZaehler THEN
        EndV2 <= '1';
      ELSE
        EndV2 <= '0';
      END IF;
  END IF;
end process;

end Behavioral;

Gruß Siegfried

von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>habe ein neues Projekt erstellt, die Signale angelegt, und den Code neu
>geschrieben. Bin gespannt, weches Ergebnis herauskommt.

Nicht das von dir gewünschte. Du bist wirklich ein Künstler, du 
probierst dutzende von Kombinationen durch und hangelst dich immer 
wieder an der richtigen Lösung vorbei.

>Bekomme immer noch 28 Macrozellen. Habe anbei die *.rpt Datei.

Ja, wie es scheint braucht man für einen 8 Bit Vergleicher 2 
Macrozellen.
Dann passt die Rechnung.

Ich schreibs mal ins Reine.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.Numeric_std.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity VhdlEndTest is
    Port ( DATA     : in  STD_LOGIC_VECTOR (7 downto 0);
           clk     : in  STD_LOGIC;
           rst     : in  STD_LOGIC;
           clkLatch1 : in  STD_LOGIC;
           clkLatch2  : in  STD_LOGIC;
           EndV1     : out  STD_LOGIC;
           EndV2     : out  STD_LOGIC);
end VhdlEndTest;

architecture Behavioral of VhdlEndTest is

signal FahrZaehler  : std_logic_vector(7 downto 0);
signal FahrSpeicher1  : std_logic_vector(7 downto 0);
signal FahrSpeicher2  : std_logic_vector(7 downto 0);

begin

-- Deine PWMs, sind doch vom CLK abhängig, nicht von den 
Speicherpulsen!!!

process(clk, rst)
begin
  IF rst = '1' then
    FahrZaehler <= "00000000";
  ELSIF rising_edge(clk) THEN
    FahrZaehler <= FahrZaehler + 1;

    IF FahrSpeicher1 > FahrZaehler THEN
      EndV1 <= '1';
    ELSE
      EndV1 <= '0';
    END IF;

    IF FahrSpeicher2 > FahrZaehler THEN
      EndV2 <= '1';
    ELSE
      EndV2 <= '0';
    END IF;

  END IF;
end process;

process(rst, clkLatch1)
begin
  IF rst = '1' THEN
    FahrSpeicher1 <= "00000000";
    EndV1 <= '0';
  ELSIF rising_edge(clkLatch1) THEN
    FahrSpeicher1 <= DATA;
  END IF;
end process;

process(rst, clkLatch2)
begin
  IF rst = '1' THEN
    FahrSpeicher2 <= "00000000";
    EndV2 <= '0';
  ELSIF rising_edge(clkLatch2) THEN
    FahrSpeicher2 <= DATA;
  END IF;
end process;

end Behavioral;

MfG
Falk

von Siegfried S. (dieleena)


Lesenswert?

Hallo @Falk
Erst mal für die ausführliche Hilfe vielen Dank.
Ich bin bei CPLD noch ein Anfänger. Für mich ist es noch schwierig, aus 
den vorhandenen Duko's der Schreibweise der Profi-Programmierer 
anzuschließen. Habe am Anfang doch mit beiden Händen gegen VHDL gewährt.
Einen klitzekleinen Erfolg habe ich doch schon, da ich mich mit VHDL 
beschäftige. Ich hoffe, das diese Arbeit auch zum Erfolg führt.
Gruß Siegfried

von Falk (Gast)


Lesenswert?

Huch, ich merke gerade, dass da noch ein Lapsus drin ist. Die Resets für 
EndV1 und EndV2 müssen natürlich in den ersten Prozess.

MfG
Falk

von Siegfried S. (dieleena)


Lesenswert?

hallo @ Falk
du bist schneller.
habe einen Nachtrag. Code erzeugen zwei gleiche Fehler.
ERROR:Xst:528 - Multi-source in Unit <VhdlEndTest> on signal <EndV1>
ERROR:Xst:528 - Multi-source in Unit <VhdlEndTest> on signal <EndV2>
wenn ich in folgende Zeilen
    IF FahrSpeicher1 > FahrZaehler THEN
      EndV1 <= '1';
    ELSE
      EndV1 <= '0';
    END IF;
    IF FahrSpeicher2 > FahrZaehler THEN
      EndV2 <= '1';
    ELSE
      EndV2 <= '0';
    END IF;
EndV1 und EndV2 ausklammern, ist kein Fehler weg, aber es werden in der 
Pinliste nur noch EndV1 und EndV2 aufgelistet. Müsste sogar richtig 
sein, da die Speicher / der Zähler keine Funktion ausführt. EndV1 und 
EndV2 hängen in der Luft.
Gruß Siegfried


von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>EndV1 und EndV2 ausklammern, ist kein Fehler weg, aber es werden in der
>Pinliste nur noch EndV1 und EndV2 aufgelistet. Müsste sogar richtig
>sein, da die Speicher / der Zähler keine Funktion ausführt. EndV1 und

Die Speicher und der Zähler haben schon eine Funktion. Aber wenn du 
EndV1 und EndV2 KOMPLETT ausklammerst, klar, dann sind sie funktionslos 
und der Compiler schmeisst sie raus.

MfG
Falk

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
habe beide Reset in den ersten Prozess verschoben, und es funktioniert.
Jetzt habe ich eine kleine Grundlage, um weiter zu arbeiten.
Die EndVx müssen mit mehreren Verrieglungen verbunden werden. Wenn dann 
dieses "Modul" besteht, habe ich auch die benötigten Macrocells. Danach 
kann ich den Chip aussuchen, und unter umstände muß ich dies auch in 
mehrere verteilen.
Habe da eine Verständnisfrage zu " Prozess ". Gehen wir davon aus, das 
beide Prozess den gleichen Takt haben. -> Werden beide Prozess 
gleichzeitig verarbeitet oder einer nach dem anderem? Diese Frage 
bezieht sich auch auf RESET. Ich meine nicht die Gatterlaufzeit, die ist 
ja immmer vorhanden.
Gruß Siegfried

von Klaus F. (kfalser)


Lesenswert?

Prozesse werden nicht abgearbeitet.
Prozesse werden vom Compiler in FlipFlops umgesetzt, und diese Flip 
Flops arbeiten parallel (Hängen ja am gleichen Takt).

von Siegfried S. (dieleena)


Lesenswert?

hallo,
bin dabei, die logische Verknüpfungen für die Verrieglung zu schreiben.

habe mir ein Schematic Projekt angesehen.

hier ein Auszug davon.

   attribute BOX_TYPE   : string ;
   signal XLXN_22  : std_logic;
   signal XLXN_24  : std_logic;
   signal XLXN_25  : std_logic;
   signal XLXN_30  : std_logic;
   signal XLXN_44  : std_logic;
   component AND2
      port ( I0 : in    std_logic;
             I1 : in    std_logic;
             O  : out   std_logic);
   end component;
   attribute BOX_TYPE of AND2 : component is "BLACK_BOX";

   component AND3
      port ( I0 : in    std_logic;
             I1 : in    std_logic;
             I2 : in    std_logic;
             O  : out   std_logic);
   end component;
   attribute BOX_TYPE of AND3 : component is "BLACK_BOX";

   component INV
      port ( I : in    std_logic;
             O : out   std_logic);
   end component;
   attribute BOX_TYPE of INV : component is "BLACK_BOX";

   component OR2
      port ( I0 : in    std_logic;
             I1 : in    std_logic;
             O  : out   std_logic);
   end component;
   attribute BOX_TYPE of OR2 : component is "BLACK_BOX";

begin
   XLXI_1 : AND2
      port map (I0=>com,
                I1=>EA,
                O=>XLXN_24);

   XLXI_2 : AND3
      port map (I0=>Licht,
                I1=>CLK10KHz,
                I2=>XLXN_22,
                O=>XLXN_25);

......

Verständnisfrage, muß ich die erzeugung der Componente pro Type nur 
einmal zu machen, egal wieviele AND2 .. OR2 in meinem Projekt vorkommen 
?
nach begin weiße ich der Componente die ensprechende Signale zu.
die Signale müssen dann fortlaufen nummeriert werden. Muß ich diese 
Bezeichnung "XLXN_1 bis XLXN_.." einhalten, oder kann ich auch frei 
bezeichnen "Fahr_10100 bis Fahr_10...  Ich möchte zu übersicht das 
machen, da im kompletten Projekt mehrere "Module" zum Schluß existieren.

Gruß Siegfried

von Klaus F. (kfalser)


Lesenswert?

Diese Primitiv-Komponenten brauchst Du gar nicht, weil das in VHDL schon 
enthalten ist.
Extra ine Komponente dafür zu verwenden ist viel zu umständlich, man 
verwendet besser einen Operator.

z.B. Oder-Verknüpfung :

Ergebnis_signal <= SigA or SigB;

Klaus

von Siegfried S. (dieleena)


Lesenswert?

hallo, guten morgen

bekomme bei foldender Gleichung diese Fehler
Out1 <= (((COMP_0101 AND FahrLogic1(0)) or ((NOT COMP_0101) and In4 and 
Clk10KHz)) and Sbg01 and In8);

ERROR:HDLParsers:808 - "E:/XilinixSourcecode/VdhlEnd/VhdlEndTest.vhd" 
Line 154. AND can not have such operands in this context.

"FahrLogic1(0)" ist ein 8bit interner Speicher

gruß Siegfried

von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>bekomme bei foldender Gleichung diese Fehler
>Out1 <= (((COMP_0101 AND FahrLogic1(0)) or ((NOT COMP_0101) and In4 and
>Clk10KHz)) and Sbg01 and In8);

Sieht gut aus, aber ohne vollständigen Code nicht eindeutig.

MFG
Falk

von Siegfried S. (dieleena)


Lesenswert?

hallo,

signal FahrLogic01    : std_logic_vector(7 downto 0);

das Problem mit dem Fehler bekomme ich bei "FahrLogic1(0)". wenn ich 
"FahrLogic1(0)" von einem Input Pin ableite, ist alles in Ordnung.


hat dies etwas mit "std_logic_vector"  -> VECTOR <- zu tun ?

Gruß Siegfried

von Roger S. (edge)


Lesenswert?

lass deine signal beschreibung mal auf dich wirken.
Richte deine Konzentration zwischen c und 1 des Signalnamens.

> hat dies etwas mit "std_logic_vector"  -> VECTOR <- zu tun ?

Konsistente Namensgebung.

Cheers, Roger

von Siegfried S. (dieleena)


Lesenswert?

hallo,
Fehler ist jetzt weg. Hier mein komplettes Projekt
Wurde dies gene mal simulieren. Komme aber mit ModelSim noch nicht klar.

vsim work.vhdlendtest
# vsim work.vhdlendtest
# Licensing checkout error with feature xe-starter. (Error code -9.)
# The hostid of the license does not match the hostid for this machine.
# One of the following is likely:
#    -The license is intended for another machine.
#    -A dongle is not plugged into this machine.
#    -The dongle driver is not installed or is not functioning properly.
#    -The hostid mechanism has been changed or removed from this 
machine.
# ** Error: Failure to obtain a VHDL simulation license.
# Error loading design

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.Numeric_std.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity VhdlEndTest is
    Port ( DATA      : in  STD_LOGIC_VECTOR (7 downto 0);
           clk       : in  STD_LOGIC;
           rst       : in  STD_LOGIC;
           clkLatch1 : in  STD_LOGIC;
           clkLatch2 : in  STD_LOGIC;
           Clk10KHz  : in  STD_LOGIC;
           Sbg01      : in  STD_LOGIC;

           EndV01    : out  STD_LOGIC;
           EndR01    : out  STD_LOGIC);
end VhdlEndTest;

architecture Behavioral of VhdlEndTest is

   attribute BOX_TYPE   : string ;
--
  signal FahrZaehler    : std_logic_vector(7 downto 0);
  signal FahrSpeicher01 : std_logic_vector(7 downto 0);
--  FahrLogic...(0) = E/A
--  FahrLogic...(1) = V/R
--  FahrLogic...(2) = Licht
  signal FahrLogic01    : std_logic_vector(7 downto 0);
  signal COMP_01   : std_logic;
  signal FAHR_01V  : std_logic;
  signal FAHR_01R  : std_logic;
--
begin

FAHR_01V <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and 
FahrLogic01(2) and Clk10KHz)) and Sbg01 and FahrLogic01(1));
FAHR_01R <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and 
FahrLogic01(2) and Clk10KHz)) and Sbg01 and (NOT FahrLogic01(1)));

process(clk, rst)
begin
  IF rst = '1' and Sbg01 = '0' then
    EndV01 <= '0';
    EndR01 <= '0';
  END IF;
  IF rst = '1' then
    FahrZaehler <= "00000000";
  ELSIF rising_edge(clk) THEN
    FahrZaehler <= FahrZaehler + 1;
    IF FahrSpeicher01 > FahrZaehler THEN
      COMP_01 <= '1';
    EndV01 <= FAHR_01V;
    EndR01 <= FAHR_01R;
    ELSE
      COMP_01 <= '0';
    EndV01 <= FAHR_01V;
    EndR01 <= FAHR_01R;
    END IF;
  END IF;
end process;

process(rst, clkLatch1)
begin
  IF rst = '1' and Sbg01 = '0' THEN
    FahrSpeicher01 <= "00000000";
  ELSIF rising_edge(clkLatch1) THEN
    FahrSpeicher01 <= DATA;
  END IF;
end process;

process(rst, clkLatch2)
begin
  IF rst = '1' and Sbg01 = '0' THEN
    FahrLogic01 <= "00000000";
  ELSIF rising_edge(clkLatch2) THEN
    FahrLogic01 <= DATA;
  END IF;
end process;

end Behavioral;

gruß Siegfried

von modelsim (Gast)


Lesenswert?

ModelSim Licensing Wizard starten.

von Siegfried S. (dieleena)


Lesenswert?

hallo,
habe ich, und die *.dat "eingebunden".
Gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

hallo,
wie muß ich vorgehen, wenn ich über die
"DATA : inout  STD_LOGIC_VECTOR (7 downto 0);"
"WR : in  STD_LOGIC;"
Daten nach aussen senden will?
ich habe 7 FF, dessen Zustand an den Datenbus, gesendet werden soll.
Gruß Siegfried

von Lothar (Gast)


Lesenswert?

@Siegfried:
ein tolles Buch zum Thema ist z.B.

J. Reichardt, B. Schwarz; "VHDL-Synthese, Entwurf digitaler Schaltungen 
und Systeme"; Oldenburg Verlag; ISBN 3-486-25809-5

Sehr realitätsnah und synthesetauglich geschrieben.
Damit hab' ich die Theorie dann auch kapiert.
Und von da aus zur realen Schaltung ist's nur ein kleiner Schritt.

Gruß
Lothar

von Dirk (Gast)


Lesenswert?

Stimmt.Das Buch ist sehr gut.

Grüße

Dirk

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
habe folgendes gemacht.

WR         : in     STD_LOGIC;
IoSel      : in     STD_LOGIC;
Sbg01      : in     STD_LOGIC;
--
signal ADRDEC_0WR  : std_logic;
--
begin
--
ADRDEC_0WR <= (ADR(0) and ADR(1) and ADR(2) AND IoSel AND (NOT WR));
--
process(clk)
begin
  IF rst = '1' then
    SBG_01 <= '0';
  ELSIF rising_edge(clk) THEN
    SBG_01 <= Sbg01;
  END IF;
end process;
--
process(ADRDEC_0WR)
begin
  IF (ADRDEC_0WR = '0') then
    SBG_01 <= 'Z';
  ELSE
    DATA(0) <= SBG_01;
  END IF;
end process;
--

möchte folgendes erreichen. Sbg01 ist ein Inputsignal. dieses wird 
Taktabhänig in SBG_01 gespeichert. Wenn die externe Hardware auf den 
Chip zugreift, möchte ich über DATA(0) den Zustand von SBG_01 abfragen. 
Auch wenn die externe Hardware nicht auf den Chip zugreift, muß 
taktabhänig die Information von Sbg01 in SBG_01 gespeichert werden.
Habe ich dies richtig gemacht?
Gruß Siegfried


von Klaus Falser (Gast)


Lesenswert?

Nein.
Mir ist Deinen Beschreibung nicht ganz klar, aber 2 Punkte stimmen 
sicher nicht.
- Das Signal SBG_01 wird in 2 verschiedenen Prozessen zugewiesen. Das 
ist (für die Synthese) nicht erlaubt.
- Nur einem Signal, das nach außen an einen Pin geht, kann man 'Z' 
(hochohmig) zuweisen. Das Signal muß dann von der Richtung inout oder 
out sein.
Warum wird 'Z' an SBG_01 zugewiesen, wenn ADRDEC_0WR='0' ist?

Klaus

von Siegfried S. (dieleena)


Lesenswert?

hallo, guten Abend
habe in allen mir vorliegende Duko gesucht. habe ein "Flip-Flop With 
Negative-Edge Clock And Asynchronous Reset".

process (C, CLR)
begin
if (CLR = '1')then
Q <= '0';
elsif (C'event and C='0')then
Q <= D;
end if;
end process;

ich hoffe das ich dies richtig beschreibe. Wenn "CLR" 1 (HIGHT) wird, 
nimmt, wird der Ausgang Q aud 0 (Low) gesetzt.
Ich benötige aber für das FF 3 "RESET" Eingänge. Jeder Reset Eingang 
soll das FF löschen. Das FF azeptiert aber an seinen Asynchronous Reset 
nur eine AND Verknüpfung. Wie kann ich diese Bedinungen erfüllen.

hallo @Dirk, @Lothar
Das Buch giebt es nicht mehr im Internet-Buchhandlung. Werde weiter 
versuchen, dieses aufzutreiben. Hoffe das ich dieses noch bekomme.

hallo @Klaus
Bei meiner Duko ist nicht zu ersehen, das ich das Ausgangs-Signal nur in 
einem Prozess benutzen darf. Deine Info ist sehr gut. Auch mit Tristate 
werde ich mich auseinandersetzen.
Werde nochmals mein Projekt mit Ruhe angehen.

Gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

hallo,
wann benutzt man std_logic bzw. std_ulogic ?
Gruß Siegfried

von Dirk (Gast)


Lesenswert?

Im April soll es eine neue Auflage von dem Buch geben.
Ich hatte meines erst Weihnachten bei Amazon bestellt.

Gruß
Dirk

von Siegfried S. (dieleena)


Lesenswert?

Hallo @Dirk
Werde mich beim ansässigem Buchhandlung informieren.
Gruß Siegfried

von Klaus Falser (Gast)


Lesenswert?

Wegen dem Reset mit 3 Eingängen :
Du brauchst nur ein Signal definieren, das aus den 3 Signalen 
ODER-verknüpft wird. Das verwendest Du als CLR Signal.

std_logic vs. std_ulogic :
Beitrag "anfänger-frage"
Am besten für den Anfang immer std_logic verwenden.


von Siegfried S. (dieleena)


Lesenswert?

hallo,
habe "std_ulogic" aus meinen Internet-Unterlagen. Wird sehr oft benutzt.
habe es so gelößt. Jetzt setzt er ein Oder vor die Reset. So soll es 
auch sein.

--    FF Fahrstufe Ansteuerung Links / Rechts
process(rst, clk, Sbg01, EndR_01, EndL_01)
begin
  IF rst         = '1' then
    EndL01 <= '0';
    EndR01 <= '0';
  ELSIF Sbg01    = '1' THEN
    EndL01 <= '0';
    EndR01 <= '0';
  ELSIF rising_edge(clk) THEN
    EndL01 <= EndL_01;
    EndR01 <= EndR_01;
  END IF;
end process;


--    8-Bit Speicher Geschwindigkeit
process(clk, rst, Sbg01, ADR_11)
begin
  IF rst      = '1' THEN
    FahrSpeicher01 <= "00000000";
  ELSIF Sbg01 = '1' THEN
    FahrSpeicher01 <= "00000000";
  ELSIF rising_edge(clk) THEN
    if (ADR_11 = '1') then
      FahrSpeicher01 <= DATA;
    END IF;
  END IF;
end process;


Gruß Siegfried

von Klaus Falser (Gast)


Lesenswert?

So sollte man es aber nicht machen.
Es ist zwar möglich, daß der Compiler es akzeptiert, und 
intelligenterweise die RESET-Signale richtig berechent.
Ein FF in Hardware hat aber nur einen RESET und/oder SET-Eingang.

Ein Compiler muß also nur folgende Form akzeptieren, dies ist auch 
genormt :

if reset = '0'/'1' then
   signal <= ...
elsif rising_edge(Clk) then
   ....
end if;

Die richtige Schreibweise ist deshalb :

FahrReset <= Rst or Sgb01;
--    FF Fahrstufe Ansteuerung Links / Rechts
process(FahrReset, clk)
begin
  IF FahrReset = '1' then
    EndL01 <= '0';
    EndR01 <= '0';
  ELSIF rising_edge(clk) THEN
    EndL01 <= EndL_01;
    EndR01 <= EndR_01;
  END IF;
end process;

Grüße
Klaus

von Siegfried S. (dieleena)


Lesenswert?

hallo, guten morgen
habe jetzt mein Projekt fast fertig. Der Compiler läüft komplett durch. 
Es werden weder Warnungen noch Fehler gemeldet. Schematic is auch in 
Ordnung. Nur bei "Syntesize - XSL" bekomme ich ein gelbes 
Ausrufezeichen. Dies ist aber von Anfang an.
Die noch ausgeremmte Zeilen werden später aktiv, da ich je nach Chiptype 
die Logic mehrfach einbringe.
Ich möchte jetzt langsam an die Harware herangehen, um das Ergebnis zu 
überprüfen. Hoffe, das ich keine Fehler mehr in dem Projekt habe.
Hier meine Code.

entity EndStufe is
    Port ( DATA       : inout  STD_LOGIC_VECTOR (7 downto 0);
           FahrCount  : in     STD_LOGIC_VECTOR (7 downto 0);
           ADR        : in     STD_LOGIC_VECTOR (2 downto 0);
           clk        : in     STD_LOGIC;
           rst        : in     STD_LOGIC;
           IOSEL      : in     STD_LOGIC;
           RW         : in     STD_LOGIC;
           CLK10KHz   : in     STD_LOGIC;
           Sbg01      : in     STD_LOGIC;
           EndR01     : out    STD_LOGIC;
           EndL01     : out    STD_LOGIC);
end EndStufe;

architecture Behavioral of EndStufe is

  signal FahrSpeicher01 : std_logic_vector(7 downto 0);
--  FahrLogic...(0) = E/A
--  FahrLogic...(1) = V/R
--  FahrLogic...(2) = Licht
  signal FahrLogic01 : std_logic_vector(2 downto 0);
  signal COMP_01     : std_logic;
  signal SBG_01      : std_logic;
  signal EndL_01     : std_logic;
  signal EndR_01     : std_logic;
  --
  signal Adr_RW      : std_logic;
  signal Adr_11      : std_logic;
  signal Adr_12      : std_logic;
--  signal Adr_21      : std_logic;
--  signal Adr_22      : std_logic;
--  signal Adr_31      : std_logic;
--  signal Adr_32      : std_logic;
--  signal Adr_41      : std_logic;
--  signal Adr_42      : std_logic;
  signal rst_11      : std_logic;

begin
--


--  Adressen Decoder
ADR_11 <= ((NOT IOSEL) AND (NOT RW) AND (NOT ADR(2)) AND (NOT ADR(1)) 
AND (NOT ADR(0)));
ADR_12 <= ((NOT IOSEL) AND (NOT RW) AND (NOT ADR(2)) AND (NOT ADR(1)) 
AND (ADR(0)));
--
--ADR_21 <= ((NOT IOSEL) AND (NOT RW) AND (NOT ADR(2)) AND (ADR(1)) AND 
(NOT ADR(0)));
--ADR_22 <= ((NOT IOSEL) AND (NOT RW) AND (NOT ADR(2)) AND (ADR(1)) AND 
(ADR(0)));
--
--ADR_31 <= ((NOT IOSEL) AND (NOT RW) AND (ADR(2)) AND (NOT ADR(1)) AND 
(NOT ADR(0)));
--ADR_32 <= ((NOT IOSEL) AND (NOT RW) AND (ADR(2)) AND (NOT ADR(1)) AND 
(ADR(0)));
--
--ADR_41 <= ((NOT IOSEL) AND (NOT RW) AND (ADR(2)) AND (ADR(1)) AND (NOT 
ADR(0)));
--ADR_42 <= ((NOT IOSEL) AND (NOT RW) AND (ADR(2)) AND (ADR(1)) AND 
(ADR(0)));
--
ADR_RW <= ((NOT IOSEL) AND RW AND (NOT ADR(2)) AND (NOT ADR(1)) AND (NOT 
ADR(0)));
--
rst_11 <= rst or Sbg01;


--    8-Bit Comparator
process(FahrSpeicher01, FahrCount, Clk10KHz, Sbg01, COMP_01, 
FahrLogic01)
begin
  IF FahrSpeicher01 > FahrCount THEN
    COMP_01 <= '1';
  ELSE
    COMP_01 <= '0';
  END IF;
  EndR_01 <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and 
FahrLogic01(2)
          and Clk10KHz)) and Sbg01 and FahrLogic01(1));
  EndL_01 <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and 
FahrLogic01(2)
          and Clk10KHz)) and Sbg01 and (NOT FahrLogic01(1)));
end process;


--    FF Fahrstufe Ansteuerung Links / Rechts
process(clk, rst_11, EndR_01, EndL_01)
begin
  IF rst_11 = '1' then
    EndL01 <= '0';
    EndR01 <= '0';
  ELSIF rising_edge(clk) THEN
    EndL01 <= EndL_01;
    EndR01 <= EndR_01;
  END IF;
end process;


--    8-Bit Speicher Geschwindigkeit
process(clk, rst_11, ADR_11, DATA)
begin
  IF rst_11 = '1' THEN
    FahrSpeicher01 <= "00000000";
  ELSIF rising_edge(clk) THEN
    if (ADR_11 = '1') then
      FahrSpeicher01 <= DATA;
    END IF;
  END IF;
end process;


--    8/3-Bit Speicher Logic
process(clk, rst_11, ADR_12, DATA)
begin
  IF rst_11 = '1' THEN
    FahrLogic01 <= "000";
  ELSIF rising_edge(clk) THEN
    if (ADR_12 = '1') then
      FahrLogic01(0) <= DATA(0);
      FahrLogic01(1) <= DATA(1);
      FahrLogic01(2) <= DATA(2);
    END IF;
  END IF;
end process;


--    Strombegrenzung Speicher Logic
process(clk, rst, ADR_RW, Sbg01, SBG_01)
begin
  if rst = '1' then
    SBG_01 <= '0';
  elsif rising_edge(clk) then
    SBG_01 <= Sbg01;
  end if;
  if ADR_RW = '1' then
    DATA(0) <= SBG_01;
  else
    DATA(0) <= 'Z';
  end if;
end process;

end Behavioral;

Gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

Hallo, guten abend
habe noch ein Problem beim Compilieren.
arbeite mit der Version 8.2.03i  Wenn ich den XC9532XL-10-PC44 oder 
XC9572XL-10-VQ44 wähle, bekomme ich in Fitter-Report den Fehler
"[Warning]:Cpld:868 - Cannot fit the design into any of the specified 
devices with the selected implementation options. "

Die Gehäuse Typen sind doch in der Liste vorhanden!

I/O Pin = 27
Macocells = 17
Pterms Used = 96
Registers Used = 14
Function Block 65

Gruß Siegfried

von Roger S. (edge)


Lesenswert?

Deine HW-Beschreibung ist ziemlich ABEL kryptisch, gebe dir den Tipp 
dich von deinem Gatter Denken zu loesen.
Der Address decoder sieht oberhaesslich aus, mit einem case select in 
einem process ginge das uebersichtlicher und wartbarer.
Gibts eigentlich einen Grund warum du EndL/R01 zuerst kombinatorisch 
bildest und dann in einem anderen process registerst? Aus der Synthese 
kommt evtl. dasselbe raus, aber eben wieder die Uebersichtlichkeit.

btw, schau dir mal das keyword alias an, dann musst du nicht mit 
kryptischen FahrLogic01(0), FahrLogic01(1) etc. hantieren.

Cheers, Roger

von Siegfried S. (dieleena)


Lesenswert?

hallo,
was mache ich hier falsch?

COMP_01 <= '1' when FahrSpeicher01 > FahrCount else '0';

ERROR:HDLParsers:164 - 
"E:/XilinixSourcecode/Test_XC9572CL44PLCC/EndTreiber.vhd" Line 77. parse 
error, unexpected WHEN, expecting SEMICOLON

Zeile ist in abgewandelter Form aus "XST User Guide"

Gruß Siegfried

von Volker (Gast)


Lesenswert?

machst einfach noch nen Semikolon nach COMP_01 <= '1'
dann müsste es passen.

Gruß Volker

von Siegfried S. (dieleena)


Lesenswert?

hallo, guten morgen
damit ist doch meine Frage nicht beantwortet.
Gruß Siegfried

von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>hallo, guten morgen
>damit ist doch meine Frage nicht beantwortet.

Häng doch bitte bei deinen Fragen den KOMPLETTEN Quelltext als Anhang 
dran, solche Sachen sind meistens kontextsensitiv.

MfG
Falk

von Christian P. (kron)


Lesenswert?

Zm Thema Einsteigerbuch:
Das hier hat mir sehr geholfen:
http://www.amazon.de/VHDL-Eine-Einf%C3%BChrung-Paul-Molitor/dp/3827370477/ref=sr_1_1/028-0372841-1492547?ie=UTF8&s=books&qid=1173260112&sr=8-1
(VHDL - Eine Einführung, von Paul Molitor und Jörg Ritter)

von Siegfried S. (dieleena)


Angehängte Dateien:

Lesenswert?

hallo,
hier mein Sourcecode als Anhang.
Siehe "FF Fahrstufe Ansteuerung Links / Rechts". Hier möchte ich
IF FahrSpeicher01 > FahrCount THEN
  COMP_01 <= '1';
ELSE
  COMP_01 <= '0';
END IF;
gegen
COMP_01 <= '1' when FahrSpeicher01 > FahrCount else '0';
austauschen. Bekomme dann die Fehlermeldung "ERROR:HDLParsers:164 -
"E:/XilinixSourcecode/Test_XC9572CL44PLCC/EndTreiber.vhd" Line 77. parse
error, unexpected WHEN, expecting SEMICOLON".
Gruß Siegfried

von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>hier mein Sourcecode als Anhang.
>Siehe "FF Fahrstufe Ansteuerung Links / Rechts". Hier möchte ich
>IF FahrSpeicher01 > FahrCount THEN
>  COMP_01 <= '1';
>ELSE
>  COMP_01 <= '0';
>END IF;
>gegen
>COMP_01 <= '1' when FahrSpeicher01 > FahrCount else '0';
>austauschen. Bekomme dann die Fehlermeldung "ERROR:HDLParsers:164 -

1.) Warum? Es funktioniert doch so gut, oder?

2.) Logo, kann nicht gehen, du bist schliesslich in einem (getakteten) 
Prozess. Dort gibts nur IF THEN. Das WHEN Konstrukt gilt nur als 
Einzelanweisung ausserhalb eines Prozesses und ist rein kombinatorisch.

Ergo. Lass es einfach so, es ist lesber und funktioniert. Was willst du 
mehr?

MfG
Falk

P.S. Genau das meinte ich mit kontextsensitiv.

von Siegfried S. (dieleena)


Lesenswert?

hallo,
Wird akzeptiert.
Habe aber noch ein anderes Problem. Um Macrozellen zu sparen, wollte ich
IF FahrSpeicher01 > FahrCount THEN
  COMP_01 <= '1';
ELSE
  COMP_01 <= '0';
END IF;
in einen ungetakten Prozess/Bereich legen. Diese Zeilen im getaktem 
Bereich, verzögern das Ergebnis um ein Takt. Warum soll das Ergebnis des 
Komparator zwischenspeichern, dann mit anderen Signale verknüpfen und 
anschließen dieses Ergebnis nochmals speichern.
Jetzt kommt der Wurm. Wenn ich den XC9532XL-10-PC44 oder
XC9572XL-10-VQ44 wähle, bekomme ich in Fitter-Report den Fehler
"[Warning]:Cpld:868 - Cannot fit the design into any of the specified
devices with the selected implementation options. "
Bei anderen Gehäuseformen/Typen bekomme ich diesen Fehler nicht.
Gruß Siegfried

von Klaus F. (kfalser)


Lesenswert?

Du hättest nur die Zeile mit dem when aus dem Prozess herausnehmen 
brauchen, dann hatte es gepasst und COMP_01 ist nicht mehr getaktet.

von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>Habe aber noch ein anderes Problem. Um Macrozellen zu sparen, wollte ich
>IF FahrSpeicher01 > FahrCount THEN
>  COMP_01 <= '1';
>ELSE
>  COMP_01 <= '0';
>END IF;
>in einen ungetakten Prozess/Bereich legen. Diese Zeilen im getaktem
>Bereich, verzögern das Ergebnis um ein Takt. Warum soll das Ergebnis des
>Komparator zwischenspeichern, dann mit anderen Signale verknüpfen und
>anschließen dieses Ergebnis nochmals speichern.

Dann mach es doch einfach. Schreib deine WHEN Konstruk ausserhalb eines 
Prozesses.

>Jetzt kommt der Wurm. Wenn ich den XC9532XL-10-PC44 oder
>XC9572XL-10-VQ44 wähle, bekomme ich in Fitter-Report den Fehler

???
Deinen Quellcode kann ich problemlos in ein 9532XL compilieren.

MfG
Falk

von Klaus F. (kfalser)


Lesenswert?

Ich habe es mit ISE 9.1 auch probiert.
Wenn das COMP_01 Signal getaktet ist, dann gehts ohne Probleme.
Wenn man das COMP_01 kombinatorisch macht, dann werden ziemlich große 
Gleichungen erzeugt und der Fitter hat in der Tat Probleme. Mit der 
Option "Exhaustive Fitting" hat es dann geklappt.
Ein > Vergleich in einem CPLD ist immer eher ungünstig, ein Vergleich 
auf Gleichheit ist besser.

von Siegfried S. (dieleena)


Lesenswert?

hallo,
hast du eine Möglichkeit, das Ergebnis so auswerten, daß wenn Speicher 
größer Zähler ist, eine "1" ergibt?
mit der Opition "Exhaustive Fitting" prüfe ich später. Es ist nur 
auffällig, das es nur bei den genannte Typen vorkommt.
Gruß Siegfried

von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>hast du eine Möglichkeit, das Ergebnis so auswerten, daß wenn Speicher
>größer Zähler ist, eine "1" ergibt?

Du willst PWM. Das geht so.

if pwm_cnt = 0 then
  pwm_output <= '1';
elsif pwm_cnt = pwm_setting then
  pwm_output <= '0';
end if;

Das sind zwei simple Komparatoren (XOR-Ketten) welche je nur einen 
Produktterm belegen. Der Vergleicher ">" ist ein Subtrahierer, der 
wesentlich mehr Produkterme braucht.

MfG
Falk

von Siegfried S. (dieleena)


Lesenswert?

hallo,
wo änderst du in der Compiler Optionen den Wert um. Zur Zeit ist 
"Exhaustive Fitting" OFF.
gruß siegfried

von Siegfried S. (dieleena)


Lesenswert?

hallo,
habe dieses "Exhaustive Fitting" im Netz gesucht. Kann das gesuchte 
nicht korrekt übersetzen, aber soweit ich es verstehe, hat der Compiler 
bei
-EndR01 <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and 
FahrLogic01(2) and Clk10KHz)) and Sbg01 and FahrLogic01(1));
EndL01 <= (((COMP_01 AND FahrLogic01(0)) or ((NOT COMP_01) and 
FahrLogic01(2) and Clk10KHz)) and Sbg01 and (NOT FahrLogic01(1)));
probleme. Werde diese neu überarbeiten.

Collapsing Product Term Limit: This option creates a maximum product 
term limit per
equation. This is best observed by an example.
Given an initial design:
Y <= (A(0) and A(1)) or Node_a;
Node_a <= (not B(0) and B(1)) or Node_b;
Node_b <= (not C(0) and C(1)) or (D(0) and D(1));
A product term limit of five allows all product terms to collapse into 
one level of logic:
Y <= (A(0) and A(1)) or (B(0) and B(1)) or (C(0) and C(1)) or (D(0) and
D(1));
The following would occur if the product term limit were set to three:
Y = Y8 or (A(1) and A(0)) or (D(1) and D(0));
Y8 = (C(1) and C(0)) or (B(1) and B(0));
Gruß Siegfried

von Klaus F. (kfalser)


Lesenswert?

Man kann natürlich schwer sagen woher es genau kommt, ich glaube es 
kommt eher vom > Vergleich.
Du kannst Dir den "Fitting Report" anschauen, und zwar den Abschnitt 
"Equations". Dies zeigt Dir genau, was an Logik erzeugt wurde.
Am verständlichsten sind die Gleichungen meiner Meinung nach in ABEL, 
stelle deshalb das Pull-Down Menu links von VHDL auf ABEL.
Man sieht, daß die Gleichungen für COMP_01 am längsten und am 
kompliziertesten sind.

Ich nehme an, daß dein FahrCount eine Art Zähler ist, mit dem Du eine 
Art Pulsweitemodulation machst. Kannst Du diesen Zähler nicht ins CPLD 
geben, dann könntest Du auf Gleichheit testen?

Klaus

von Siegfried S. (dieleena)


Angehängte Dateien:

Lesenswert?

hallo @Falk @Klaus
kann es drehen wie ich will, mit XC9536XL-PC44 bzw. XC9572XL-PC44 und 
FahrCount > FahrSpeicher01 , der Fehler geht nicht weg. mit 
XC9572XL-TQ100 funktioniert es wunderbar.
Habe nochmals den Code in geänderter Form beigefügt.
bei deinem Code habe ich ein anderes Problem.
if FahrCount = 0 then
COMP_01 <= '1';
...
elsif FahrCount = FahrSpeicher01 then
COMP_01 <= '0';
...
end if.
Dieser wird vom Compiler problemlos akzetiert, auch bei PC44 Gehäuse, 
aber er benotigt mehr Macrocells Used

mein Code:
Macrozells Used  17/72
Pterms Used  85/360
Registers Used  14/72
Pins Used  27/72
Funktion Block  60/216

dein Code:
Macrozells Used  20/72
Pterms Used  72/360
Registers Used  14/72
Pins Used  27/72
Funktion Block  67/216

noch eine Frage zu deiner Version.
Wenn der FahrCount 0 ist (if FahrCount = 0 then), wird COMP_01 eine '1' 
zugewiesen "EINSCHALTEN" . Der FahrCount(Zähler) wird solange erhöht, 
bis (elsif FahrCount = FahrSpeicher01 then) ist. Hier wird dann COMP_01 
eine '0' zugewiesen "AUSSCHALTEN" .
Wie ist das, wenn der FahrSpeicher '0' ist. Wird da bei der Zeile IF 
"eingeschaltet", und sofort bei der elsif wieder "ausgeschaltet" ?
gruß Siegfried


von Falk (Gast)


Lesenswert?

@Siegfried Saueressig

>kann es drehen wie ich will, mit XC9536XL-PC44 bzw. XC9572XL-PC44 und
>FahrCount > FahrSpeicher01 , der Fehler geht nicht weg. mit

Ich damit keinerlei Probleme. Dein Code mit ISE 4.2 funktioniert 
wunderbar. Hast du vielleicht irgendwelche komischen Pinzuweisungen in 
deinem Design? Versuchs mal gänzlich ohne Pinzuweisungen.

>Dieser wird vom Compiler problemlos akzetiert, auch bei PC44 Gehäuse,
>aber er benotigt mehr Macrocells Used

Dein Code braucht bei mir 19 MCs.

>Wie ist das, wenn der FahrSpeicher '0' ist. Wird da bei der Zeile IF
>"eingeschaltet", und sofort bei der elsif wieder "ausgeschaltet" ?

Naja, das ist noch nicht ganz perfekt. In diesem Fall würde das Signal 
immer auf '1' bleiben. Das muss man umstellen.

if pwm_cnt = pwm_setting then
  pwm_output <= '0';
elsif pwm_cnt = 0 then
  pwm_output <= '1';
end if;

MfG
Falk



gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

hallo
habe an der Pinzuweisung noch keine Hand angelegt. Wenn eine 
Pinzuweisung erfolgt ist, dann durch das Programm. Ich habe hier bewust 
nichts gemacht, da ich nach möglichkeit ein sauberes 
Platienen-Layout(Eagle) haben möchte und die entgültige Anzahl der 
"Module" richtet sich nach den MCs. Sollte ich mit 17 MCs pro "Modul" 
auskommen, könnte ich mein koplettes Projekt mit zwei 95144 aufbauen. 2 
x 8 Module  bzw. 8 Module x 17 MCs = 136 MCs
Frage: sind in meinem Code noch Fehler oder sollte gewisse Zeilen noch 
geändert werden.
PS.
gibt es einen guten (deutsch!) Link, für die Bedienung von ModelSim
Gruß Siegfried

von Klaus F. (kfalser)


Lesenswert?

Unsauberheiten sind in deinem Code schon.
Die Sensitivity lists stimmen nicht und folgender Code
1
--    Strombegrenzung Speicher Logic
2
process(clk, rst, ADR, IOSEL, RW, Sbg01, SBG_01)
3
begin
4
   if rst = '1' then
5
       SBG_01 <= '0';
6
   elsif rising_edge(clk) then
7
       SBG_01 <= Sbg01;
8
   end if;
9
   if ADR = "101" AND IOSEL = '0' AND RW = '1' then
10
       DATA(0) <= SBG_01;
11
   else
12
       DATA(0) <= 'Z';
13
   end if;
14
end process;

ist so richtiger :
1
--    Strombegrenzung Speicher Logic
2
process(clk, rst)
3
begin
4
   if rst = '1' then
5
        SBG_01 <= '0';
6
    elsif rising_edge(clk) then
7
        SBG_01 <= Sbg01;
8
   end if;
9
end process;
10
11
DATA(0) <= SBG_01 when ADR = "101" AND IOSEL = '0' AND RW = '1' else 'Z';

Die Berechnung von SBG_01 ist getaktet, und gehört deshalb in einen 
eigenen Prozess.
DATA(0) ist kombinatorisch, und gehört deshalb in einen eigenen Prozess 
oder wird am besten außerhalb eines Prozesses geschrieben.

Von der Funktion war es aber korrekt.

Klaus

von Siegfried S. (dieleena)


Lesenswert?

hallo,
werde die Zeilen anpassen.
Aber, ich habe mir überlegt, den Chip nicht voll auszureizen. Nach der 
alten Berechnung für die MCs, hatte ich eine Reserve von 8 MCs. Werde 
also nur 4 Module einsetzen "144 - 4 X 17 = 76 MCs Reserve" je Chip. 
Sollte dann in der Praxis noch Änderungen vorkommen, kann ich auf die 
Reserve zugreifen. Kostet etwas mehr, aber was solls.
Werde jetzt ein Layout (Adapter) erstellen, um meine Arbeit testen zu 
können.
Ich werde auch in Zukunft auf diese Forum's zugreifen.
Habe in wenige Tage einen ganz kleinen Einblick in diese 
Programmiersprache erlernt.
Allen Forumsteilnehmer, die tatkräftig mich unterstützt haben, Danke.
Gruß Siegfried

von Siegfried S. (dieleena)


Lesenswert?

hallo, bin wieder da

war ist richtig ?
diese Version ( erzeugt 10 MCs )

process(rst, clk, FahrCount, FahrSpeicher01)
begin
  if rst = '1' then
    PwmOut_01 <= '0';
  elsif FahrCount = FahrSpeicher01 then
    PwmOut_01 <= '0';
  elsif FahrCount = 0 then
    PwmOut_01 <= '1';
  end if;
end process;

oder diese Version (erzeugt 18 MCs)

--    Endstufe  Comparator  - -  1  - -
process(rst, clk, FahrCount, FahrSpeicher01)
begin
  if rst = '1' then
    PwmOut_01 <= '0';
  elsif rising_edge(clk) THEN
    if FahrCount = FahrSpeicher01 then
      PwmOut_01 <= '0';
    elsif FahrCount = 0 then
      PwmOut_01 <= '1';
    end if;
  end if;
end process;


FahrSpeicher01 = 8bit als Latch
FahrCount = 8Bit -> Input-Pin

Soweit wie ich zur Zeit mit ModelSim zurecht komme, wird in beiden 
Versionen die Funktionen korrekt ausgeführt.

Gruß Siegfried

von Falk (Gast)


Lesenswert?

@ Siegfried Saueressig (dieleena)

Die erste Version erzeugt keine PWM, da bekommst du nur zu einem Takt 
ein HIGH, und zwar genau dann, wenn Fahrcount = 0 ist. Es fehlt der 
Takt. Die zweite Version sieht korrekt aus.

>Soweit wie ich zur Zeit mit ModelSim zurecht komme, wird in beiden
>Versionen die Funktionen korrekt ausgeführt.

Das glaube ich nicht.

MfG
Falk

von Siegfried S. (dieleena)


Lesenswert?

hallo @Falk
Ich sehe dieses auch so. Der Sollwert (FahrSpeicher01) muß doch 
gespeichert werden. Benötige zwei Werte, um einen Vergleich zu 
erstellen.
Gruß Siegfried

von Rick Dangerus (Gast)


Lesenswert?

@Sigfried:
Du hast doch ein synchrones Design. Was machen da
"FahrCount" und "FahrSpeicher01" in der Sensitivity-List?

Rick

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.