Forum: FPGA, VHDL & Co. Avalon Slave Read von HDL zu NIOS


von Druide (Gast)


Lesenswert?

Hi ich habe aktuell ein Problem das ich nicht ganz nachvollziehen kann, 
da ich das bereits in einem anderen Projekt genau auf die selbe Art 
gelöst hatte.

ich arbeite auf einem Altera NEEK Board und möchte den Altera Avalon 
Slave nutzen.

Hierzu habe ich ein eigene Verilogfile als Altera Avalon Slave 
eingebunden, mit WRITE,READ,ADDRESS, WRITEDATA und READDATA.

vom NIOS C++ in die Verilogfile schreiben funktioniert einwandfrei, nur 
lesen geht irgendwie nicht :(

hier mal mein C++ Code

//PICREADANDFIND_0_BASE ist die Base Adresse des eigenen HDL Blockes.

#define SCREENSHOT (0x02*4)
#define GRAY       (0x03*4)
#define THRESH   (0x04*4)
#define READOBJEKTX (0x06*4)
#define READOBJEKTY (0x07*4)
#define STARTFOUND (0x08*4)
#define START (0x09*4)

IOWR_32DIRECT(PICREADANDFIND_0_BASE,SCREENSHOT,0x00000001);
IOWR_32DIRECT(PICREADANDFIND_0_BASE,GRAY,0x00000001);
IOWR_32DIRECT(PICREADANDFIND_0_BASE,THRESH,0x00000001);

IOWR_32DIRECT(PICREADANDFIND_0_BASE,START,0x00000001);


 do{
    printf("|");
    start_found=IORD_32DIRECT(PICREADANDFIND_0_BASE,STARTFOUND);
    printf("startfound: %d\n",start_found);
    //nothing
 }while(start_found == 0);

BildX = IORD_32DIRECT(PICREADANDFIND_0_BASE,READOBJEKTX);
BildY = IORD_32DIRECT(PICREADANDFIND_0_BASE,READOBJEKTY);


im HDL habe ich in Verilog  geschrieben: (alles andere hab ich mal 
rausgelassen.)

module(
MYADDR,
MYWRITEDATA,
MYREADDATA,
MYWRITE,
MYREAD
);

input  [7:0]   MYADDR;
input  [31:0]   MYWRITEDATA;
input     MYWRITE;
input     MYREAD;

output  reg [31:0]   MYREADDATA;



parameter RGB_ADDR = 32'h00000001;
parameter SCREENSHOT = 32'h00000002;
parameter GRAY      = 32'h00000003;
parameter THRESH    = 32'h00000004;
parameter READOBJEKTX = 32'h00000006;
parameter READOBJEKTY = 32'h00000007;
parameter STARTFOUND = 32'h00000008;
parameter START = 32'h00000009;




always@ (posedge CLK50)
begin : AVALON_INTERFACE

  begin
    if(MYWRITE == 1'b1)
    begin
      case(MYADDR)
      SCREENSHOT: screenshotreg <= MYWRITEDATA[0];
      START:  getStart <= MYWRITEDATA[0];
      GRAY: Grayreg <= MYWRITEDATA[0];
      THRESH:  Threshreg <= MYWRITEDATA[0];
      default:;
      endcase
    end
    else if((MYREAD == 1'b1) )// && (MYDATAISREADY == 1'b1))
    begin
      case(MYADDR)

      READOBJEKTX:
      begin
        MYREADDATA <= {StartAdressX};

      end
      READOBJEKTY:
      begin
        MYREADDATA <= {32'hFFFFFFFF};
      end
      STARTFOUND:
      begin
        MYREADDATA <={31'h00,SetStart};

      end
      default: MYREADDATA <= 32'hFFFFFFFF;
      endcase
    end

was mich so extrem wundert selbst die daten von READOBJEKTY die ja ein 
fester wert sind werden nicht zugewiesen :(

alle anderen Daten werden von einem anderem Block integriert, laut 
SignalTap sind diese auch korrekt.

aber es werden wie gesagt garkeine Daten gelesen!
geschrieben werden alle Daten einwandfrei!

hat jemand da nen Tipp ???

in der neuen Komponente die ich erstellt habe sind die MYXXX natürlich 
auch auf die entsprechenden Avalon_Slave gesetzt

von SeriousSam (Gast)


Lesenswert?

Was passiert denn, wenn du den Code ausführst? Bekommst du eine 
Endlosschleife? Hast du mal das Disassembly angeschaut, ob der Compiler 
da nicht etwas wegoptimiert? Ist der ReadWait Wert in der Component 
Description in SOPC Builder korrekt? Funktioniert ein einfaches Register 
mit lesen und schreiben?

von Druide (Gast)


Lesenswert?

ja er findet nie start found, auch wenn diese gesetzt wurde.

jetzt hab ichs hinbekommen das er ließt dafür schreibt er nimmer oder 
nur noch teilweise ... kapier das problem nicht ... hatte genau das 
gleiche bereits in einem anderen Projekt gemacht und da lief alles 
einwandfrei ... konnte lesen UND schreiben ... jetzt gehts nur noch 
teilweise... aktuell kann ich zumindest den Wert von RGB_ADDR (der steht 
da nicht drin) wieder auslesen. .. und kann GRAY und THRESH setzt dafür 
aber kein Screenshot und start mehr -.- kapier das alles net 
totalverwirrt bin

von Kest (Gast)


Lesenswert?

Ich vermute mal sehr stark, dass Du einfach Avalon-Slave TCL falsch 
gemacht hast. Also die Timings bzw. wann die DAten übernommen werden. 
Kontrollier doch mal bitte im SOPC-Builder, was bei dir drin steht 
(waitstates, ...) Deshalb klappt "WRITE" immer und lesen nicht, oder nur 
ab und zu. Vermutlich hast Du da zu wenige Waitstates eingefügt.

Grüße,
Kest

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.