NIOS 2 Zugriff VHDL ohne Avalon ?

OP (Firma: haa) #6114588
Lesenswert?

hier mein erster Test
ich will " test" verwenden um es in meinem hdl adder zu manipulieren und 
das ergebnis im nios zu sehen^^
1
module p1(
2
  (* chip_pin = "V11" *) input logic clk,
3
  (* chip_pin = "AH17"  *) input logic reset_n,
4
  (* chip_pin = "W15" *) output logic led,
5
  (* chip_pin = "AA24" *) output logic led2,
6
  (* chip_pin = "Y24" *) input logic key,
7
  (* chip_pin = "W24" *) input logic key2
8
  
9
  );
10
  
11
  logic [7:0] test;
12
  
13
      unsaved u0 (   // NIOS
14
        .clk_clk       (clk),       //   clk.clk
15
        .reset_reset_n (reset_n),  // reset.reset_n
16
       .pio_in_export (test)
17
    );
18
  
19
  logic x;
20
  logic y;
21
  logic out;
22
  logic out2;
23
   
24

25

26
   test1 adder( // eigene komponente 
27
   .clk_s(clk),
28
   .x(key),
29
   .y(key2),
30
   .sum(led)
31
   );
32
  // eigner COde
33
  always_ff @(posedge clk) begin
34
  
35
  led2<=key; // non blocking 
36
  test <= 2+key;
37
  end
38
  
39
endmodule
Angehängte Dateien:
Gast #6114811
Lesenswert?

Geldesch B. schrieb:
> Kann man (eigene ) Komponenten auch ohne Avalon Bus mit dem Nios
> verbinden ?
An welche Schnittstelle hast Du da gedacht?
Und mit welchen Nios-Befehlen willst Du mit Deiner Komponente 
kommunizieren?

> Oder wenigstens indirekt indem man Daten an einen PIO schickt.
Ja, sowas geht. Ähnlich wie man es beim Mikrocontroller machen würde.
Nutze ich gerne für einzelne Status- bzw. Steuersignale, wo ein 
komplettes Businterface eine Übertreibung wäre.

Duke
#6114913
Lesenswert?

Vorschlag/Stichwort: memory mapped register.
Schritte:
- Register/Adressen definieren
- Adress-Decoder implementieren oder generieren
- Per C Register im entsprechend codierten Memory-Bereich (MMR_Offset) 
ansteuern.

Z.B.
1
  
2
#define MMR32_PTR volatile uint32_t *
3
#define MMR32(x) *((MMR32_PTR) ((x) + MMR_Offset))
4
...
5

6
uint32_t r;
7
// Register lesen:
8
r = MMR32(R_CONTROL); // Register-Adresse
9
// Register setzen:
10
MMR32(R_CONTROL) = r | ENABLE;
OP (Firma: haa) #6115939
Lesenswert?

>An welche Schnittstelle hast Du da gedacht?
Auf dem FPGA soll ein SPI Slave laufen- er empfängt Daten und legt diese 
ab. Ich möchte genau darauf zugreifen.
Außerdem soll ein HDMI Stream genutzt werden können. ( Einfach nur weiße 
Pixel auf den sonst schwarzen Stream legen)
>Und mit welchen Nios-Befehlen willst Du mit Deiner Komponente
>kommunizieren?
Habe mal unten ein Beispiel wie ich es jetzt versucht habe.. aber gerne 
verwende ich auch andere Befehle.

@Martin S.
Deine Antwort schaue ich mir noch genauer an. Habe gerade erst mal meine 
Idee getestet. War mir wichtig.
Vielen Dank für deinen Tipp - Vielleicht es ja sogar sowas ähnliches ! 
:D


 *Mein testmodul, was einem Signal die Kombination 101 zuweist (also 5)*
1
 module test1 (
2
input logic clk_s,
3
input logic x,
4
input logic y,
5
output logic sum,
6
output  bit [2:0] t1 
7
);
8

9
always @(clk_s)
10
begin
11
sum <= x + y;
12
t1<=3'b101; //6'b10_0011 => 100011
13
end
14

15
endmodule
* Mein Toplvl Modul was mein testmodul instanziiert und das Signal an 
den NIOS weitergibt... *
1
 
2
module p1(
3
  (* chip_pin = "V11" *) input logic clk,
4
  (* chip_pin = "AH17"  *) input logic reset_n,
5
  (* chip_pin = "W15" *) output logic led,
6
  (* chip_pin = "AA24" *) output logic led2,
7
  (* chip_pin = "Y24" *) input logic key, // y24 erster
8
  (* chip_pin = "W24" *) input logic key2 // w24 =zweiter
9
  
10
  );
11
  
12
  //  Signals 
13
  logic test;
14
  logic raus;
15
  logic x;
16
  logic y;
17
  logic adder_out;
18
  logic out2;
19
  bit  [2:0] adder_out2 ;
20
  
21
  
22
      unsaved u0 (   // NIOS
23
        .clk_clk       (clk),       //   clk.clk
24
        .reset_reset_n (reset_n),  // reset.reset_n
25
      .pio_in_export(adder_out2)  
26
    );
27
  
28
   
29

30

31
   test1 adder( // eigene komponente 
32
   .clk_s(clk),
33
   .x(test),
34
   .y(key2),
35
   .sum(adder_out),
36
   .t1(adder_out2)
37
   );
38
  // eigner COde
39
  always_ff @(posedge clk) begin
40
  
41
  //led2<=key; // non blocking 
42
  test <= key;
43
  end
44
  
45
endmodule
Mein NIOS Programm was das Signal erhält--- 
1
 
2
#include "sys/alt_stdio.h"
3
#include "io.h"
4
#include "alt_types.h"
5
#include "system.h"
6
int main() {
7
  volatile unsigned int * key_ptr = (volatile unsigned int *) 0x80009000;
8
  alt_putstr("Hello from Nios II!\n");
9
  int swValue = IORD(0x80009000, 0);
10
  printf("key: %d", swValue);
11
  /* Event loop never exits. */
12
  while (1) {
13

14
  }
15

16
  return 0;
17
}

Wenn man den NIOS ausführt ( an dieser stelle stürzt eclipse beim copy 
und pasten einfach ab- aber so in etwas steht das da:) - das ist 101 , 
also das was ich oben im testmodul zugewiesen habe..
1
Hello from Nios II! key: 5
OP (Firma: haa) #6133741
Lesenswert?

Hi , ich wollte euch mitteilen, dass es so höchstwahrscheinlich klappt.
Auch wenn man es normalerweise so nicht machen würde.
Ein Beispiel hat bei mir funktioniert:

Ich wählte mir in meinem Toplvl vhdl Modul einen Input Slide. 
Anschließend habe ich diesem Eingangssignal einen Eingang eines 
Test-HDL-Moduls zugewiesen, welche in einer Bitkombination ein 
bestimmtes Bit setzen soll, wenn der Slide-Switch gesetzt ist. Dieses 
Modul leitete ich weiter an einen 8 Bit PIO meines Avalon Busses, an dem 
auch der NIOS angeschlossen ist. Ich hatte nun Zugriff auf diese 8 Bit 
und konnte diese zum Beispiel mit alt_putstr ausgeben.
Außerder war an den Avalon Bus noch ein 8 Bit Ausgang angeschlossen. An 
diesen habe ich meine Daten vom PIO-In weitergeleitet. Der PIO Out 
wiederum war an ein weiteres Test-HDL-Modul angeschlossen, welche die 
Bitkombination toggelte und an die 8 LEDs ausgeben sollte.
Es hat geklappt :DDDD
Man konnte beobachten, dass je nach Slide-Switch-Stellung das eine Bit 
aktiv oder eben deaktiviert war, wobei alles noch invertiert war !

Grüße !

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren