DVS: Kann 4-Bit-Zähler kompilieren aber nicht simulieren!

Diskussionen rund um Themen und Veranstaltungen des 3. Bachelor-Semesters

Moderator: (M) Mod.-Team Allgemein

Antworten
Benutzeravatar
Otto
TalkING. Freak
TalkING. Freak
Beiträge: 110
Registriert: Fr, 12. Sep. 03, 19:15

DVS: Kann 4-Bit-Zähler kompilieren aber nicht simulieren!

Beitrag von Otto » Sa, 28. Feb. 04, 22:19

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.

Bild

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

turing
TalkING. Freak
TalkING. Freak
Beiträge: 203
Registriert: So, 12. Okt. 03, 13:17

Beitrag von turing » So, 29. Feb. 04, 13:45

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.

Benutzeravatar
Otto
TalkING. Freak
TalkING. Freak
Beiträge: 110
Registriert: Fr, 12. Sep. 03, 19:15

Beitrag von Otto » So, 29. Feb. 04, 14:43

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

mws
TalkING. Newbie
TalkING. Newbie
Beiträge: 11
Registriert: Do, 19. Dez. 02, 14:08

Beitrag von mws » So, 29. Feb. 04, 17:19

Wenn ich VHDL-Code geschrieben habe, wie kann ich den dann in eine grafische Schaltung umwandeln lassen? Ich benutze das ISE Webpack und ModelSim.

Gast

Beitrag von Gast » So, 29. Feb. 04, 21:43

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.

Benutzeravatar
Otto
TalkING. Freak
TalkING. Freak
Beiträge: 110
Registriert: Fr, 12. Sep. 03, 19:15

Beitrag von Otto » Mo, 01. Mär. 04, 00:57

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

Gast

Beitrag von Gast » Mo, 01. Mär. 04, 15:41

Wenn ich das Schematic mir anschaue bekomme ich

(not A or not B) and ( A or B) = y

die währe
A B Y
0 0 0
0 1 1
1 0 1
1 1 0

Die sollte doch das Xor sein oder leige ich da falsch?
(immer wenn zwei gleich Signal anliegen ist eines der oder = 0 welches in der and verknüpfung auch eine 0 bewirkt)

Benutzeravatar
Otto
TalkING. Freak
TalkING. Freak
Beiträge: 110
Registriert: Fr, 12. Sep. 03, 19:15

Beitrag von Otto » Mo, 01. Mär. 04, 22:27

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

Antworten