DVS: Kann 4-Bit-Zähler kompilieren aber nicht simulieren!
Moderator: (M) Mod.-Team Allgemein
DVS: Kann 4-Bit-Zähler kompilieren aber nicht simulieren!
Hallo,
Der folgende Quellcode ist im Grunde genommen eine sozusagen wörtliche Übersetzung einer 4-Bit-Zählerschaltung aus vier takt-vorderflanken-gesteuerten D-FlipFlops.
Das Problem ist dass diese Schaltung von Xilinx-ModelSim und VHDL-Simily-Sonata problemlos kompiliert werden kann, jedoch während der Simulation fehler gemeldet werden, sodass im Endeffekt der Zähler nicht simuliert werden kann. Alle unterschaltungen (D-Latch und D-FlipFLop können auch problemlos simuliert werden). Liegt es vielleicht an den zu vielen nebenläufigen Signalzuweisungen?
Hier nun der Quellcode:
---------------------------------------------------------
COUNTER4.vhd
---------------------------------------------------------
entity COUNTER4 is
port (CLK : in bit;
N : out bit_vector(3 downto 0));
end;
architecture BEHAVIORAL of COUNTER4 is
component D_FF is
port (D, CLK : in bit;
Q, NQ : buffer bit);
end component;
signal Q, NQ : bit_vector(3 downto 0);
signal Q1, NQ1 : bit_vector(3 downto 0);
begin
D_FF0: D_FF port map(NQ(0), CLK, Q(0), NQ(0));
D_FF1: D_FF port map(NQ(1), Q(0), Q(1), NQ(1));
D_FF2: D_FF port map(NQ(2), Q(1), Q(2), NQ(2));
D_FF3: D_FF port map(NQ(3), Q(2), Q(3), NQ(3));
N <= Q;
end;
---------------------------------------------------------
D_FF.vhd
---------------------------------------------------------
-- Taktvorderflankengesteuertes D-FlipFlop
entity D_FF is
port (D, CLK : in bit;
Q, NQ : buffer bit);
end;
architecture BEHAVIORAL of D_FF is
component D_LATCH is
port (D, CLK : in bit;
Q : buffer bit);
end component;
signal Qm : bit;
begin
MASTER: D_LATCH port map(D, not CLK, Qm);
SLAVE: D_LATCH port map(Qm, CLK, Q);
NQ <= not Q;
end;
---------------------------------------------------------
D_LATCH.vhd
---------------------------------------------------------
entity D_LATCH is
port (D, CLK : in bit;
Q, NQ : buffer bit);
end;
architecture BEHAVIORAL of D_LATCH is
begin
Q <= D when CLK = '1' else Q;
end;
architecture BEHAVIORAL2 of D_LATCH is
begin
NQ <= (CLK and D) nor Q;
Q <= (CLK and (not D)) nor NQ after 1 fs;
end;
---------------------------------------------------------
Otto
Der folgende Quellcode ist im Grunde genommen eine sozusagen wörtliche Übersetzung einer 4-Bit-Zählerschaltung aus vier takt-vorderflanken-gesteuerten D-FlipFlops.
Das Problem ist dass diese Schaltung von Xilinx-ModelSim und VHDL-Simily-Sonata problemlos kompiliert werden kann, jedoch während der Simulation fehler gemeldet werden, sodass im Endeffekt der Zähler nicht simuliert werden kann. Alle unterschaltungen (D-Latch und D-FlipFLop können auch problemlos simuliert werden). Liegt es vielleicht an den zu vielen nebenläufigen Signalzuweisungen?
Hier nun der Quellcode:
---------------------------------------------------------
COUNTER4.vhd
---------------------------------------------------------
entity COUNTER4 is
port (CLK : in bit;
N : out bit_vector(3 downto 0));
end;
architecture BEHAVIORAL of COUNTER4 is
component D_FF is
port (D, CLK : in bit;
Q, NQ : buffer bit);
end component;
signal Q, NQ : bit_vector(3 downto 0);
signal Q1, NQ1 : bit_vector(3 downto 0);
begin
D_FF0: D_FF port map(NQ(0), CLK, Q(0), NQ(0));
D_FF1: D_FF port map(NQ(1), Q(0), Q(1), NQ(1));
D_FF2: D_FF port map(NQ(2), Q(1), Q(2), NQ(2));
D_FF3: D_FF port map(NQ(3), Q(2), Q(3), NQ(3));
N <= Q;
end;
---------------------------------------------------------
D_FF.vhd
---------------------------------------------------------
-- Taktvorderflankengesteuertes D-FlipFlop
entity D_FF is
port (D, CLK : in bit;
Q, NQ : buffer bit);
end;
architecture BEHAVIORAL of D_FF is
component D_LATCH is
port (D, CLK : in bit;
Q : buffer bit);
end component;
signal Qm : bit;
begin
MASTER: D_LATCH port map(D, not CLK, Qm);
SLAVE: D_LATCH port map(Qm, CLK, Q);
NQ <= not Q;
end;
---------------------------------------------------------
D_LATCH.vhd
---------------------------------------------------------
entity D_LATCH is
port (D, CLK : in bit;
Q, NQ : buffer bit);
end;
architecture BEHAVIORAL of D_LATCH is
begin
Q <= D when CLK = '1' else Q;
end;
architecture BEHAVIORAL2 of D_LATCH is
begin
NQ <= (CLK and D) nor Q;
Q <= (CLK and (not D)) nor NQ after 1 fs;
end;
---------------------------------------------------------
Otto
Wenn es Dir darum geht, einfach nur einen Zähler / Frequenzteiler in VHDL zu erstellen, so verwende doch den Datentyp std_logic_vector. Darauf sind arithmetische Operationen definiert.
Bsp:
ctr : out std_logic_vector(3 downto 0);
Alternativ: Hast Du mal versucht Prozesse mit Sensitivitätsliste zu definieren? Diese werden genau dann aufgerufen, wenn sich ein in der Liste stehendes Signal ändert.
Bsp:
ctr : out std_logic_vector(3 downto 0);
Alternativ: Hast Du mal versucht Prozesse mit Sensitivitätsliste zu definieren? Diese werden genau dann aufgerufen, wenn sich ein in der Liste stehendes Signal ändert.
Na ja, std_logic ist zwar auch eine Lösung, doch mein Ziel war es eine Schaltung, die in Electronics Workbench funktioniert hat in VHDL einzugeben.
Doch inzwischen vermute ich, dass die Simulatoren einfach zu blöd sind, so "komplexe" Schaltungen zu simulieren oder mir fehlt bestimmtes Detailwissen dazu...
Jedenfalls kann man einen takt-vorderflanken-gesteuerten (Master-Slave-) D-FlipFlop auch folgendermaßen aufbauen - oder besser gesagt beschreiben:
-----------------------------------------
architecture BEHAVIORAL3 of D_FF is
begin
Q <= D when CLK = '1' and CLK'event else Q;
NQ <= not Q;
end;
-----------------------------------------
Oder auch mit Prozessen, wenn Du unbedingt willst:
-----------------------------------------
architecture BEHAVIORAL2 of D_FF is
begin
DFF:
process(CLK)
begin
if CLK = '1' then
Q <= D;
end if;
end process;
NQ <= not Q;
end;
-----------------------------------------
Mit diesem D-FlipFlop würde auch der o.g. COUNTER4.vhd problemlos funktionieren!
Mir ist das ehrlich gesagt unverständlich, aber ich bin zunächst glücklich, dass es so geklappt hat und werde weiter experementieren
Otto
Doch inzwischen vermute ich, dass die Simulatoren einfach zu blöd sind, so "komplexe" Schaltungen zu simulieren oder mir fehlt bestimmtes Detailwissen dazu...
Jedenfalls kann man einen takt-vorderflanken-gesteuerten (Master-Slave-) D-FlipFlop auch folgendermaßen aufbauen - oder besser gesagt beschreiben:
-----------------------------------------
architecture BEHAVIORAL3 of D_FF is
begin
Q <= D when CLK = '1' and CLK'event else Q;
NQ <= not Q;
end;
-----------------------------------------
Oder auch mit Prozessen, wenn Du unbedingt willst:
-----------------------------------------
architecture BEHAVIORAL2 of D_FF is
begin
DFF:
process(CLK)
begin
if CLK = '1' then
Q <= D;
end if;
end process;
NQ <= not Q;
end;
-----------------------------------------
Mit diesem D-FlipFlop würde auch der o.g. COUNTER4.vhd problemlos funktionieren!
Mir ist das ehrlich gesagt unverständlich, aber ich bin zunächst glücklich, dass es so geklappt hat und werde weiter experementieren
Otto
Das Schaltbild kannst du Dir unter
Synthesize -> View RTL Scematic anschauen.
@ "die Simulatoren können das vielleicht nicht
Die Simulatoren schaffen super viel selbst in den höheren Simulationen (mit zeitkritisch und den geroutete schaltplan) habe ich Modelsimsimulationen eines PCI-Bus ansteuerung gesehen.
Synthesize -> View RTL Scematic anschauen.
@ "die Simulatoren können das vielleicht nicht
Die Simulatoren schaffen super viel selbst in den höheren Simulationen (mit zeitkritisch und den geroutete schaltplan) habe ich Modelsimsimulationen eines PCI-Bus ansteuerung gesehen.
zu dieser Schaltplan-Software hätte ich eine Frage:
-- Wird von Xilinx "View RTL Schematic" falsch synthetisiert : statt XOR wird NXOR gebaut
-- ModelSim simuliert dagegen richtig
architecture BEHAVIORAL4 of MyXOR is
signal I : bit_vector(1 downto 0);
begin
I(0) <= A;
I(1) <= B;
Y <= '1' when I = "10" else
'1' when I = "01" else
'0';
end;
Die Architecture beschreibt doch eindeutig die Wahrheitstabelle von XOR (Antivalenz: A = B => Y = 0, sonst Y = 1)
Verstehe ich da was falsch oder macht diese Schaltplan-Software ab und zu fehler (was aber ziemlich lächerlich wäre, schließlich will man im Endeffekt ein richtig funktionierendes FPGA haben)
Otto
-- Wird von Xilinx "View RTL Schematic" falsch synthetisiert : statt XOR wird NXOR gebaut
-- ModelSim simuliert dagegen richtig
architecture BEHAVIORAL4 of MyXOR is
signal I : bit_vector(1 downto 0);
begin
I(0) <= A;
I(1) <= B;
Y <= '1' when I = "10" else
'1' when I = "01" else
'0';
end;
Die Architecture beschreibt doch eindeutig die Wahrheitstabelle von XOR (Antivalenz: A = B => Y = 0, sonst Y = 1)
Verstehe ich da was falsch oder macht diese Schaltplan-Software ab und zu fehler (was aber ziemlich lächerlich wäre, schließlich will man im Endeffekt ein richtig funktionierendes FPGA haben)
Otto
stimmt tatsächlich!
habe ursprünglich versucht von dem Ausdruck (not A or not B) and ( A or B), das Xilinx generiert mit dem Satz von DeMorgan auf (not a and b) or (a and not b) zu kommen - dieser Audruck wird bei XOR öfter angegeben. Habe es aber nicht geschafft - auf grund eines Fehlers von mir - es hat sich aber inzwischen alles geklärt...
Otto
habe ursprünglich versucht von dem Ausdruck (not A or not B) and ( A or B), das Xilinx generiert mit dem Satz von DeMorgan auf (not a and b) or (a and not b) zu kommen - dieser Audruck wird bei XOR öfter angegeben. Habe es aber nicht geschafft - auf grund eines Fehlers von mir - es hat sich aber inzwischen alles geklärt...
Otto