mikrocontroller.net

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


Autor: Maik Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Jörn (Gast)
Datum:

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

Autor: Maik Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Maik Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kannst du mal deinen Code posten?

Autor: Maik Meier (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
der Source als Anhang

Autor: Jörn (Gast)
Datum:

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

Autor: Maik Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 .

Autor: Maik Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörn (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Maik Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Maik Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörn (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Datei

Autor: Maik Meier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.