Forum: FPGA, VHDL & Co. Bidirektionale Pins in Quartus II (Altera)


von Tobias P. (hubertus)


Lesenswert?

Hallo,
ich bin grade in Quartus II am experimentieren.
Ich will für ein Mikroprozessorboard einen simplen Peripheriebaustein 
machen, und zwar aus einem MAX7000S-CPLD. Vorerst sollen es einfach ein 
paar Latches sein, die jedoch zurücklesbar sind. Theoretisch könnte man 
ja gewöhnliche 8 Bit D-Flipflops nehmen, ist aber hässlich weil das dann 
write-only Ports sind. Dann will ich die Ports gleich auch noch als 
Eingang oder Ausgang konfigurieen.

Bis jetzt bin ich aber nicht über die Bidirektionalen Pins für den 
Datenbus gekommen. Ich hab keine Ahnung, wie man das in Quartus macht - 
es funktioniert einfach nie zum simulieren! Zum Test habe ich das so 
gemacht:

Ein D-Flipflop ist mit dem D-Eingang an einem BIDIR-Pin angeschlossen. 
Der Q-Ausgang geht über einen TRI-Buffer auf den BIDIR-Pin, welcher erst 
mal Ausgang sein soll. Gleichzeitig gehts über einen weiteren TRI-Buffer 
auf den Eingangspin, damit ich das, was im Flipflop gespeichert ist, 
wieder zurücklesen kann.
Ich bringe es aber auf keinste Weise fertig, dass mir der 
Quartus-Simulator am Ausgang Daten anzeigt. Egal wie ich welche Signale 
ansteuere - nichts klappt.

Übrigens mache ich mir diese Mühe darum, weil ich keine Octal 
D-Flipflops mit Clear gefunden habe, die sich auch wieder zurücklesen 
lassen. Wollte ich das mit diskreter Logik aufbauen bräuchte es jeweils 
einen 74HC273 und einen 74HC541, was zu mühsam ist. Gibts evtl eine 
Alternative?

Grüsse
    Tobias

von Sag ich nicht :) (Gast)


Lesenswert?

Ist es nicht einfacher ein Pin anstatt OUT als BUFFER definieren???

von Tobias P. (hubertus)


Lesenswert?

What?
Ich versteh nicht was du meinst.

von Falk B. (falk)


Lesenswert?

@ Tobias Plüss (hubertus)

>Ich will für ein Mikroprozessorboard einen simplen Peripheriebaustein
>machen, und zwar aus einem MAX7000S-CPLD. Vorerst sollen es einfach ein
>paar Latches sein, die jedoch zurücklesbar sind. Theoretisch könnte man

Sagen wir lieber Register. Latches sind ein Reizwort.

>ja gewöhnliche 8 Bit D-Flipflops nehmen, ist aber hässlich weil das dann
>write-only Ports sind.

???

> Dann will ich die Ports gleich auch noch als
> Eingang oder Ausgang konfigurieen.

Ja und?

>Bis jetzt bin ich aber nicht über die Bidirektionalen Pins für den
>Datenbus gekommen. Ich hab keine Ahnung, wie man das in Quartus macht -
>es funktioniert einfach nie zum simulieren! Zum Test habe ich das so
>gemacht:

>Ein D-Flipflop ist mit dem D-Eingang an einem BIDIR-Pin angeschlossen.
>Der Q-Ausgang geht über einen TRI-Buffer auf den BIDIR-Pin, welcher erst
>mal Ausgang sein soll. Gleichzeitig gehts über einen weiteren TRI-Buffer
>auf den Eingangspin, damit ich das, was im Flipflop gespeichert ist,
>wieder zurücklesen kann.

Ein Bild sagt mehr als tausend Worte.

>Ich bringe es aber auf keinste Weise fertig, dass mir der
>Quartus-Simulator am Ausgang Daten anzeigt. Egal wie ich welche Signale
>ansteuere - nichts klappt.

>Übrigens mache ich mir diese Mühe darum, weil ich keine Octal
>D-Flipflops mit Clear gefunden habe, die sich auch wieder zurücklesen
>lassen. Wollte ich das mit diskreter Logik aufbauen bräuchte es jeweils
>einen 74HC273 und einen 74HC541, was zu mühsam ist. Gibts evtl eine
>Alternative?

Ja, umdenken. Die 74xx sind für einen CPLD egal. Nimm elementare 
Bausteine, die du für die Aufgabe brauchst.

8 D-FlipFlops
8 Tristate Treiber
bissel Logik

Über CS und RD vom Mikrocontroller wird der Tristatetreiber gesteuert, 
über den dein Register rücklesbar die Daten auf den Datenbus schreibt.
Über CS und WR wird der Schreibvorgang in die FlipFlops gesteuert. Das 
wars.

MFG
Falk

von Tobias P. (hubertus)


Lesenswert?

@Falk:
Ja ich weiss.
Schau mal:
Ich könnte an den Dazenbus des Microprocessors 74HC273 Flipflops hängen. 
Wenn WR und CS aktiviert wird, wird dann ein Byte in diesem FF 
gespeichert und ausgegeben. Die Ausgegebenen Daten kann ich aber ohne 
Zusatzaufwand nicht zurücklesen - deshalb meine Frage.
Ich hab das so aufgebaut wie dus sagst - meiner Meinung nach sollte es 
Funktionieren, aber in Quartus klappt es mit der Simulation nicht. 
Deshalb frage ich hier nach. Bild poste ich wenn ich zu Hause bin, jetzt 
habe ich keinen Zugriff darauf.

von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

So hier jetzt mal mein Schema.
Was die Schaltung tun soll:
Der Prozessor legt Daten am Pin "DATA" an. Danach aktiviert er WR und 
deaktiviert es wieder - das D-Flipflop (oder Register ;) btw: warum ist 
Latch kein gutes Wort?) speichert nun dieses Datenbit.
Vorausgesetzt nun, dass der Pin I/O auf High ist, werden die Daten nun 
auch an den Ausgangspin getrieben. Mit dem Pin "I/O" kann man also 
steuern, ob der Pin Eingang oder Ausgang sein soll. Nun - wenn der 
Prozessor jetzt den Pin RD auf Low zieht, so werden die Daten, welche am 
Pin anliegen, auf den "DATA" getrieben - der Prozessor führt jetzt also 
einen "read pin" aus. Dadurch sind mit dieser Schaltung zwei Dinge 
möglich:

man kann einen Pin als Ein-/Ausgang schalten
man kann auf einen Pin einen Wert ausgeben, aber nur wenn der Pin auch 
als Ausgang konfiguriert wird

und der Prozessor kann den an einem Pin anliegenden Wert zurücklesen.

Nun in meiner Theorie funktioniert das wunderbar, aber kann mir jemand 
mal erklären was ich in der Simulation falsch mache? Die DATA und Q Pins 
sind immer HiZ.

Übrigens will ich VHDL lernen - wenn also jemand sowas in VHDL schon mal 
gemacht hat wäre ich interessiert.

Grüsse
      Tobias

von Falk B. (falk)


Lesenswert?

@ Tobias Plüss (hubertus)

>Dateianhang: bin.jpg (144,7 KB, 0 Downloads)

Bildformate

>Der Prozessor legt Daten am Pin "DATA" an. Danach aktiviert er WR und
>deaktiviert es wieder - das D-Flipflop (oder Register ;) btw: warum ist
>Latch kein gutes Wort?) speichert nun dieses Datenbit.

Latch

>Vorausgesetzt nun, dass der Pin I/O auf High ist, werden die Daten nun
>auch an den Ausgangspin getrieben. Mit dem Pin "I/O" kann man also
>steuern, ob der Pin Eingang oder Ausgang sein soll. Nun - wenn der
>Prozessor jetzt den Pin RD auf Low zieht, so werden die Daten, welche am
>Pin anliegen, auf den "DATA" getrieben - der Prozessor führt jetzt also
>einen "read pin" aus. Dadurch sind mit dieser Schaltung zwei Dinge
>möglich:

Deine Schaltung sieht erstmal gut aus. Sinnvollerweise wird dein SIgnal 
I/O auch von einem Register gespeist. Vergleichbar mit den DDRx Register 
der AVR Controller.

>Nun in meiner Theorie funktioniert das wunderbar, aber kann mir jemand
>mal erklären was ich in der Simulation falsch mache? Die DATA und Q Pins
>sind immer HiZ.

Keine Ahnung, kenn mich mit dem Quartus-Simulator nicht aus.

>Übrigens will ich VHDL lernen - wenn also jemand sowas in VHDL schon mal
>gemacht hat wäre ich interessiert.
1
-- Schreibzugriff
2
3
process(n_wr, n_cs)
4
begin
5
  if rising_edge(n_wr) then
6
    if n_cs='0' then
7
      my_register <= data_bus;
8
    end if;
9
  end if;
10
end process;
11
12
-- Lesezugriff
13
14
process(n_rd, n_cs)
15
begin
16
  if n_cs='0' and n_rd='0' then
17
    data_bus <= my_register;
18
  else
19
    data_bus <= "ZZZZZZZZ";
20
  end if;
21
end process;
22
23
-- Richtungsumschaltung
24
25
  my_io <= my_register when my_dir='1' else "ZZZZZZZZ";

So in etwa.

MFG
Falk

von Tobias P. (hubertus)


Lesenswert?

@Falk:
Danke erstmal für deine Hilfe.

1. Warum hast du mir den Link zu den Bildformaten gepostet? Es ist ein 
jpg. Das sollte völlig okay sein.

2. Okay das mit dem Latch wusste ich nicht - allerdings scheint mir in 
diesem Fall hier die Funktion von einem Latch und einem Flipflop die 
gleiche zu sein ;) Aber gut. Wieder was dazugelernt ;) Latch möglichst 
vermeiden.

3. Danke für deinen VHDL-Code (das nennt man doch Code, oder? Oder 
"Beschrieb" ? Denn er beschreibt ja was ;)) Ich  teste den morgen aus. 
Nachher muss ich nämlich noch weg, deshalb kann ich mir der Thematik 
hier grade nicht weiter widmen, aber morgen ist ja Wochenende ;)

Euch einen schönen Abend,
Grüsse
Tobias

von Falk B. (falk)


Lesenswert?

@ Tobias Plüss (hubertus)

>1. Warum hast du mir den Link zu den Bildformaten gepostet? Es ist ein
>jpg. Das sollte völlig okay sein.

Lies den Artikel nochmal.

>2. Okay das mit dem Latch wusste ich nicht - allerdings scheint mir in
>diesem Fall hier die Funktion von einem Latch und einem Flipflop die
>gleiche zu sein ;) Aber gut. Wieder was dazugelernt ;) Latch möglichst
>vermeiden.

Ja.

>3. Danke für deinen VHDL-Code (das nennt man doch Code, oder? Oder

Ja, nomaler Quelltext, Sourcecode, whatever.

MFG
Falk

von Peter (Gast)


Lesenswert?

@  Sag ich nicht:
Buffer die nach außen gehen sollten ;)?


@ Tobias:
Es geht auch ohne Process direkt in der arch.

Ich empfehle dir noch eine Zusatzleitung als Enable-Signal, wirst später 
sehen, dass man die benutzen sollte :)


In der Entity deklarierst du die leitung als inout:
WR  : in STD_LOGIC;
ENA : in STD_LOGIC;
data_bus_io : inout  STD_LOGIC_VECTOR(7 downto 0);
...
...
...
Erstell dir 2 weitere interne Signale:
signal data_bus_in  : std_logic_vector(7 downto 0);
signal data_bus_out  : std_logic_vector(7 downto 0);
...
...
data_bus_io <= data_bus_out when (WR='0') and (ENA='1') else (others => 
'Z');
data_bus_in <= data_bus_io  when (WR='1') and (ENA='1') else (others => 
'Z');

Jetzt muss du beide interne Signale mit deinem Kommunikationsmodul oder 
was auch immer verbinden und je nach Lage der WR Leitung Daten schreiben 
oder lesen.

Wenn du was nicht verstanden hast, hilft dir Falk sicherlich gerne 
weiter, er hat da bestimmt mehr Ahnung und Erfahrung als ich.

von Tobias P. (hubertus)


Lesenswert?

Danke Peter.
Ich bin grade am Überlegen, wie man ein Register definiert... Ich hab in 
VHDL bis jetz höchstens einfache Logik gemacht ;) Register sind da was 
ganz neues...

von Falk B. (falk)


Lesenswert?

@ Tobias Plüss (hubertus)

>Ich bin grade am Überlegen, wie man ein Register definiert... Ich hab in
>VHDL bis jetz höchstens einfache Logik gemacht ;) Register sind da was
>ganz neues...

Der Schreibprozess definiert ein Register.

MFG
Falk

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

Schaue dir die Beispiele an, da wird z.B. beschrieben, wie man ROMs etc. 
realisiert. Ich weiß nicht, ob die Altera Software eine VHDL 
Beschreibung in RAMs o.ä umsetzt. Bei ISE kann man entweder die 
Primitiven nutzen, oder wenn die Busbreite stimmt, setzt die Synthese 
dein Speichermodel in automatisch in ein RAM um.

von Tobias P. (hubertus)


Lesenswert?

Hallo Peter,
ich beabsichtige das ganze zuerst mal in einem relativ simplen CPLD zu 
machen (Max7000S von Altera).
Mit FPGAs habe ich leider 0 Erfahrung, und ausserdem sind die, soweit 
ich weiss, nicht für 5V Betrieb ausgelegt. Mein Prozi ist aber 5V. und 
ich bin nicht unbedingt gewillt, für jedes Signal einen Level Converter 
einzusetzen ;) Aber schön wäre es wenn man dafür einen Spartan II oder 
so nehmen könnte. Die liegen bei uns in der Firma massenhaft rum und man 
könnte sicherlich ein paar davon haben ;)

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.