Forum: FPGA, VHDL & Co. interne Chip-Select-Signale erzeugen


von Maik Meier (Gast)


Lesenswert?

Hallo, hab folgendes Problem: Ich versuche gerade einen CPLD von Altera
(EPM7064) als Adressdekoder zu programmieren (mit Quartus II), d. h.
ich erzeuge mehrere Chip-Select-Signale für interne und externe
I/O-Peripherie aus einer 24-Bit-Adresse. Wie bekomm ich es in VHDL hin,
dass ein internes CS-Signal wirklich erzeugt wird (in einer Makrozelle)
und dann in die anderen Makrozellen geführt wird? Momentan ist es so,
dass alle 24 Adressleitungen in jede Makrozelle geführt werden, die das
CS-Signal benötigen, es wird also weg-optimiert. Das ist zwar schneller,
da eine Gatterstufe umgangen wird, nur hab ich dabei das Problem, dass
der Global Routing Pool dafür nicht genug Resourcen hat!

von Jörn (Gast)


Lesenswert?

Wieviele CS erzeugst du mit den Adressleitungen. Wie viele
Adressleitungen brauchst du, um deine Peripherie zu adressieren?

von Maik Meier (Gast)


Lesenswert?

Ich benötige 4 CS-Signale (2 extern: LCD,1MB RAM;  2 intern: 8-Bit
Ausgangsport, 8-Bit Eingangsport). Prinzipiell bräuchte ich nicht die
kompletten 24 Adressleitungen, aber trotzdem immer noch so viele, dass
es für den Herrn PLD zuviel ist alle diese Leitungen in jede der 16
Makrozellen der 2 Ein- und Ausgangsports zu führen. Wie sage ich dem
Quartus-Compiler, dass er doch bitte das Signal CS_OUTPORT intern real
erzeugen und dieses in die Ausgangsport-Makrozellen führen soll?
Momentan optimiert er das von mir angelegte Signal CS_OUTPORT einfach
weg, es existiert intern nicht wirklich und genau das möchte ich
ändern. Muss ja irgendwie gehen, weil kann mich erinnern, dass das mit
ABEL auch irgendwie möglich war.

von Maik Meier (Gast)


Lesenswert?

Hab es auch schon mit dem Assignment: "Implement as Output of Logic
Cell" probiert, die Erläuterung dieses Assignments sagt eigentlich
genau das aus, was ich haben will. Funktioniert aber trotzdem nicht!
Hat es vielleicht etwas mit meiner kostenlosen Lizens zu tun? Er meldet
mir ständig: "Warning: Feature Netlist Optimizations is not available
with your current license"

von Jörn (Gast)


Lesenswert?

kannst du mal deinen Code posten?

von Maik Meier (Gast)


Angehängte Dateien:

Lesenswert?

der Source als Anhang

von Jörn (Gast)


Lesenswert?

Wie sieht denn deine Memory Map aus? Wenn ich deinen Code richtig
verstehe, generierst du aus den unteren Adressleitungen deine CSs,
oder?

von Maik Meier (Gast)


Lesenswert?

Naja nee, momentan benutz ich einen 128kB Speicher, ich brauche also 17
Adressleitungen um diesen voll ansprechen zu können. Die 24-Bit-Adresse
wird im Multiplexverfahren übertragen: (Adress-Low-Byte + Datenbus) und
(Adress-High-Byte + Adress-Middlebyte) werden auf denselben 16
Signalleitungen übertragen (80C51-Microcontroller). Das Adress-Low-Byte
und das 17.Adressbit werden gelatcht. Aus der 17 Bit-Adresse dekodiere
ich die CS-Signale, damit so wenig wie möglich Speicherbereich des RAMs
 unbenutzt bleibt. Ich könnte auch aus weniger Adressleitungen (z.B.:8)
die CS erzeugen, aber umso mehr RAM-Speicher geht mir dabei verloren.
Kein Problem, aber mir gehts jetz ums Prinzip. Das muss doch irgendwie
möglich sein diese CS-Nodes fest erzeugen zu lassen? Weißt du wie das
geht?

von Jörn (Gast)


Lesenswert?

Im CPLD hast du die 24 Bit breite Adresse.

signal addr_int : std_logic_vector(23 downto 0);
signal mem_seg  : std_logic_vector(3 downto 0);

für ein 1MB RAM brauchst du 20 Bit -> 4 Bit für Speichersegmentierung.

mem_seg<=addr_int(23 downto 20);

cs_ram<='0' when mem_seg=B"0000" else '1';
cs_lcd<='0' when mem_seg=B"0001" else '1';
cs_outport<='0' when mem_seg=B"0010" else '1';
cs_inport<='0' when mem_seg=B"0011" else '1';
cs_ctrl<='0' when mem_seg=B"0100" else '1';

alle CS Prozesse sind nebenläufig.
Du hast bei deiner Beschreibung noch einen Prioritätencoder durch die
"elsif" Verzweigungen eingebaut .

von Maik Meier (Gast)


Lesenswert?

so einfach is das leider nich, weil ich leider nur 16-Bit-Adressen
ausgeben kann (mehr unterstützt meine Version des Keil C-Compilers
nicht) Ich kann also sowieso nur 64k des Speichers (128k groß, 1MB war
nur als maximal Mögliches gemeint) ansprechen. Ich hab also keine 4 Bit
übrig, so wie in deinem Beispiel. Das mit dem Prioritätenencoder stimmt
nich so ganz. Das träfe nur zu, wenn einzelne Bedingungen gleichzeitig
auftauchen könnten, können sie aber nicht, damit ist es dasselbe wie
bei deinem Code (nur etwas umständlicher wie ich feststellen muss :)
Trotzdem, danke für deine Hilfe, aber ich suche eher eine Möglichkeit
Signale fest zu erzeugen (z.B. auch für Hardware Tests (Auslesen
einzelner Signale über JTAG)) als jetzt irgendwie die Adressdekodierung
anders zu gestalten.

von Jörn (Gast)


Angehängte Dateien:

Lesenswert?

Weis das Synthesewerkzeug, dass die Signale nicht gleichzeitig auftreten
können? Wohl kaum. Deswegen wird die resultieren Schaltung
unterschiedlich aussehen.

Was verstehst du unter "Signal fest erzeugen"?

Ich deinen Code etwas abgeändert. Funktion müßte die gleiche sein.

von Maik Meier (Gast)


Lesenswert?

Was verstehst du unter "Signal fest erzeugen"?

Ich dachte eigentlich, dass ich das nun ausführlichst beschrieben habe.
Ich habe einen 8-Bit-Ausgangsport programmiert. Für jedes Ausgangs-Bit
wird intern eine Makrozelle benötigt. In jede dieser Makrozellen sollen
nur jeweils 3 Signale geführt werden: CS_OUTPORT,WR und das
entsprechende Daten-Bit vom Datenbus, damit wäre der
Verdrahtungsaufwand intern sehr gering. Aber genau das macht er nicht,
er versucht 19 Signale in jede Makrozelle zu führen: WR, Daten-Bit und
alle 17 Adressleitungen, d.h. er erzeugt das CS_OUTPORT in JEDER
Makrozelle, die es benötigt. Ich will aber, dass das CS_OUTPORT nur in
einer Makrozelle, erzeugt wird und dann als Eingangssignal für alle
anderen Makrozellen zur Verfügung steht. Das Signal CS_OUTPORT, welches
ich in der architecture angelegt habe existiert intern also nicht
wirklich, die einzige Möglichkeit, die ich momentan kenne, um es
wirklich zu erzeugen ist, dieses Signal auf einen Ausgangspin zu legen,
damit MUSS es ja als Ausgang einer Makrozelle zur Verfügung stehen.

von Jörn (Gast)


Lesenswert?

Okay, habs verstanden.

Was für ein Package hat dein EPM7064?

Wo hast du in Quartus gehen, dass an jede Makrozelle deine 24 Adressen
gehen?

von Maik Meier (Gast)


Lesenswert?

100 pin quad flat pack

Ich hab mir einfach die analysis & Synthesis equations angeschaut, da
kann man ja sehen, was in jeder einzelnen Makrozelle passiert.

Momentan funktioniert das Programm ja noch, aber eben gerade so. Sobald
ich noch versuche, irgendeine neue Funktion zu implementieren, meldet er
mir beim Fitten, dass er es nicht mehr verdrahtet bekommt. Bei dem bissl
Logik können oder sollten doch nicht alle Resourcen verbraucht sein.

von Jörn (Gast)


Lesenswert?

Ich glaube ich weis jetzt, warum er die ganzen Adresse benötigt. Das
liegt an dem Adressdecodierung:

Du vergleicht ja immer adr16_0=B"0" & adr16_0="FFFF"

für den letzen Vergleich braucht er die 16 Adressleitungen. Ich habs
etwas abgeändert.

von Jörn (Gast)


Angehängte Dateien:

Lesenswert?

Datei

von Maik Meier (Gast)


Lesenswert?

Nee, Nee, danke für deine Hilfe, aber so funktioniert das nicht. Das RAM
kann ich nur im unteren 64k Bereich ansprechen. Die Zeile: cs_ram
<='0' when adr16_0(16)='1' else '1'; geht nicht, da ich momentan
den oberen 64 k Bereich nicht anprechen kann, d.h. adr16_0(16) ist
immer 0. Ich bin darauf angewiesen, die I/O in den unteren 64k-Bereich
zu mappen. Je nachdem wieviel obere Bits (z.B.: adr16_0(15 downto 8)
ich für die CS-Dekodierung benutze, desto mehr oder weniger RAM geht
mir verloren. Wie gesagt, danke für die Hilfe, aber du kannst mir nich
weiterhelfen. Das muss ein spezielles Assignment sein, mit dem der der
CS-Node vorm "Weg-Optimieren" geschützt werden kann.

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.