Wishbone-Bus als VHDL-Record

Gast #3281173
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ß
#3281184
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;
Gast #3282142
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
Gast #3282173
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?
Gast #3282190
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.
Gast #3282404
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.
Gast #3282484
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.
Gast #3282491
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.
(Firma: www.dossmatik.de) #3288515
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
Angehängte Dateien:
#3301508
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
(Firma: www.dossmatik.de) #3303097
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.
Persönliche Seite #3304327
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

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