Forum: FPGA, VHDL & Co. große NOR-Gatter aus viele kleinen zusammensetzen


von Michael S. (stroggi)


Lesenswert?

Hi zusammen,

ich habe ein eher seltsames Problem, auf welches ich keine Lösung finde.
Ich habe einen Schaltplan einer CPU von anno dazumal vorliegen, welche 
in RTL aufgebaut wurde, also als Resistor-Transistor-Logic. Die 
komplette Schaltung besteht aus NOR-Gattern (je 3 Inputs). Nun war es 
damals wohl üblich sich große NOR-Gatter dadurch zu bauen, dass man 
einfach die Ausgänge von mehreren NOR-Gattern mit einer Leitung 
zusammengeschaltet hat und schwupps hatte man ein NOR-Gatter, welches 
mal so um die 30 Eingänge hat.

Ich möchte nun diese Schaltung in Verilog oder VHDL beschreiben, aber 
das mit dem mehrere Ausgänge zusammenschalten funktioniert ja defacto 
nicht. Habt ihr da eine Idee wie ich das Problem lösen kann?

Noch als Nachtrag: Die Schaltung erstreckt sich über mehrere Seiten und 
manche Gatter werden über mehrere Seiten auch miteinander verbunden 
(also deren Ausgänge), daher ist nicht immer sofort ersichtlich welche 
Gatter mit welchen ein großes Gatter aufbauen.

Viele Grüße
Michael

von D. I. (Gast)


Lesenswert?

1
constant SIZE : integer := 8;
2
signal nor_input : std_logic_vector(SIZE-1 downto 0) := (others => '0');
3
signal nor_output : std_logic;
4
5
process(nor_input)
6
  variable temp : std_logic;
7
begin
8
  temp := nor_input(SIZE-1);
9
  for i in range SIZE-2 downto 0 loop
10
    temp := temp nor nor_input(i);
11
  end loop;
12
  nor_output <= temp;
13
end process;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Michael Strosche schrieb:
> Habt ihr da eine Idee wie ich das Problem lösen kann?
Die Lösung von D. I. ist ein generisches nor Gatter. Das hilft dir (mal 
abgesehen von der Verwendung fortgeschrittener VHDL-Techniken) leider 
erst mal nicht weiter...  :-/

Aber man kann sagen: beschreib einfach ein beliebig breites NOR-Gatter, 
auf das alle die verwendeten Eingänge draufgehen:
1
  ergebnis <= signal4 nor adresse0 nor daten3 nor control6 nor input1 ... ;

> Noch als Nachtrag: ...
Dieses Problem wirst du mit einem Textmarker lösen müssen. Das ist 
schlichte Han- und Recherchearbeit...

von Claus (Gast)


Lesenswert?

Lothar Miller schrieb:
> Aber man kann sagen: beschreib einfach ein beliebig breites NOR-Gatter,
> auf das alle die verwendeten Eingänge draufgehen:  ergebnis <= signal4 nor 
adresse0 nor daten3 nor control6 nor input1 ... ;

Ist das denn richtig? Am Beispiel eine 3-Input NOR Gatters:
1
   NOR_out <= NOR_IN(2) nor NOR_IN(1) nor NOR_IN(0);
Wenn nun NOR_IN <= "010" dann sollte NOR_out doch '0' sein.
Zur Verdeutlichung:
1
   NOR_out <= '0' nor '1' nor '0';
gleichbedeutetend mit:
1
   NOR_out <= ('0' nor '1') nor '0';
ergibt:
1
   NOR_out <= ('0') nor '0';
ergibt:
1
   NOR_out <= '1';
Korrekt wäre meines Erachtens:
1
   NOR_out <= not ( NOR_IN(2) or NOR_IN(1) or NOR_IN(0) );

von Harald F. (hfl)


Lesenswert?

Der Vollständigkeit halber: In Verilog gibt es für solche wired-and und 
wired-or Schaltungen passende Datentypen. Da darf man dann auch 
Gatterausgänge zusammenschalten, ohne dass es einen Signalkonflikt gibt.

---(snip)---
wire    x;  // normales Signal
wor     y;  // wired-or Signal

nor (x, a, b);  //
nor (x, c, d);  // normales Signal an zwei Gatter angeschlossen

nor (y, a, b);  //
nor (y, c, d);  // wired-or Signal an zwei Gatter angeschlossen
---(snap)---

Da das Signal x vom Typ wire ist, wird die Zusammenlegung der beiden 
nor-Gatter auf das gemeinsame Signal x einen Konflikt erzeugen. Beim 
Signal y (Datentyp wor) ist das hingegen erlaubt. Allerdings ist so 
etwas nicht synthetisierbar.

Nachtrag: Zum Glück habe ich das mal eben Altera Quartus zu Fraß 
vorgeworfen, uns siehe da: Quartus nimmt das klaglos an! Also die 
Modellierung des Signals y, wohlgemerkt. Beim Signal x beklagt Quartus, 
dass zwei Gatter das Signal treiben. Aber beim Signal y ist ok! Wieder 
was gelernt!

Grüße,
Harald

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Claus schrieb:
> Korrekt wäre meines Erachtens: ...
Das sieht plausibel aus... ;-)
Zudem geht mein Vorschlag so gar nicht, weil der Operator NOR nur 2 
Operatoren zulässt. Man müsste es also Klammern wie du es gemacht hat...

Harald Flügel schrieb:
> Der Vollständigkeit halber: In Verilog gibt es für solche wired-and und
> wired-or Schaltungen passende Datentypen. Da darf man dann auch
> Gatterausgänge zusammenschalten, ohne dass es einen Signalkonflikt gibt.
Ich sehe hier aber das Problem, dass das wor dann nur noch ein reines 
Gedankenexperiment für "alte Hasen" oder "ASIC-Programmierer" ist. Denn 
solche Komponenten gibt es zumindest auf FPGAs schon seit gut 15 Jahren 
nicht mehr...

von Lattice User (Gast)


Lesenswert?

Mal ganz langsam:

Hier ist erst mal zu klären was das viel input RTL NOR überhaupt macht.

Ich gehe jede Wette ein sobald einer der vielen Eingänge auf high ist, 
ist der Ausgang low ist.

Das wäre dann folgendes:

Claus schrieb:
> Korrekt wäre meines Erachtens:   NOR_out <= not ( NOR_IN(2) or NOR_IN(1) or 
NOR_IN(0) );

von Lattice User (Gast)


Lesenswert?

Nachtrag:

In RTL ist das NOR das Basisgatter, es besteht pro Input aus einem 
Transistor, deren Collectoren alle auf den gleichen Pullup gehen. Das 
ist beliebig skalierbar (natürlich unter Beachtung von 
Leitunslängen/Kapazitäten).

Im modernen Sprachgebrauch ist das sowas wie "Open Drain Logik".

von Harald F. (hfl)


Lesenswert?

Lothar Miller schrieb zum Thema Modellierung mit Datentyp wor:

> Ich sehe hier aber das Problem, dass das wor dann nur noch ein reines
> Gedankenexperiment für "alte Hasen" oder "ASIC-Programmierer" ist. Denn
> solche Komponenten gibt es zumindest auf FPGAs schon seit gut 15 Jahren
> nicht mehr...

Gut erkannt Lothar, Logikelemente mit wired-or oder wired-and gibt es in 
den aktuellen FPGAs nicht. Aber Quartus unterstützt Verilog ziemlich 
gut, und der Datentyp wor ist nunmal Verilog Standard, und daher rechnet 
Quartus das Modell in eine entsprechende Lösung auf Basis der 
verfügbaren Logikelemente um. Wie gesagt, hab's getestet, siehe Beitrag 
von vorhin.

Grüße,
Harald

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Michael Strosche schrieb:
> Nun war es
> damals wohl üblich sich große NOR-Gatter dadurch zu bauen, dass man
> einfach die Ausgänge von mehreren NOR-Gattern mit einer Leitung
> zusammengeschaltet hat

Du musst dir die Funktion für das Zusammenschalten der Ausgänge (z.B. X1 
und X0) aufstellen.

X1 X0 | Y
=========
0  0  | 0
0  1  | 0
1  0  | 0
1  1  | 1

Mit anderen Worten, das Zusammenschalten der Ausgänge verhält sich wie 
ein AND. Jeden dieser Knoten ersetzt du durch ein AND. Irgendwo würde 
ich aber schon noch Register einbauen, ist ja ein FPGA. Der will das.

Tom

von Michael S. (stroggi)


Lesenswert?

Danke für die vielen schnellen Antworten.

Thomas Reinemann schrieb:
> X1 X0 | Y
> =========
> 0  0  | 0
> 0  1  | 0
> 1  0  | 0
> 1  1  | 1
>
> Mit anderen Worten, das Zusammenschalten der Ausgänge verhält sich wie
> ein AND.

Nein, das ist nicht der Fall. Ein NOR-Gatter ist in RTL-Technik 
tatsächlich so aufgebaut wie es Lattice User beschrieben hat. Siehe dazu 
das hier: 
http://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/RTL_Nor_000.svg/283px-RTL_Nor_000.svg.png
Dadurch kann man dann tatsächlich sehr große Gatter aus vielen kleinen 
(räumlich verteilten) zusammensetzen.

Harald Flügel schrieb:
> Lothar Miller schrieb zum Thema Modellierung mit Datentyp wor:
>
>> Ich sehe hier aber das Problem, dass das wor dann nur noch ein reines
>> Gedankenexperiment für "alte Hasen" oder "ASIC-Programmierer" ist. Denn
>> solche Komponenten gibt es zumindest auf FPGAs schon seit gut 15 Jahren
>> nicht mehr...
>
> Gut erkannt Lothar, Logikelemente mit wired-or oder wired-and gibt es in
> den aktuellen FPGAs nicht. Aber Quartus unterstützt Verilog ziemlich
> gut, und der Datentyp wor ist nunmal Verilog Standard, und daher rechnet
> Quartus das Modell in eine entsprechende Lösung auf Basis der
> verfügbaren Logikelemente um. Wie gesagt, hab's getestet, siehe Beitrag
> von vorhin.
>
> Grüße,
> Harald

Das mit dem wired or war mir bislang entgangen. Werde das bei 
Gelegenheit mal ausprobieren, da ich momentan keinen FPGA vor mir liegen 
hab. Ich hoff einfach mal, dass die Software von Actel, von denen ich 
ein Evaluationboard hier hab, das auch so gut umsetzt wie die von 
Quartus.

Viele Grüße
Michael

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
> (mal abgesehen von der Verwendung fortgeschrittener VHDL-Techniken)

Ungetestet, aber das sollte gehen, oder?
1
function nor_reduce (a : std_logic_vector) return std_logic is
2
begin
3
  if (a = (a'range => '0')) then
4
    return '1';
5
  else
6
    return '0';
7
  end if;
8
end function nor_reduce;

>   ergebnis <= signal4 nor adresse0 nor daten3 nor control6 nor input1
1
ergebnis <= nor_reduce(signal4 & adresse0 & daten3 & control6 & input1);

In Verilog würde man (ohne wor und ähnlichem) entsprechend schreiben:
1
ergebnis <= ~|{signal4, adresse0, daten3, control6, input1};

Gruß
Marcus

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Michael Strosche schrieb:
>> Mit anderen Worten, das Zusammenschalten der Ausgänge verhält sich wie
>> ein AND.
>
> Nein, das ist nicht der Fall. Ein NOR-Gatter ist in RTL-Technik
> tatsächlich so aufgebaut wie es Lattice User beschrieben hat. Siehe dazu
> das hier:

Die Funktion soll nicht ein NOR-Gatter beschreiben, sondern den Fall, 
wenn die Ausgänge von zwei NOR-Gattern einfach verbunden werden. Dafür 
brauchst du eine Resolutionfunktion, um es in VHDL beschreiben zu 
können.

Tom

von Michael S. (stroggi)


Lesenswert?

Thomas Reinemann schrieb:
> Michael Strosche schrieb:
>>> Mit anderen Worten, das Zusammenschalten der Ausgänge verhält sich wie
>>> ein AND.
>>
>> Nein, das ist nicht der Fall. Ein NOR-Gatter ist in RTL-Technik
>> tatsächlich so aufgebaut wie es Lattice User beschrieben hat. Siehe dazu
>> das hier:
>
> Die Funktion soll nicht ein NOR-Gatter beschreiben, sondern den Fall,
> wenn die Ausgänge von zwei NOR-Gattern einfach verbunden werden. Dafür
> brauchst du eine Resolutionfunktion, um es in VHDL beschreiben zu
> können.
>
> Tom

Ja. Sry, da hab ich wieder schneller geschrieben als gedacht. Ist 
natürlich korrekt.

von (prx) A. K. (prx)


Lesenswert?

Michael Strosche schrieb:

> Die komplette Schaltung besteht aus NOR-Gattern (je 3 Inputs).

Willst du den Apollo AGC nachbauen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

Marcus Harnisch schrieb:
> Ungetestet, aber das sollte gehen, oder
Ja. Das tut es... ;-)

von Lattice User (Gast)


Lesenswert?

A. K. schrieb:
> Michael Strosche schrieb:
>
>> Die komplette Schaltung besteht aus NOR-Gattern (je 3 Inputs).
>
> Willst du den Apollo AGC nachbauen?

Das wäre dann das hier:

http://klabs.org/history/ech/agc_schematics/index.htm

Und hier das IC:
http://klabs.org/history/ech/agc_schematics/logic/5011-1.jpg

Pro Baustein 2 3 fach NOR, wobei bei einem davon der Pullup optional 
ist.

Der Grundbaustein hat 10 pins, könnte man mit einem kleinen SMD Module 
nachbauen und dann das ganze stilecht auf einem Steckbrett verdrahten 
:-)

von Michael S. (stroggi)


Lesenswert?

A. K. schrieb:
> Michael Strosche schrieb:
>
>> Die komplette Schaltung besteht aus NOR-Gattern (je 3 Inputs).
>
> Willst du den Apollo AGC nachbauen?

Ertappt...
Ja, hatte vor den AGC "nachzubauen". Die Idee das als physikalischen 
Nachbau zu veranschlagen hatte ich auch schon, aber das war mir dann 
doch zu aufwändig und zu teuer. Und da ich sowieso einen FPGA hier 
rumfliegen hab wollte ich das mal damit ausprobieren. Ma schauen obs da 
draufpasst.

Leider konnte ich das mit dem wor und der Synthetisierung auf Actel 
FPGAs noch nicht testen, da mein Rechner da momentan zu sehr rumzickte, 
aber das sollte ja dann unter Verilog klappen.

Viele Grüße
Michael

von lkmiller (Gast)


Lesenswert?

Viel Spass damit, so ein streng asynchrones Design auf einem FPGA 
nachzubauen...  ;-)

von Lattice User (Gast)


Lesenswert?

lkmiller schrieb:
> Viel Spass damit, so ein streng asynchrones Design auf einem FPGA
> nachzubauen...  ;-)

Man könnte versuchen jedes der 3-Input-NORs mit einem Ausgangs FF 
versehen.
Der FPGA Takt emuliert dann die Gatterlaufzeit des ursprünglichen 
Design.

Ausserdem sollte man der Synthese jegliche Optimierung verbieten.

von Michael S. (stroggi)


Lesenswert?

So. Konnte nun endlich das Verknüpfen zweier, bzw. mehrere (6 Stück) 
NOR-Gatter testen.
Die Software von Actel (bzw. seit neustem Microsemi) hat die 
Verilogbeschreibung mit einem "wand" exakt umgesetzt und auch die 
Synthese im FPGA hat einwandfrei funktioniert.
1
  wand test;
2
  assign LED[0] = test;
3
  nor( test, PB_SW[0], PB_SW[1] );
4
  nor( test, PB_SW[2], PB_SW[3] );
5
  nor( test, DIP_SW[0], DIP_SW[1] );
6
  nor( test, DIP_SW[2], DIP_SW[3] );
7
  nor( test, DIP_SW[4], DIP_SW[5] );
8
  nor( test, DIP_SW[6], DIP_SW[7] );

Danke für eure Hilfe!

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.