Hallo Leute, ich habe ein kleines Problem das für euch vielleicht ganz einfach zu lösen ist. Die Frage dreht sich um den angehängten C Code, ich beschreibe als Erklärung schnell das gesamte Projekt. Die Situation ist diese: Ich versuche gerade, einen 8051 IPCore auf einem Actel Fusion FS600 FPGA zum laufen zu bekommen. Der IPCore wird von Actel kostenlos angeboten und implementiert einen Standard 8051. Als Komponenten werden neben dem 8051 noch ein ROM mit 4kb und ein 128Byte RAM instanziert. Das Design sieht so aus: Ein Zähler zählt mit einem Takt von 1Hz von 0 bis 230, die Zahl wird auf einem LCD Display ausgegeben. Parallel dazu wird der 8051 mit ROM und RAM instanziert und soll mit einem einfachen C Programm (siehe Anhang) ebenfalls zählen (1..128). Der 8051 ist mit 10MHz getaktet. Wird ein Knopf auf dem Demoboard gedrückt, zeigt das LCD den Zähler des 8051, wird kein Knopf gedrückt wird der VHDL Zähler angezeigt. Der VHDL Zähler funktioniert, ich kann das ganze Design synthetisieren und es gibt keine Warnungen oder Fehlermeldungen. Die Instanzierung des 8051 habe ich aus einem Beispiel von Actel übernommen und setze mal voraus dass dieses richtig ist. Der C Zähler funktioniert leider nicht, es wird eine konstante 255 ausgegeben. Der Blinker der zusätzlich im C Programm steckt sollte eigentlich mit ca. 1 Hz eine LED toggeln, diese LED ist aber auch konstant an. Das ganze Design ist nicht besonders einfach zu simulieren, da der 8051 nur als kompilierte Netzliste vorliegt und ich noch etwas mit Modelsim und den zugehörigen Bibliotheken kämpfe, ich versuche nun das Problem im Vorfeld etwas einzugrenzen. Ich habe leider noch nie einen "originalen" 8051 programmiert, nur Abkömmlinge wie die AVRs. Z.B. bei dem ATMega16 muss ich die Portregister vorher als Ein- oder Ausgang konfigurieren, eine solche Möglichkeit habe ich in der Registerbeschreibung des 8051 nicht gefunden. Vermutlich muss das aber irgendwie passieren, und bei meiner einfachen Zuweisung auf die Portregister liegt das Problem. Kann mir jemand sagen ob mein (einfaches) C Programm prinzipiell funktionieren müsste? Ich habe noch ein paar andere Stellen im Verdacht wie zum Beispiel mein ROM und die entsprechende Taktung. Wenn ich das C Programm schonmal ausschließen könnte wäre das ein erster Fortschritt. Als Compiler habe ich einen älteren Keil C51 Compiler und den SDCC in der neuesten Version zur Verfügung, angeblich unterscheiden die sich aber nur in der Größe des erzeugten Codes und haben sonst keine größeren Schwachstellen. Vielen Dank und viele Grüße, Nils
Ich würd mal bei allen long-Konstanten ein L dahinter schreiben. Delayloops um 1Hz zu erzeugen, ist außerdem der falsche Ansatz, dazu sind ja die Timer da. Mit Delayloops erreichst Du nur rein zufällige Zeiten, abhängig vom Core-Typ, Optimierungslevel, Memory-Model usw. Peter P.S.: Da hat mich zwar einer für blöd erklärt, aber manche Cores können nicht mit der vollen FPGA-Frequenz laufen, geht einfach mal auf 10MHz runter.
Also beim 8051 musst du tatsächlich nicht vorher definieren ob du einen Port nun als Eingang oder Ausgang benutzen willst! Sieh dir mal das Datenblatt z.b. vom SAB80C535 an.. dort siehst du wie die Ausgangsschaltung eines I/O-Pins ist
@Jörg Wunsch: Da mein Problem sich um den C-Code dreht dachte ich, dass ich hier richtig wäre. Welches Forum wäre deiner Meinung nach besser geeignet gewesen? Ich bin hier zwar schon eine Weile registriert und lese relativ regelmäßig mit, habe aber noch nicht so oft gepostet und war nicht besonders sicher wo das hier hingehört. @Peter Dannegger: Das mit den Long Konstanten werde ich mal ausprobieren, danke für den Tip. Dass das mit dem Zähler keine genaue Lösung wird war mir schon klar, ich wollte nur einen "schnellen" sichtbaren Beweis dafür haben, dass der Core funktioniert. Bei der späteren "echten" Anwendung verwende ich dann die Timer. Der Core ist schon mit 10MHz getaktet. Das FPGA läuft mit einem internen 100MHz RCO, geteilt wird der Takt über eine interne PLL. @Marco Beffa: Ich werde mir das Datenblatt gleich mal ansehen. Wenn ich die Richtung nicht konfigurieren muss, heisst das aber leider dass ich meinen Fehler an anderer Stelle suchen muss. Das wäre ja auch zu leicht gewesen :) Vielen Dank euch allen, ich werde mal berichten wie es am Ende ausgegangen ist. Nils
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.