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!
Wieviele CS erzeugst du mit den Adressleitungen. Wie viele Adressleitungen brauchst du, um deine Peripherie zu adressieren?
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.
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"
Wie sieht denn deine Memory Map aus? Wenn ich deinen Code richtig verstehe, generierst du aus den unteren Adressleitungen deine CSs, oder?
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?
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 .
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.
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.
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.
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.