Forum: FPGA, VHDL & Co. Wishbone-Bus als VHDL-Record


von pks (Gast)


Lesenswert?

Servus,

gibts hier jemanden, der Records verwendet um Wishbone(oder andere) 
Busse übersichtlicher darzustellen?
Falls ja, wie geht ihr mit unterschiedlichen Busbreiten um? Für jede 
Breite ein eigenes Record definieren? Meines Wissens kann ich einem 
Record ja keine Parameter übergeben. Oder irre ich mich?

Gruß

von P. K. (pek)


Lesenswert?

Vielleicht so (im Package)?
Der Record ist natürlich nicht Wishbone, aber so von der Art her...
1
  constant ADR_SUPPMAX          : integer := 2;
2
  
3
  type zPType is record
4
    NrMaxxD       : unsigned(ADR_SUPPMAX-1 downto 0);
5
    MaxTypexS     : std_logic;
6
  end record;

von Duke Scarring (Gast)


Lesenswert?

pks schrieb:
> gibts hier jemanden, der Records verwendet um Wishbone(oder andere)
> Busse übersichtlicher darzustellen?
Ja.

> Falls ja, wie geht ihr mit unterschiedlichen Busbreiten um? Für jede
> Breite ein eigenes Record definieren?
Nein. Einfach nur die benötigten Bits verwenden.

Es ist ja kein Problem, wenn ich z.B. auf den UART einen 32-Bit Zugriff 
mache und nur die unteren 8 Bit lese oder schreibe.

Welche Busbreiten willst Du denn verwenden bzw. verbinden?

Duke

von pks (Gast)


Lesenswert?

Duke Scarring schrieb:
> Nein. Einfach nur die benötigten Bits verwenden.
>
> Es ist ja kein Problem, wenn ich z.B. auf den UART einen 32-Bit Zugriff
> mache und nur die unteren 8 Bit lese oder schreibe.

Wo Du recht hast... :-)

Aber mal zur eigentlichen Definition - muss mann für Ein- und Ausgänge 
separate Records definieren oder kann man irgendwie mischen?

von Array of Recordarray (Gast)


Lesenswert?

Kann man, kommt aber nicht jedes Synthese- oder Simulationstool damit 
klar.

Duke Scarring schrieb:
> Nein. Einfach nur die benötigten Bits verwenden.

Was die Typisierung ad absurdum führt.
MMn nur geeignet für Kenner der fehlerfreien Programmierung...oder 
Verilog-Anhänger, die sinds ja gewöhnt.


pks schrieb:

> Für jede Breite ein eigenes Record definieren? Meines Wissens kann ich
> einem Record ja keine Parameter übergeben. Oder irre ich mich?

Du kannst Sie manchmal noch generisch machen, z.b. "natural range <>" 
und über den Instantiierung die tatsächliche Breite angeben.

bei einem Unterelement eines Record klappt das jedoch nicht.

von pks (Gast)


Lesenswert?

Array of Recordarray schrieb:
> Duke Scarring schrieb:
>> Nein. Einfach nur die benötigten Bits verwenden.
>
> Was die Typisierung ad absurdum führt.

Warum?

Mich nervt es ohnehin immer, wenn Entwickler Adressbits wegschneiden. 
Leider denken FPGA-Entwickler fast immer in Wort-Adressen, was ich sehr 
unschön finde, weil es auch softwareseitig die Adressen von der 
Datenbusbreite abhängig macht. Auch in der Simulation finde ich es 
deutlich schöner, wenn ich immer weiß, dass die Addresse die ich sehe 
eine Byte-Adresse ist. Ich gebe schließe also auch die LSBs immer an 
jedes Modul an und verwende sie dann intern eben nicht.

von Array of Recordarray (Gast)


Lesenswert?

Es ging nicht um Addressen, sondern um Daten.

Dass das problematisch ist stellt sich dann heraus, wenn jemand anderes 
sieht das ein 32 Bit Datenbus in ein Modul reingeht, letzteres aber nur 
8 Bit davon verwendet.

Oder es fällt einem später nicht auf, dass z.b. eine Addition einen 
Überlauf generiert, weil man nur 8 Bit kann, aber bis 9 gerechnet hat.

Das Modul X müsste dann, um so einen Fall abzufangen, schauen ob auf Bit 
8-31 etwas übertragen wird.... und dann?
Einen Fehler ausgeben?
Was wenn Bit 8-15 von Modul Y genutzt werden, welches ebenfalls den 
kompletten Bus empfängt?


Beste Lösung: schon der Compiler haut es dir um die Ohren. Die Minute 
mehr Schreibaufwand schafft Klarheit und erspart stundenlanges Debuggen 
später.

von pks (Gast)


Lesenswert?

Ok, allerdings verwende ich eigentlich immer 32 Bit Datenbus. Und wenn 
ein Modul einen Wb-Port mit z.B. 8-Bit Datenbreite hat, gehört meiner 
Meinung nach eh eine Bridge (32<->8) dazwischen, weil es eigentlich 
nicht der gleiche Bus-Typ ist.

von René D. (Firma: www.dossmatik.de) (dose)


Angehängte Dateien:

Lesenswert?

Ich habe für dich ein Beispiel. Als Busvorlage habe ich den AHB lite Bus 
genutzt. Lite steht für ein Single Core Bus. Ich habe den Reset und den 
Clock nicht in den Record aufgenommen, Wenn ich die Signale in dem 
Record mitgeführt hatte, waren die Fit-Ergebnisse schlechter. Ich habe 
hier mein Record in der der angehangen Datei.

HWDATA und HWDATA1 sind gleichwertige Signale nur um ein Takt 
verschoben. Das war für ein ein paar existierende Slaves notwendig.

Als Beispiel hänge ich dir  noch einen Kopf der Datei eines SPI-SLave 
an. Hier siehst du wie der Bus angebunden wird.
1
library ieee;
2
3
use ieee.std_logic_1164.all;
4
use ieee.numeric_std.all;
5
6
use work.AHBlite.all;
7
8
entity ahb_spi_master is
9
  generic(
10
    slavenumber       : integer                       := 1;
11
    clk_freq          : integer;
12
    HSEL              : integer;
13
    preset_speed      : std_logic_vector (7 downto 0) := "00000100";
14
    preset_shiftwidth : std_logic_vector (7 downto 0) := "00001000"
15
    );
16
17
  port(Hclk     : in  std_logic;
18
       reset    : in  std_logic;
19
       Hbus_in  : in  AHB_in;
20
       Hbus_out : out AHB_out;
21
22
       -- possibile interrupt source 
23
       spi_irq : out std_logic;
24
25
       --Hardwarepins SPI
26
       SPI_clk : out std_logic;         --SPI Clock
27
       SS      : out std_logic_vector(slavenumber-1 downto 0);  --SS slave select
28
       miso    : in  std_logic;         --master in slave out
29
       mosi    : out std_logic          --master out slave in 
30
       );
31
end;  --ahb_spi_master

von Conrad (Gast)


Lesenswert?

Sieht übersichtlich aus. Könnte mir so gefallen.
Es fehlen einfach ein paar praktische Codeschnipsel in der HDL-Welt.

Ist auch sicher aus deiner CPU?

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Conrad schrieb:

> Ist auch sicher aus deiner CPU?

Ja stammte. aus der Mais CPU.

von Tobias P. (hubertus)


Lesenswert?

Hallo,
ich sehe dass da sich jemand mit dem AHB-Bus befasst hat.
Mich würde mal folgendes intressieren:

hat jemand ein Beispiel für einen AXI-Slave in VHDL? Das ist ja, wie der 
AHB, auch so ein ARM-Bus. Ich hab auf OpenCores was gefunden, ist 
allerdings in Verilog, und ich verstehe keine einzige Zeile davon :-)
Ich möchte eigentlich nur einen "ganz einfachen" AXI Slave, den ich mit 
einem ARM Prozessor, der ein AXI Master Interface hat, anbinden kann.

Gruss: Tobias

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Tobias Plüss schrieb:
> Hallo,
> ich sehe dass da sich jemand mit dem AHB-Bus befasst hat.
> Mich würde mal folgendes intressieren:
>
> hat jemand ein Beispiel für einen AXI-Slave in VHDL? Das ist ja, wie der
> AHB, auch so ein ARM-Bus. Ich hab auf OpenCores was gefunden, ist
> allerdings in Verilog, und ich verstehe keine einzige Zeile davon :-)
> Ich möchte eigentlich nur einen "ganz einfachen" AXI Slave, den ich mit
> einem ARM Prozessor, der ein AXI Master Interface hat, anbinden kann.
>
> Gruss: Tobias

Ich habe kein AXI-Slave für dich.  Vielleicht hilft es dir den Code 
besser zu verstehen.
AXI ist ein Stream Bus. Da werden FIFOs eingesetzt, um den die Daten zu 
Puffern.
Der Busslave verarbeitet die Daten dann wann es Ihm passt.
So grob als Busidee.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

René D. schrieb:
> AXI ist ein Stream Bus. Da werden FIFOs eingesetzt, um den die Daten zu
> Puffern.

Nö. AXI ist eine Sammlung von Protokollen. Eigentlich nur zwei 
grundsätzlich verschiedene.

"Der" AXI ist genaugenommen gar kein Bus sondern ein PtP handshaking 
Protokoll zwischen genau einem Master und einem Slave interface. Ganz 
traditionell werden hier Bursts verschiedener Länge und 
Transfervarianten unterschieden.

AXI Lite ist nur eine stark eingeschränkte und vereinfachte Version von 
AXI.

AXI Stream ist tatsächlich ein Streaming Protokoll und enthält daher 
nicht mal Adressen.

Ob FIFOs eingesetzt werden oder nicht ist nichts worum sich der AXI 
Standard kümmern würde. Generell bleibt die Implementierung des 
Standards dem Anwender überlassen.

Hier mal ein Link zu meinem ex-AG: 
http://www.doulos.com/knowhow/arm/Migrating_from_AHB_to_AXI

Gruß
Marcus

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.