Hallo,
ich habe Probleme mit der Ansteuerung eines LCD-Displays. Ich versuche
mich ersteinmal an Beispielcodes. Komm jedoch nicht weiter. Ich habe
einen Virtex 6. Programmieren tue ich in VHDL. Ich habe einen Microblaze
aufgesetzt. Dieser fuktioniert auch (habe Hello Word etc ausprobiert).
Diesen programmiere ich in C.
Bei Xilinx war eine lcd.c, lcd.h dabei. Hier ein Beispiel:
https://source.ece.iastate.edu/scm/viewvc.php/*checkout*/bootloader/sdram_test/lib/src/lcd_char/lcd.c?root=sdmay11-14
Problem: Z.B XGpio_WriteReg(LCD_BASEADDR, ... gibt es nicht. Nun habe
ich nach Include-Dateien gesucht. Jedoch keinen Erfolg. Ich habe mir
gedacht, dass die Funktion "XGpio_WriteReg()" ja scheinbar lediglich
Register beschreibt. Also habe ich statt XGpio_WriteReg() die Funktion
XIOModule_DiscreteWrite() aus der Bibilothek "xiomodule.h" hergenommen.
Das Argument "LCD_BASEADDR" habe ich durch "&gpo" ersetzt (Pointer gibt
Register des Ports an). Als zweites Argument habe ich den Kanal GPIO 2
genommen (dort hängt das LCD dran). Z.B. in dieser Zeile aus dem
geposteten Quellcode:
void LCDInit()
{
// Sets CHAR LCD Reg to Write Mode
XGpio_WriteReg(LCD_BASEADDR, 0x4, 0x00000000);
steht ja scheinbar nicht an zweiter Stelle der Kanal (sondern 0x4). Hatb
hier jemand für mich vielleicht eine Lösung/Ansatz/ Quelle ?
Da
User schrieb:> https://source.ece.iastate.edu/scm/viewvc.php/*che...>> Problem: Z.B XGpio_WriteReg(LCD_BASEADDR, ... gibt es nicht.
Ich glaube das heißt nun XGpio_mWriteReg oder so ähnlich.
> Nun habe> ich nach Include-Dateien gesucht. Jedoch keinen Erfolg.
Also wenn du das Xilinx SDK nutzt, dann finden sich die einfach in dem
von dir eingerichteten BSP.
> Ich habe mir> gedacht, dass die Funktion "XGpio_WriteReg()" ja scheinbar lediglich> Register beschreibt. Also habe ich statt XGpio_WriteReg() die Funktion> XIOModule_DiscreteWrite() aus der Bibilothek "xiomodule.h" hergenommen.
Naja, bleib doch einfach lieber bei XGpio, und schau mal nach wie man
das richtig nutzt.
> Das Argument "LCD_BASEADDR" habe ich durch "&gpo" ersetzt (Pointer gibt> Register des Ports an). Als zweites Argument habe ich den Kanal GPIO 2> genommen (dort hängt das LCD dran). Z.B. in dieser Zeile aus dem> geposteten Quellcode:>> void LCDInit()> {> // Sets CHAR LCD Reg to Write Mode> XGpio_WriteReg(LCD_BASEADDR, 0x4, 0x00000000);>> steht ja scheinbar nicht an zweiter Stelle der Kanal (sondern 0x4). Hatb> hier jemand für mich vielleicht eine Lösung/Ansatz/ Quelle ?>
Der erste Parameter ist hier die Basisasdresse, der zweite das Offset
und der dritte der Wert, der geschrieben werden soll. Diese Funktion
schreibt also Nullen in die Adresse LCD_BASEADDR+4. Was das bedeutet,
kannst du unter
http://www.xilinx.com/support/documentation/ip_documentation/axi_gpio/v1_01_b/ds744_axi_gpio.pdf#page=8
nachlesen.
Ein Hinweis noch. Ich habe im Virtex 6 lediglich den Microblaze IPCore
eingebunden. (nicht den hier aufgezeigten LogiCORE IP AXI GPIO). Ich
möchte (zum Test der genannten Funktion) LEDs anschalten. Diese sind mit
dem Port "GPO1" vom Microblaze verbunden.
User schrieb:> Danke. Die C_BASEADDR wo finde ich die?
Die Adressen der Hardware finden sich in der Hardwarekonfiguration des
BSP (siehe xparameters.h).
User schrieb:> Ein Hinweis noch. Ich habe im Virtex 6 lediglich den Microblaze> IPCore> eingebunden. (nicht den hier aufgezeigten LogiCORE IP AXI GPIO). Ich> möchte (zum Test der genannten Funktion) LEDs anschalten. Diese sind mit> dem Port "GPO1" vom Microblaze verbunden.
Der normale MicroBlaze hat gar keine I/O-Ports. Hast du das Microblaze
MCS verwendet? Das kenn ich überhaupt nicht, kann dazu also nichts
sagen. Aber Xilinx hat eigentlich (fast) alles ganz gut dokumentiert.
Habe den Cor MicroBlaze mcs verwendet. Hierbei habe ich den GPO mit 7
Bit herausgeführt. Soweit ich es sehe brauche ich um auf das Display zu
schreiben lediglich Ausgänge.
Ich habe einmal in die xparameters.h geschaut (hatte ich auch
eingebunden). Da steht u.a.
// mit diesem Ausgang sind die sieben Display-Pins verbunden
#define XPAR_IOMODULE_0_USE_GPO2 1
#define XPAR_IOMODULE_0_GPO2_SIZE 7
...
#define XPAR_IOMODULE_INTC_MAX_INTR_SIZE 0
#define XPAR_IOMODULE_SINGLE_BASEADDR 0x80000000
#define XPAR_IOMODULE_SINGLE_HIGHADDR 0x8000007F
#define XPAR_IOMODULE_INTC_SINGLE_DEVICE_ID XPAR_IOMODULE_0_DEVICE_ID
Daraus leite ich ab, dass die Addresse die ich suche die 0x80000000 ist,
korrekt?
Also schreibe ich:
XGpio_mWriteReg(0x80000000, 0x4, 0x00000000);
Damit spreche ich Register 0x80000000 + 0x4 = 0x80000004 und schreibe
den Wert 0x00000000 in dieses. Korrekt?
User schrieb:> Problem: Z.B XGpio_WriteReg(LCD_BASEADDR, ... gibt es nicht. Nun habe> ich nach Include-Dateien gesucht. Jedoch keinen Erfolg. Ich habe mir> gedacht, dass die Funktion "XGpio_WriteReg()" ja scheinbar lediglich> Register beschreibt. Also habe ich statt XGpio_WriteReg() die Funktion> XIOModule_DiscreteWrite() aus der Bibilothek "xiomodule.h" hergenommen.
-- Resource ist Xilinx_Spartan3E_RevD_v2_2_0.xbd
Tool: Version 10.1, Xilinx Platform Studio (XPS)
Project:
Microblaze 16×2 LCD Driver
Hier ist ein Step by Step Tutorial,wie du via gpio ein LDC Modul
einbinden kannst.
Link:
http://www.fpgadeveloper.com/2008/10/microblaze-16x2-lcd-driver.html
Tip: ganz unten ist Web Page ist der Source Code.
Bzw. hier
https://github.com/fpgadeveloper/Microblaze-16x2-LCD-Driver/blob/master/ML505/edk10-1/TestApp_Peripheral/src/TestApp_Peripheral.c
########
Gruss Holger.
Was dem Beispiel noch fehlt ist die Umschaltung als ein
(<-|->) bidrektionalen Port mit Output_O bzw. Input_I.
Damit kann man am Data-Bus des LCD’s einlesen danach Bit 0x80
ausmaskieren,
und somit immmer in der Schleife pollen,
bis das LCD das 4-Bit Nibble gelatcht hat…
###################################
Dadurch wird der Timer-delay eingespart. (Hand-Shake-LDC) via bidir
Driver-Data-Port.
Das pollen am Data-Port bei LCD C Code Beispiel machen die eben nicht so
gerne.
Fire Data to Bus>onLCD make a short ‘delay and next geht das eben
einfacher….
########################################################################
######
Datenrichtungs-Register auf out-put…mit jeweiliger Status-Abfrage via
variable.
Status_out = XGpio_Initialize(&GpioOutput,XPAR_XPS_GPIO_0_DEVICE_ID);
Status_in = XGpio_Initialize(&GpioInput,XPAR_XPS_GPIO_0_DEVICE_ID);
Link:
http://www.fpgadeveloper.com/2008/02/manually-add-peripheral-to-project-2.html
Status_in = XGpio_Initialize(&GpioInput,XPAR_DIPSWS_4BIT_DEVICE_ID);
########################################################################
###
Viel Erfolg.
Gruss Holger.
Anhang ist die Board generic auf dem das EDK usw helper..Tool aufsetz.
Vielen Dank. Bin weitergekommen. Hab die Dokumentation zu den Registern
gefunden. Die Initialisierung klappt (fast). Ich sehe statt des Strings
einen blinkenden Curser sowie undefinierte Zeichen (Ich denke, dass das
nun ein Problem mit der von mir verwendeten Delay-Funktion ist..auf
"nop" Basis). Die ist noch ziemlich ungenau. In dem Beispiel (Post von
Holger Harten) verwendet der Autor die "delay_us(Xuint32 time)".
Ich habe mein "Test-Projekt" zur Timer-Funktion wie folgt aufgebaut:
#include <stdio.h>
#include "gpio_l.h"
#include "xiomodule.h"
#include "xparameters.h"
#include "xtmrctr.h"
#include "xstatus.h"
void delay_us(Xuint32 time);
XTmrCtr DelayTimer;
int main()
{
while(1){
XGpio_mWriteReg( 0x80000010, 0x00000000, 0x00000001); // LED 1 "on"
delay_us(500000); //Warte 0.5 s
XGpio_mWriteReg( 0x80000010, 0x00000000, 0x0000000); // LED 1 "off"
delay_us(500000);} //Warte 0.5 s
return 0;
}
void delay_us(Xuint32 time)
{
XTmrCtr_SetResetValue(&DelayTimer, 1, time * 125);
XTmrCtr_Start(&DelayTimer, 1);
while(!(XTmrCtr_IsExpired(&DelayTimer, 1))){}
XTmrCtr_Stop(&DelayTimer, 1);
}
Ich habe neben der "xtmrctr.h" folgende Dateien ins Projekt eingebunden:
- "xtmrctr.c"
- "xtmrctr_l.h"
- "xtmrctr_l.c"
- "xtmrctr_i.h"
In "xtmrctr.c" ist XPAR_XTMRCTR_NUM_INSTANCES noch undefiniert.
Mir ist noch nicht ganz klar, welchen Timer diese Funktion nutzt? Habe
im MicroBlaze ja mehrere FIT und PIT zur Verfügung (Habe nicht gesehen
wo die Registeraddresse angegeben wird). Zudem weiß ich nicht, wie der
XPAR_XTMRCTR_NUM_INSTANCES zu belegen ist, bzw. was dieser aussagt.
Sorry habe gerad entdeckt, dass es sich bei dem Parameter
XPAR_XTMRCTR_NUM_INSTANCES bei dem Auto um einen im File xparameters.h
definierten Namen handelt. Dieser ist bei mir nicht vorhanden. Heißt
wohl jetzt anders.
Hallo !
@User !
Den Ansatz von deinem prev.Posting ist mir nicht so verstaendlich !
XTmrCtr_Initialize
XTmrCtr_SetResetValue
XTmrCtr_Reset
-Der System-Takt ist hier leider nicht mit einbezogen.
(1.5 MHz to 400 MHz)
Mein erster Ansatz für den Delay via Timer.
.Sniplet..
1
#include"stdio.h"
2
#include"math.h"
3
#include"xparameters.h"
4
#include"xtmrctr.h"
5
6
#define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID
7
#define TIMER_COUNTER_0 0 // ???
8
9
XTmrCtrTimerCounter;/* The instance of the timer counter */
10
11
////////////////////// sleep_ms function //
12
/* execution is sleeping during time equal pause ms */
13
u32sleep_ms(u32pause)
14
{
15
u32Status;
16
u32timer_counter_value=0;
17
XTmrCtr*TmrCtrInstancePtr=&TimerCounter;// Store By-Ref
18
19
// _Initialize the TmrCtr driver so that it is ready to use
Danke. Wie meinst du das, dass du den Systemtakt nicht einbeziehst
Holger? Ich habe momentan auch eine Funktion "ohne" den Systemtakt
direkt zu berücksichtigen.
void usleep(unsigned int useconds)
{ int i,j;
for (j=0;j<useconds;j++)
for (i=0;i<6;i++) asm("nop");}
Ist aber sehr unsauber. Habe mir versucht die Funktion mittels Oszi
abzugleichen. Funktioniert aber nicht besonders. Wenn deine Funktion den
Takt auch nicht einbezieht, wie unterscheiden sich dann beide
Funktionen?
Benötige eine Funktion, welche sich am Takt orientiert. Deswegen mein
vorheriger Versuch. Ich kann ihn nochmal erläutern (über bessere
Vorschläge freue ich mich).
Der Eingangstakt ist z.B. 200 MHz (steht ja in der #include
"xparameters.h"). Die Registernamen habe ich aus folgender Beschreibung:
http://www.xilinx.com/support/documentation/sw_manuals/xilinx14_1/ds865_microblaze_mcs.pdf.
(Seite 30, Seite 31)
void delay_us_(long int time)
{
XGpio_mWriteReg(0x80000040,0,time*200);//Hier lade ich einen Wert in das
Register. Z.B. 200 (time = 1us bei 200 MHz (1 Takt 5 ns).
XGpio_mWriteReg(0x80000048,0,0x00000003);//PIT1 Control Register:
Counter Starten ( EN = 1, PRELOAD = 1). Hier Starte ich den Counter. Im
nächsten Schritt frage ich den Zählerstand ab. Sind 200 Takte um, dann
halte ich den Zähler an und springe aus der delay_us_-Funktion. Das war
mein Gedanke. Funktioniert aber nicht. Leider.
while(!(XGpio_mReadReg(0x80000044,0x00000000))){
//PIT1 Counter Register: Ausgabe des Zählerstandes
}
XGpio_mWriteReg(0x80000010,0,0x00000024);//Counter angehalten
}
Ich teste gerade mal für das Beispiel oben nur die
XGpio_mReadReg()-Funktion. In der Dokumentation
(http://www.cs.indiana.edu/hmg/le/project-home/xilinx/ise_13.2/ISE_DS/EDK/sw/XilinxProcessorIPLib/drivers/gpio_v2_13_a/doc/html/api/xgpio__l_8h.html#a17)
steht:
"Read a value from a GPIO register. A 32 bit read is performed. If the
GPIO component is implemented in a smaller width, only the least
significant data is read from the register. The most significant data
will be read as 0."
Als Rückgabewert wird der Registerinhalt angegeben:
"Returns: Data read from the register."
Folgendes habe ich umgesetzt:
#include "gpio_l.h"
...
data = XGpio_mReadReg(GPI1, 0x00);
xil_printf("Data(%x): %x\n\r", GPI1, data);
Am GPI1-Port hängen Dip-Schalter. Ich bekomme jedoch keinen
Rückgabewert. Im xgpio_l.h-File
(http://users.ece.gatech.edu/~hamblen/4006/xup/embedded/labs/lab4mb/microblaze_0/include/xgpio_l.h)
steht als Kommentar:
* Set the input/output direction of the signals of the specified GPIO
channel.
*
* @param BaseAddress contains the base address of the GPIO device.
* @param Channel contains the channel (1 or 2) to operate on.
* @param DirectionMask is a bitmask specifying which discretes are
input and
* which are output. Bits set to 0 are output and bits set to 1
are
* input.
*
* @return None.
*
* @note None.
Nutze ich die Funktion falsch,oder habe ich das falsche Header-File
erwischt? (Registeraddresse stimmt! Gebe ich die Schalterstellungen
direkt auf LEDs funktioniert es)
User schrieb:> Wie meinst du das, dass du den Systemtakt nicht einbeziehst
Ja wenn das System 125 MHz hat, muss ich das scalen können,
mit System mit nur 50 MHz.
Holger Harten schrieb:> http://www.fpgadeveloper.com/2008/02/manually-add-peripheral-to-project-2.html
Hallo!
Freu mich das du mit den Code-Snips
und #define Tabellen usw.
das LCD Display ans laufen bekommst.
########################################################################
####
data = XGpio_mReadReg(GPI1, 0x00); // !!! Fehler
Frage: Hast du das jetz so geschrieben ?
data = XGpio_mReadReg(GPI1, XGPIO_DATA_OFFSET ); // OK???
########################################################################
###
#define XGPIO_DATA_OFFSET
Data register for 1st channel
------------------------------------------------------------------------
---
Ich bin noch am überlegen wie ich ein bidirectionles Port hinbekomme.
Das ich auf out, bzw auf in stellen kann. ??
Gruss Holger.
// Initialize the GPIO driver so that it's ready to use,
status = XGpio_Initialize(&GpioInput,
XPAR_DIPSWS_4BIT_DEVICE_ID);
if (status != XST_SUCCESS)
return XST_FAILURE;
// Set the direction for all signals to be inputs
XGpio_SetDataDirection(&GpioInput, 1, 0xFFFFFFFF);
// Initialize the old data register
OldData = 0xFF;
while(1){
// Read the state of the DIP switches
DataRead = XGpio_DiscreteRead(&GpioInput, 1);
// Send the data to the UART if the settings change
if(DataRead != OldData){
xil_printf("DIP Switch settings: 0x%X\r\n", DataRead);
Soweit bin ich beim Timer gekommen:
#include <stdio.h>
#include "platform.h"
#include "gpio_l.h"
#include "xiomodule.h"
#include "xparameters.h"
#include <stdlib.h>
// GPO4: 0x8000001C
int main()
{
init_platform();
unsigned long data = 0x0;
unsigned long null = 0x3E8; //Grenze, sollte eigentlich 0 sein
//200000000 => 1 s bei 200 MHz
XGpio_mWriteReg(0x80000040, 0x01, 0x0BEBC200);
XGpio_mWriteReg(0x80000048, 0x01, 0x03);
data = XGpio_mReadReg(0x80000044, 1);
while(data >= null){
data = XGpio_mReadReg(0x80000044, 1);}
XGpio_mWriteReg(0x80000048, 0x01, 0x00); //Timer EN = 0
cleanup_platform();
return 0;
}
Ich sehe am Oszi einen Takt. Jedoch etwa 6,6 MHz. Ist mein Ansatz
brauchbar, oder ist es sinnvoller den Ansatz zu verwerfen? Danke
@USER
Frage: Kannst du diese Konstanten wie z.B 0x80000010
durch #defines ersetzen, oder ist die #define dafür im Project immer
noch nicht auffindbar ??
XGpio_mWriteReg(0x80000010,0,0x00000024);//Counter angehalten
########################################################################
##
Hallo !
So habe ich das erst gedacht.
Da in den Links ist auch noch so ein begin end timer Benchmark test
drin.
Aber so für den Anfang:
Link:
https://github.com/fpgadeveloper/Microblaze-16x2-LCD-Driver/blob/master/ML505/edk10-1/TestApp_Peripheral/src/TestApp_Peripheral.c
// Delay function (microseconds)
void delay_us(Xuint32 time)
{
// Hier scale system 125MHz.
XTmrCtr_SetResetValue(&DelayTimer, 1, time * 125);
XTmrCtr_Start(&DelayTimer, 1);
while(!(XTmrCtr_IsExpired(&DelayTimer, 1))){}
XTmrCtr_Stop(&DelayTimer, 1);
}
Gruss Holger.
Holger Harten schrieb:> Autor:>> Holger Harten> (holger-h-hennef)
------------------------------------------------------------------------
--
>> Datum: 07.12.2013 19:21User schrieb:> Ist mein Ansatz> brauchbar, oder ist es sinnvoller den Ansatz zu verwerfen? Danke
Den Beispiel Beitrag #3453215 Datum: 07.12.2013 19:21
1
include"stdio.h"
2
#include"math.h"
3
#include"xparameters.h"
4
#include"xtmrctr.h"
5
6
#define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID
7
#define TIMER_COUNTER_0 0 // ???
8
9
XTmrCtrTimerCounter;/* The instance of the timer counter */
10
11
////////////////////// sleep_ms function //
12
/* execution is sleeping during time equal pause ms */
13
u32sleep_ms(u32pause)
14
{
15
u32Status;
16
u32timer_counter_value=0;
17
XTmrCtr*TmrCtrInstancePtr=&TimerCounter;// Store By-Ref
18
19
// _Initialize the TmrCtr driver so that it is ready to use
Den versuchen einzubauen, da ist das über die Diskriptoren,
und den C *Funktion-Pointer gemacht, ID ect.pp
Also ohne 0x80000xx und so.
Mit der Error Konstante testest du ob das System das ok findet.
via XST_SUCCESS
if (Status != XST_SUCCESS)
return (XST_FAILURE);
Damit ist das autark von den feseten Adressen, und besser lesbar für
mich.
Viel Erfolg.
Gruss Holger.
Aber halt musst du die #defines in deinem Project finden.
Das war ja auch dein Problem am Anfang.
Hier wird zb. gesagt, dass der virtex 6 über den Timer verfügt:
http://www.xilinx.com/products/intellectual-property/xps_timer.htm.
Hat jemand eine Idee, wieso er nicht in den xparameters.h aufgelistet
ist? Aus Beispielen vom Vitex 5 kenne ich diese defines nämlich.
User schrieb:> Hat jemand eine Idee, wieso er nicht in den xparameters.h aufgelistet
#include "xparameters.h"
#include "stdio.h"
#include "xutil.h"
#include "xgpio.h"
#include "xtmrctr.h" /* timer_0 */
Hier bitte lesen. Wie der Timer bzw das System erstellt wird.
(Also liegen die Periperie Addressen bzw. speziell timer Periperie im
Header xtmrctr.h )
tmr --- symbol t_i_m_e_r.
Die Bilder in dem Link ansehen.
Link:
http://www.cs.uni-paderborn.de/fileadmin/Informatik/AG-Platzner/Teaching/WS1213/Reconfigurable_Computing/Tutorials/tutorial_edk11.pdf
Zitat aus dem Link: via *-pdf
How to use the timer module:
Include the header xtmrctr.h by adding the line: #include "xtmrctr.h"
Add a timer handle by declaring an XTmrCtr variable: static XTmrCtr
XPS_Timer;
The Timer can be controlled with the following routines:
Frage: Was hast du für ein Board, mit dem du da arbeitest.
Frage: Hast du schon mal mit dem Xilinx Platform Studio gearbeitet,
bzw. kannst du nachvollziehen wie das system da erstellt
wird.
Gruss Holger.
Hier ein Zusammen-Schnitt
#include "xtmrctr.h" /* timer_0 */
und den Festen Address Konstanten die da als Symbole in den C-File
eingebaut werden.
Siehe Bild.
0x8C00xxx = timer Struktur
----------------
Gruss Holger.
ToDo: Für mich.
Besonderes Augenmerk ist noch da in dem *.pdf der Konstrukt
mit volatile "Variabler" zu sehen.
volatile sagt dem Compiler das er das datavalue nicht in ein Register
packt.
Somit zieht der Prozessor during runtime die Variable immer frisch.
Danke dir. Ich probiere es morgen gleich aus. Ich schau morgen nach, wie
genau der Name der Entwicklungsumgebung ist. Auf alle Fälle von xilinx.
Ich kann die xtmrctr.h anklicken. Die habe ich aus dem Internet geladen
und in den projektordner kopiert. Ich schaue morgen, ob ich dadrin eine
Timer Adresse finde. Ich gebe auf alle Fälle Rückmeldung. Danke
Ich habe ein Projekt in xilix Ise angelegt. In dem Projekt habe ich
ml605 als Grundeinstellung gewählt. Als IPCore habe Ich den microblaze
eingebunden. Um diesen zu programmieren bin ich nach dem Tutorial
vorgegangen
http://ece.wpi.edu/~xhuang/index_files/courses/ECE3829-Lab4.pdf. Ich
weiß nun nicht, ob ich mit den Programmen arbeite, die du verwendest um
diese Ansicht mit den Adressen zu bekommen. Bzw. Wie komme ich von
meinem Standpunkt zu deiner Ansicht (sie Foto aus deinem Beitrag vom
23.12.2013 16:27 Uhr )?
Guten Morgen Holger,
meine xtmrctr.h sieht wie folgt aus:
http://users.ece.gatech.edu/~hamblen/4006/xup/embedded/labs/lab4mb/microblaze_0/include/xtmrctr.h.
Von dieser Seite habe ich diese geladen und zum Projekt hinzugefügt.
Wenn du sagst, dass eigentlich in der Datei die Address-Konstanten
stehen, dann kann es bei mir ja nicht funktionieren (ist ja scheinbar
keine von meiner Platform generierte Datei, richtig?). Lösche ich die
extra von mir eingefügte Header-Datei, dann fehlt diese nach dem
Einbinden. Dass heißt ja, dass sie von SDK nicht wirklich bereitgestellt
wird. Hast du eine Idee, oder drehe ich mich im Kreis? Danke dir.
Ich denke mal, dass meine Probleme daher kommen, dass ich mit dem Virtex
6 auf dem ML605 arbeite. Die Hilfen, die ich mir anschaue stammen jedoch
von älteren Versionen.
Ich habe einmal ein neues Projekt mit dem von dir angesprochenen System
Builder erstellt. Anbei befindet sich ein JPG mit den Konstanten. Dort
habe ich nun die Timer BaseAddress entnommen.
(Ich habe die Dateien alle hinzugefügt
http://users.ece.gatech.edu/~hamblen/4006/xup/embedded/labs/lab4mb/microblaze_0/libsrc/tmrctr_v1_00_b/src/)
#include "xstatus.h"
#include "xparameters.h"
#include "xtmrctr.h" /* axi_timer_0 */
#define BaseAddress 0x41C00000 // axi_timer_0
XTmrCtr DelayTimer;
int main(){
Xuint32 status;
status = XTmrCtr_Initialize(&DelayTimer,BaseAddress);
if (status != XST_SUCCESS){
xil_printf("Timer failed to initialize\r\n");
return XST_FAILURE;}
XTmrCtr_SetOptions(&DelayTimer, 1, XTC_DOWN_COUNT_OPTION);
delay_ms(1); //Test
return 0;
}
void delay_ms(Xuint32 time)
{
XTmrCtr_SetResetValue(&DelayTimer, 1, time * 125000);
XTmrCtr_Start(&DelayTimer, 1);
while(!(XTmrCtr_IsExpired(&DelayTimer, 1))){}
XTmrCtr_Stop(&DelayTimer, 1);
}
Dann bekomme ich die Fehlermeldung:
error: 'XPAR_XTMRCTR_NUM_INSTANCES' undeclared (first use in this
function).
Diese soll angeblich auch in der xparameters.h definiert sein... Setze
ich einmal zum TEST "#define XPAR_XTMRCTR_NUM_INSTANCES 2", dann fehlen
als nächstes XPAR_DELAY_DEVICE_ID und XPAR_DELAY_BASEADDR aus dem header
"xtmrctr_g.c". Diese sollen angeblich wieder aus der Datei xparameters.h
entnommen werden.
Demnach zweifel ich gerade daran, ob der Virtex6 diesen Timer in der Art
wie die Vorgänger besitzt. Ich habe wie gesagt scheinbar immernoch das
Problem die defines zu finden.
Warum muß man eigentlich als Anfänger mit dem komplexesten Szenario, das
es auf einem FPGA gibt anfangen?
Frei konfigurierbare Logik + parametrierbare CPU + variable Peripherie +
Software?!?
Hast Du schon mal eine blinkende LED realisiert (ohne Softcore)?
Lauflicht? State-Machine?
Wenn nein, warum fängst Du dann mit einem LCD+Softcore an?
Was für eine Version Deiner Entwicklungsumgebung hast Du (Webpack, Eval
oder Full)?
Hast Du Dir Deinen Microblaze selber konfiguriert oder wurde er
vorgegeben?
Normalerweise wird beim Parametrieren der CPU (und der Peripherie)
ausgewählt, ob und wieviele GPIO, Timer, RAM etc. pp. man haben möchte
(bzw. im FPGA unterbringen kann).
Genau dort fällt auch ein Parameterfile raus, welches man hinterher in
der Software einbindet.
Wenn Du dieses File aus einem anderen Projekt nimmst, ist die
Wahrscheinlichkeit hoch, das es bei Dir nicht passt.
Machst Du das Projekt für Dich, für die Uni oder für Deinen Arbeitgeber?
Duke
User schrieb:> Ich habe wie gesagt scheinbar immernoch das> Problem die defines zu finden.
Du hast das Problem, daß Du noch nicht geblickt hast, wie die Tools
aufeinander aufbauen (-> Toolflow).
Hast Du schon mal die Tutorials vom Hersteller durchgearbeitet?
Duke
Danke für die Antwort Duke.
Ich habe mit einem FPGA schon ein Lauflicht, blinkende LEDs (mit der
einfachen delay-Fkt - Stichwort "nop") usw. realisiert. VHDL Kenntnisse
sind soweit vorhanden.
Nun möchte ich mit dem MicroBlaze experimentieren. LCD läuft, LED-
Ausgaben, DIP-Schalter-Eingaben, USB etc läuft. Ich habe früher auf AVRs
in C programmiert.
Tutorials habe ich einige durchgearbeitet. Aber du hast sicherlich
recht, dass ich den "Toolflow" noch nicht verinnerlicht habe.
Zum Verständnis noch ein letztes mal.
1. Die Adressen des GPI, GPO, Timers usw. eines FPGAs (Virtex 5, Virtex
6, ...) sind vom Hersteller fest vorgegeben, richtig?
2. Die festen Register-Adressen muss ich im Datenblatt des jeweiligen
FPGAs nachschauen, korrekt?
3. Die Adressen sollten damit unabhängig von der verwendeten ISE-Version
usw. sein, richtig?
Ich frage aus folgendem Grund:
Ich habe euren Rat befolgt und einmal den Flow versucht
nachzuvollziehen. Ich habe dieses Mal wie in Holgers obigen Beispiel
erläutert ein neues Projekt gemäß Tutorial angelegt.
Dazu habe ich
(a) in „Xilinx Platform Studio“ ein neues Projekt angelegt. Ich kann da
wählen zwischen einem AIX- und einem PLB-System. Ich habe das PLB-System
wie im Beispiel erstellt. Der Timer „xps_timer_0“ (wie in Holgers
Darstellung) ist vorhanden. Die Basis-Adresse habe ich mir notiert
(0x83C00000). Ebenso die Adresse des GPO1-Registers, an dem die LEDs
"angelegt" sind (0x81400000).
(b) anschließend habe ich SDK geladen und ein Projekt angelegt. Binde
ich nun "xparameters.h" ein, dann erscheint der Timer als
Peripherie-Komponente. (Bis dahin stimmt scheinbar alles)
(c) ein erster Test: "Hello world" über UART ausgeben funktioniert!
(d) ein zweiter Test: LEDs einschalten. In dem funktionsfähigen Projekt
von mir ging das über:
#define XPAR_LEDS_8BIT_BASEADDR 0x81400000;
XGpio_mWriteReg(XPAR_LEDS_8BIT_BASEADDR, 0x01, 0xFF);
=> LEDs leuchten nicht!
Ich habe mein altes Projekt geladen. Hier funktioniert es. Mir ist
aufgefallen, dass die Basis-Adresse für den GPO1 0x80000010 ist. (eine
andere Adresse ?!)
Aus diesem Grund meine oben gestellten Verständnisfragen, ob die
Adressen fest sind. Die Adresse 0x80000010 hatte ich damals aus dem
Dokument
http://www.xilinx.com/support/documentation/sw_manuals/xilinx14_1/ds865_microblaze_mcs.pdf
(Seite 24)
Das Dokument beschreibt den MicroBlaze. Das Dokument ist ja gültig für
"Virtex 5, Virtex 6 ...
=> Adresse doch lediglich abhängig von der Konfigurierung (Automatische
Festlegung, wenn ich das Projekt erstelle?!) ?
Ich versuche momentan ein wenig dahinterzukommen, wie das Ganze
funktioniert. Es ist jedoch bei den vielen Dokumenten von Xilinx schwer
die richtigen (ist ja auch abhängig von der ISE-Version)
herauszufiltern.
Danke
User schrieb:> Zum Verständnis noch ein letztes mal.>> 1. Die Adressen des GPI, GPO, Timers usw. eines FPGAs (Virtex 5, Virtex> 6, ...) sind vom Hersteller fest vorgegeben, richtig?
Falsch! XPS geht zwar her und vergibt, wenn du mit dem
Base-System-Builder arbeitest, automatisch "sinnvolle" Adressen, diese
sind aber nur ein Vorschlag und können jederzeit geändert werden...
Übrigens hast du glaube ich noch nicht ganz verstanden, dass du in
deinen FPGA einen IP-Core einbaust der z.B. eben die Funktion eines
Timers, der GPIOs,... realisiert und das keine feste komponente des
FPGAs ist, oder?
> 2. Die festen Register-Adressen muss ich im Datenblatt des jeweiligen> FPGAs nachschauen, korrekt?
Siehe Antwort zu Frage 1 - sind einstallbar...
> 3. Die Adressen sollten damit unabhängig von der verwendeten ISE-Version> usw. sein, richtig?
Und wieder siehe 1.
>>> Ich frage aus folgendem Grund:>> Ich habe euren Rat befolgt und einmal den Flow versucht> nachzuvollziehen. Ich habe dieses Mal wie in Holgers obigen Beispiel> erläutert ein neues Projekt gemäß Tutorial angelegt.
Manchmal neu Anfangen ist gut wenn man den Wald vor Bäumen nicht mehr
sieht ;)
> Dazu habe ich> (a) in „Xilinx Platform Studio“ ein neues Projekt angelegt. Ich kann da> wählen zwischen einem AIX- und einem PLB-System. Ich habe das PLB-System> wie im Beispiel erstellt. Der Timer „xps_timer_0“ (wie in Holgers> Darstellung) ist vorhanden. Die Basis-Adresse habe ich mir notiert> (0x83C00000). Ebenso die Adresse des GPO1-Registers, an dem die LEDs> "angelegt" sind (0x81400000).
Brauchst du dir nicht notieren da dir das die Tools abnehmen aber dazu
gleich mehr...
> (b) anschließend habe ich SDK geladen und ein Projekt angelegt. Binde> ich nun "xparameters.h" ein, dann erscheint der Timer als> Peripherie-Komponente. (Bis dahin stimmt scheinbar alles)
Ganz genau das ist der Punkt. Hast du verstanden wofür diese Datei ist?
Genau in dieser sind nämlich all diese vielen Addressen und weitere
Parameter definiert - das will sich ja keiner merken ;)
> (c) ein erster Test: "Hello world" über UART ausgeben funktioniert!
Sehr schön - immer gut das so zu machen!
> (d) ein zweiter Test: LEDs einschalten. In dem funktionsfähigen Projekt> von mir ging das über:> #define XPAR_LEDS_8BIT_BASEADDR 0x81400000;> XGpio_mWriteReg(XPAR_LEDS_8BIT_BASEADDR, 0x01, 0xFF);> => LEDs leuchten nicht!> Ich habe mein altes Projekt geladen. Hier funktioniert es. Mir ist> aufgefallen, dass die Basis-Adresse für den GPO1 0x80000010 ist. (eine> andere Adresse ?!)
Genau - eine andere Addresse - und deswegen auch NICHT selber ein
#define XPAR_*** machen. Das sollte in xparameters.h bereits vorhanden
sein (ob der Name stimmt kann ich nicht sagen - aber da sollte es ein
Define mit der RICHTIGEN Addresse geben! Einfach mal nach der Suchen
dann findest auch das zugehörige Define)
> Aus diesem Grund meine oben gestellten Verständnisfragen, ob die> Adressen fest sind. Die Adresse 0x80000010 hatte ich damals aus dem> Dokument> http://www.xilinx.com/support/documentation/sw_manuals/xilinx14_1/ds865_microblaze_mcs.pdf> (Seite 24)
Das Dokument ist für den LogiCORE Microblaze. Bin mir leider nicht
sicher aber das ist doch ein spezieller Core der schon gewisse
Baugruppen (UART etc.) mit dabei hat...
Die Frage ist aber: Nutzt du wirklich den LogiCORE Microblaze oder den
"normalen"
Wie gesagt: LogiCORE kenn ich nicht bin also nicht sicher ob der Absatz
hier grad so richtig ist - bitte korrigieren wenn ich falsch liege ;)
>> Das Dokument beschreibt den MicroBlaze. Das Dokument ist ja gültig für> "Virtex 5, Virtex 6 ...
Wie gesagt LogiCORE Microblaze!
>> => Adresse doch lediglich abhängig von der Konfigurierung (Automatische> Festlegung, wenn ich das Projekt erstelle?!) ?>> Ich versuche momentan ein wenig dahinterzukommen, wie das Ganze> funktioniert. Es ist jedoch bei den vielen Dokumenten von Xilinx schwer> die richtigen (ist ja auch abhängig von der ISE-Version)> herauszufiltern.>
Kann ich nur bestätigen, dass der Einstieg nicht einfach ist. Kommt halt
daher, dass du auf der einen Seite deine Hardwarebeschreibung selbst
konfigurierst und viel falsch machen kannst - und zusätzlich die
Software - bei der genausoviel schief gehen kann...
Aber das ist alles machbar sobald man mal irgendwann ein bisschen
durchgestiegen ist.
Ich beschäftige mich selber mit den Embedded sachen im FPGA erst etwa 4
Monate (mit FPGA allgemein auch nur wenig länger..) aber ich kann dich
beruhigen - es wird manches leichter - dafür kommmen viele neue Probleme
(okok - das war jetzt nicht wirklich beruhigend oder ;)
Grüße
Tobias
Danke dir. Also bis eben dachte ich, dass ich nur den IPCore "MicoBlaze"
in mein VHDL-Projekt als "Blackbox" einbinden muss. Das habe ich auch im
ISE-Projekt getan (bis die (bisher noch ungelöste) Frage nach einem
Timer/ einer genauen Delay-Funktion auftauchte). Die Vorstellung fand
ich eigentlich für meine Bastelzwecke gut.
Mit den Adressen ist es klar geworden, danke. Also ist es schwierig nach
ein paar Monaten z.B. zu einem bestehenden Projekt (im "Mikrocontroller"
eine neue Komponente hinzuzufügen..da das xparameters.h sich ja nicht
automatisch anzupassen scheint)
C programmieren ist bei mir eigentlich nicht wirklich das Problem. VHDL
ebenso wenig.
Bemerkung/Überlegung:
Später wollte ich eine Ethernet-Schnittstelle oder PCI nutzen, um mit
dem PC Daten auszutauschen. Auch deswegen wollte ich mit dem
Mikrocontroller experimentieren. (ich weiß, dass das viel viel
anspruchsvoller ist, ein Ziel muss jedoch sein ;) )
User schrieb:> Danke dir. Also bis eben dachte ich, dass ich nur den IPCore "MicoBlaze"> in mein VHDL-Projekt als "Blackbox" einbinden muss. Das habe ich auch im> ISE-Projekt getan (bis die (bisher noch ungelöste) Frage nach einem> Timer/ einer genauen Delay-Funktion auftauchte). Die Vorstellung fand> ich eigentlich für meine Bastelzwecke gut.
Nunja wenn du den BaseSystemBuilder nimmst und für dein Board (ML605
wars glaube ich?) ein "Standard" Projekt erstellst bindet der
automatisch schon einiges an Cores ein. Da sollte dabei sein GPIOs
(Taster, LED,...), UART, Memorycontroller (DDR3), Ethernet, ...
Prinzipiell kannst du all diese Blöcke als Blackbox ansehen und einfach
sagen - ich will eine Funktion also schau ich mal welchen Core ich dafür
finde
>> Mit den Adressen ist es klar geworden, danke. Also ist es schwierig nach> ein paar Monaten z.B. zu einem bestehenden Projekt (im "Mikrocontroller"> eine neue Komponente hinzuzufügen..da das xparameters.h sich ja nicht> automatisch anzupassen scheint)
Nein. Eigentlich kein Problem. Du fügst die Komponente im XPS hinzu und
machst ein Export to SDK. Dann aktualisiert er dein Bitfile und
automatisch deine Hardwareplatform und dann auch dein BSP wo die
xparameters.h drin steckt. Aber immer vorher ne Sicherung machen!
>> C programmieren ist bei mir eigentlich nicht wirklich das Problem. VHDL> ebenso wenig.
Irgendwie kenn ich diesen Punkt. Und dann kommt da so ein riesiges
System bei dem man erstmal die Abläufe verstehen muss und mit seinem
bisherigen Wissen nur bedingt was anfangen kann ;)
>>> Bemerkung/Überlegung:> Später wollte ich eine Ethernet-Schnittstelle oder PCI nutzen, um mit> dem PC Daten auszutauschen. Auch deswegen wollte ich mit dem> Mikrocontroller experimentieren. (ich weiß, dass das viel viel> anspruchsvoller ist, ein Ziel muss jedoch sein ;) )
Ethernet von der Hardwareseite ist kein großes Problem da das
normalerweise für die Entwicklungsboards doch recht gut vorbereitet ist.
Softwareseitig ist manches vorbereitet (Treiber). Spätestens wenn du
Linux verwendest wird dir durch die Treiber viel abgenommen - wobei
Linux auch wieder seine Eigenheiten hat.
PCI(e) hab ich leider noch garkeine Erfahrungen gemacht.
Grüße
Tobias
Also baue Ich quasi mit dem System builder den mikrocontroller nach
meinem Bedürfnissen selbst zusammen. Somit wäre dieses ja
unausweichlich, wenn Ich in die Zukunft gesehen pci umsetzen mag.
Eher nein. Der Systembuilder nimmt dir ein paar Anfangsaufgaben ab
(Einstellungen für deinen Memorycontroller-IP-Core z.B.)
Du kannst dir aber jederzeit verschiedene IP-Cores auch selbst
zusammenklicken - musst dann aber halt verstanden haben wie.
Mein Tipp: Versuche die Vorlage die dir der BSB gibt anzusteuern (dein
Timer z.B. läuft) und zu verstehen wie die ganzen IP-Cores (im XPS)
konfiguriert werden, an welchen Bussen die hängen usw...
Und dann schau mal bissle im IP-Core-Katalog was es noch so gibt - oder
füge einfach einen zweiten Timer ein und versuche auch den Anzusteuern.
Dadurch kommst du denke ich mit Erfolgserlebnissen recht schnell
dahinter wie das alles funktioniert.
Danke. Ich habe meine ich das Problem gefunden (weswegen ich nie defines
gefunden habe und der Timer nicht funktionierte). Bei meiner ISE-Version
funktioniert es scheinbar nicht richtig, wenn man ein "PLB System"
auswählt. Mit dem neueren AXI-System funktioniert alles super: LEDs,
DIPs, LCD, UART ... der Timer funktioniert auch!
Folgende Zeilen habe ich dafür umgesetzt:
#include "platform.h"
#include "xparameters.h"
#include "xstatus.h"
#include "xtmrctr.h"
void delay_us(Xuint32 us);
XTmrCtr TmrCtrInstancePtr;
int main()
{
init_platform();
// AXI_Timer-Test --------------------------------------------------
Xuint32 status;
status = XTmrCtr_Initialize(&TmrCtrInstancePtr,
XPAR_AXI_TIMER_0_DEVICE_ID);
if (status != XST_SUCCESS)
{
xil_printf("Timer failed to initialize\r\n");
return XST_FAILURE;
}
XTmrCtr_SetOptions(&TmrCtrInstancePtr, 1, XTC_DOWN_COUNT_OPTION);
while(1) //Test, zur Überprüfung auf Oszi.
{
XGpio_mWriteReg(XPAR_GPIO_1_BASEADDR, 0, 0b00000000);
delay_us(time);
XGpio_mWriteReg(XPAR_GPIO_1_BASEADDR, 0, 0b00000001);
delay_us(time);
}
return 0;
}
void delay_us(Xuint32 us)
{
XTmrCtr_SetResetValue(&TmrCtrInstancePtr, 1, us *
XPAR_AXI_TIMER_0_CLOCK_FREQ_HZ/1000000);
XTmrCtr_Start(&TmrCtrInstancePtr, 1);
while(!(XTmrCtr_IsExpired(&TmrCtrInstancePtr, 1))){}
XTmrCtr_Stop(&TmrCtrInstancePtr, 1);
}
Ich muss jetzt nur noch einen Korrekturwert von "us *
XPAR_AXI_TIMER_0_CLOCK_FREQ_HZ/1000000" abziehen, um an Genauigkeit zu
gewinnen. Die Ungenauigkeit kommt meiner Meinung nach aus der
delay-us-Funktion selbst. Die Operationen XTmrCtr_SetResetValue() usw.
benötigen ja auch ein paar Takte. Auf 1 us genau kann ich somit bei 50
MHz Takt (20 ns) nicht kommen. (Übergebe ich den Wert 1 an die Funktion
delay_us(), dann messe ich am Oszi. eine Pulsbreite von 13,2 us. Damit
suche ich einen konstanten Korrekturwert, richtig?
Um auf 1 us und niedriger zu kommen, muss ich demnach entweder die
Taktfrequenz erhöhen, oder doch die alte delay-Funktion mit „nop“
nehmen.
Danke für die wertvollen Tipps.
Tobis du schriebst:
"
> Mit den Adressen ist es klar geworden, danke. Also ist es schwierig nach> ein paar Monaten z.B. zu einem bestehenden Projekt (im "Mikrocontroller"> eine neue Komponente hinzuzufügen..da das xparameters.h sich ja nicht> automatisch anzupassen scheint)
Nein. Eigentlich kein Problem. Du fügst die Komponente im XPS hinzu und
machst ein Export to SDK. Dann aktualisiert er dein Bitfile und
automatisch deine Hardwareplatform und dann auch dein BSP wo die
xparameters.h drin steckt. Aber immer vorher ne Sicherung machen!"
Ich habe nun den Takt, mit welchem der virtuelle MicroBlaze arbeitet, in
EDK geändert. Wie schaffe ich es, dass diese Änderung in die Konstante
XPAR_AXI_TIMER_0_CLOCK_FREQ_HZ im xparameters.h File automatisch
übernommen wird? Finde keinen Knopf zum erneuern des sdk-projektes.
Kann es natürlich per Hand nachtragen, wenns automatisch ginge fände ich
es schöner.
Welche Version von ISE Nutzt du eigentlich? Weil die Probleme die du
teils hast kommen mir spanisch vor...
> Ich habe nun den Takt, mit welchem der virtuelle MicroBlaze arbeitet, in> EDK geändert.
Wie genau? Vermutlich im Clockmanagement Core die Frequenzeinstellung
geändert oder? Wenn ja sollte das passen.
> Wie schaffe ich es, dass diese Änderung in die Konstante> XPAR_AXI_TIMER_0_CLOCK_FREQ_HZ im xparameters.h File automatisch> übernommen wird? Finde keinen Knopf zum erneuern des sdk-projektes.
Sind denn die Frequenz vom Microblaze und die vom Timer die gleichen?
Meistens ist das so - aber das ist ja nicht zwingend. Nur der Bustakt
ist zwingend gleich...
Wenn das überprüft ist musst du die Hardware neu erzeugen, d.h. ein
neues Bitfile erstellen. Und (sofern du in einer halbwegs aktuellen ISE
Version arbeitest) dann einfach ein "Export to SDK" machen. Dann sollte
er die Header-Files erneuern.
>> Kann es natürlich per Hand nachtragen, wenns automatisch ginge fände ich> es schöner.
Auf keinen Fall per Hand machen! Die Xilinx-Files solltest eher nicht
anfassen da die so wie ich das verstehe bei besagtem "Export to SDK"
überschrieben/aktualisiert werden.
Da ich aber im Moment die Programme nicht hier hab kann ich das leider
nicht testen. Falls das alles aber nicht tun sollte (was mich wundern
würde) - einfach mal das BSP löschen und neu anlegen - spätestens dann
sollten die aktuellen Daten drinstehen.
Danke Tobias. CLK Einstellung wird im xparameters.h übernommen. Hatte
mich nur verklickt.
Ich habe über den System Builder einmal ein Projekt wie beschrieben
erstellt. Funktioniert auch super.
Habe die LEDs auf dem Entwicklungsboard angesteuert. Die hängen ja an
einem AIX GPIO. Nun wollte ich z.B. ein paar Pins ansteuern. Die möchte
ich an einen anderen GPIO betreiben. Also führe ich "Schritt 1" aus.
Der GPIO_1 und GPIO_2 usw. sind nun hinzugefügt. Ich habe nun die Pins
(die ich ins ucf-File eingetragen habe zugewiesen) (Schritt 3).
Ich verstehe nicht, wieso ich einmal GPIO_IO_O und einmal GPIO_IO habe.
(rot umrandet). Setze ich die beiden auf GPIO_IO_O erscheint folgende
Fehlermeldung:
EDK:4074 - INSTANCE: GPIO_2, PORT: GPIO_IO, CONNECTOR: GPIO_2_GPIO_IO -
No
driver found ...
ERROR:EDK:440 - platgen failed with errors!
Wenn ich sie alle unterschiedlich setze, dann funktioniert es mit der
Ansteuerung. Kann mich jemand aufklären?
Ich habe wahrscheinlich das Konzept falsch verstanden ?!
@User Hier ein Hint von Silica Avnet !
######################################################################
Xilinx EDK Tutorial - Adding custom IP to an EDK Project - Part 2
https://www.youtube.com/watch?v=WYOQpqlEY94&feature=player_detailpage
### Topic: custom IP Priperal I/0 also anlegen, export und import via
EDK Tools
usw...
3 Tutorials Play-List
https://www.youtube.com/watch?v=MC1amstP_8A&list=PL6BCB2A81CBD665C5
######################################################################
Gruss Holger.
Anhang: EDK_SLAVE_REG_1.PNG
---------------------------------
Danke dir. Das scheint mir alles sehr kompliziert. Ich meine um ein LCD,
acht LEDs und vielleicht noch weitere acht LEDs an den mikrocontroller
anzuschließen. Mit kompliziert meine ich, dass irgendwie viel Vhdl Code
erzeugt wird. Das Projekt wird sehr groß und unübersichtlich in meiner
Augen. Damals, als ich nur den microblaze ip Core eingebunden habe (LCD,
LED, switches ...) war die Main.vhd übersichtlich. Ich hatte im UCI file
meine Peripherie, die in an den mikrocontroller über Signal
angeschlossen habe.
Beim Konzept mit dem systembuilder erscheint mir alles unklar. Wieso
soll ich mir einen neuen Custom Pi erstellen und darf nicht einfach
einen Gpio hinzufügen (ich meine der vom Programm selbst erstellte LED
Bus war auch von der Sorte)? Kannst du mich vielleicht aufklären ;)
Danke