Forum: FPGA, VHDL & Co. Blockram mit Statemaschine ansprechen


von Klaus S. (profi_sa)


Angehängte Dateien:

Lesenswert?

bin auf der Suche nach einer Statemaschine um einen  Ramblock, generiert
mit einem Core Generator zu lesen und zu beschreiben.
Das Beispiel dieser Statemaschine sollte mir als Anregung dienen, wie
Profis hier vorgehen.
Das vorhandene generierte Blockram hat sowohl Schreib und Lese Address
und Datenleitungen. Ein Lese und Schreibtakt ist ebenfalls vorhanden.
Der Anhang enthält die Beschreibung meines Blockrams.PI und PO sind 
Parity Signale und vorerst ohne Bedeutung
Die Statemaschine sollte als Organisationsprogramm dienen das gesamte
Ram als Block zu verwalten.
Wo finde ich entsprechende Beispiele?

von Falk B. (falk)


Lesenswert?

@ Klaus S. (profi_sa)

>bin auf der Suche nach einer Statemaschine um einen  Ramblock, generiert
>mit einem Core Generator zu lesen und zu beschreiben.

Ist eigentlich recht einfach.

>Das vorhandene generierte Blockram hat sowohl Schreib und Lese Address
>und Datenleitungen. Ein Lese und Schreibtakt ist ebenfalls vorhanden.

VORSICHT! Fang erstmal klein an und nim einen RAM mit EINEM Takt. Dual 
Port  mit asynchronen Takten kommt drei Semester später.

Dein Anang ist ar komisch. Soll das ein asynchroner RAM sein? Wenn ja, 
Finger weg! Nimm einen ganz normalen synchronen BlockRAM.

>Die Statemaschine sollte als Organisationsprogramm dienen das gesamte
>Ram als Block zu verwalten.

Was gibt es da zu verwwalten? Du kannst recht einfach reinschreiben und 
lesen.

Adresse anlegen -> Daten erscheinen 1 Takt später am Ausgang
Adresse, Daten und WE anlegen -> Daten werden geschrieben

>Wo finde ich entsprechende Beispiele?

Mal ein ganz einfaches Beispiel.
1
process(clk)
2
begin
3
  if rising_edge(clk) then
4
    case state is
5
6
      when idle =>
7
        if do_write = '1' then
8
          state <= write;
9
          adr <= adr_wr;
10
          data <= data_in;
11
          we <= '1';
12
        elsif do_read='1' then
13
          adr <= adr_rd;        
14
        end if;
15
16
      when write =>
17
        we <= '0';
18
        state <= idle;
19
20
    end case;
21
  end if;
22
end process;

MFG
Falk

von profi_sa (Gast)


Lesenswert?

Danke Falk für deine schnelle Antwort.
Du schreibst mein Anhang ist komisch. Bei Actel erzeugt der 
Makrogenerator einfach so ein Ram. Ich habe dort jedoch noch die 
Möglichkein synchron und asynchron auszuwählen.Die Frage ist noch,wieso 
ist asynchron als Modell ungeeigneter!
Mit der vorgegeben Struktur muß ich versuchen zurecht zu kommen.Der 
Makrogenerator konfiguriert nach Actel die im FPGA eingebauten 
Ramkomponenten optimal. Bei selbstgebauten Modellen als Array kommt beim 
Synthetisieren die Warnmedung nicht synthetisierbar.

von Falk B. (falk)


Lesenswert?

@ profi_sa (Gast)

>Du schreibst mein Anhang ist komisch. Bei Actel erzeugt der
>Makrogenerator einfach so ein Ram. Ich habe dort jedoch noch die
>Möglichkein synchron und asynchron auszuwählen.

Dann wähle einen SYNCHRONEN aus.

>Die Frage ist noch,wieso
>ist asynchron als Modell ungeeigneter!

Weil so ziemlich alle Software auf den Entwurf synchroner Systeme 
ausgelegt ist.

MFG
Falk

von guo (Gast)


Lesenswert?

Falk, was machst Du da mit den beiden unterschiedlichen Adressen read 
und write? Ist das eine Generatorsicht?

Was er doch eher braucht ist ein Interface für das RAM, oder ?

von Klaus S. (profi_sa)


Lesenswert?

die letzte Bemerkung trifft genau mein Problem!


Bin weiter gespannt auf weiterbringende Vorschläge um die vorliegende 
Struktur   zu bearbeiten d.h.Lese und Schreibzykluse organisiert 
auszuführen.
mfG
Klaus

von Falk B. (falk)


Lesenswert?

@  guo (Gast)

>Falk, was machst Du da mit den beiden unterschiedlichen Adressen read
>und write? Ist das eine Generatorsicht?

Ja klar, die State Machine soll den RAM ansteuern. Dazu kann man zwei 
verschiedene Adressen verwenden, eine zuzm Schreiben, eine zum Lesen.

>Was er doch eher braucht ist ein Interface für das RAM, oder ?

???
Das ist doch schon da. Nämlich die Pins vom RAM. Die müssen nun sinnvoll 
angesteuert werden.

@ Klaus S. (profi_sa)

>Bin weiter gespannt auf weiterbringende Vorschläge um die vorliegende
>Struktur   zu bearbeiten d.h.Lese und Schreibzykluse organisiert
>auszuführen.

???
Was erwartest du? Dass dir die gebratenen Tauben in den Mund fliegen? 
Ich hab dir nen Ansatz gezeigt. Den Rest must du dir schon selber 
erarbeiten.

MFG
Falk

von profi_sa (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Falk,

Du träumst schon von gebraten Tauben.Ich bin weit davon entfernt.

Nochmals zu meiner Problemstellung.

Habe mit dem Core Generator ein Rammodel ceirrt, welches ich als Anhang 
beigefügt habe. Du hast im ersten Ansatz diese Ramkomponente komisch 
gefunden. Die Realität ist aber so.Ich kann auch ein synchrones Rammodel 
generieren lassen. Der Unterschied ist nur, dass als Eingangssignal 
nioch ein Read und Writeclock hinzukommt.Dieses Modell ist als Anhang 
beigefügt.
Ich habe die Vorstellung dass in Insiderkreisen für bausteinspezifische 
Rammodelle schon fertige Statemaschinen vorliegen müßten. Ich benütze 
hier Actel als FPGA Hersteller. Doch ein Blick zu Xilinx zeigte mir 
ähnliche Modelle, die mit Codegeneratoren erzeugt wurden.
Um das Ram für den Lese und Schreibbetrieb einzurichten ist eine 
Statemaschine mit umfangreichen Funktionen einzurichten. Ich dachte,ich 
könnte hier auf bereits fertige Lösungen zugreifen. Ich beabsichtige das 
Ram im FPGA so zu benutztn wie man es bei der Softwareprogrammierung her 
gewöhnt ist, wie z.B das ganze Ram löschen oder Informationen auf 
bestimmte Addressen schreiben und lesen. Für diese Aufgaben gibt es doch 
sicher bereits bewährte Lösungsansätze. Das würde ich als Beispiel 
suchen.

von Falk B. (falk)


Lesenswert?

@ profi_sa (Gast)

Gewagter Name  . . .


>gefunden. Die Realität ist aber so.Ich kann auch ein synchrones Rammodel
>generieren lassen. Der Unterschied ist nur, dass als Eingangssignal
>nioch ein Read und Writeclock hinzukommt.Dieses Modell ist als Anhang
>beigefügt.

Die Signalnamen sind alles andere als verständlich. Ich tippe mal, dass 
WRB der Schreibtakt sein soll. Und wer diesen Core-Generator verbrochen 
hat gehört auch geschlagen. Egal. Auf jeden Fall. Nimm einen 
synchronen RAM.

>Ich habe die Vorstellung dass in Insiderkreisen für bausteinspezifische
>Rammodelle schon fertige Statemaschinen vorliegen müßten.

Nöö, nur die RAM-modelle an sich. Die Ansteuerung ist Anwendersache.

>Um das Ram für den Lese und Schreibbetrieb einzurichten ist eine
>Statemaschine mit umfangreichen Funktionen einzurichten. Ich dachte,ich
>könnte hier auf bereits fertige Lösungen zugreifen.

Eher nicht.

> Ich beabsichtige das
>Ram im FPGA so zu benutztn wie man es bei der Softwareprogrammierung her
>gewöhnt ist, wie z.B das ganze Ram löschen oder Informationen auf
>bestimmte Addressen schreiben und lesen.

Geht so ohne weiteres nicht. VHDL ist keine Programmiersprache wie 
BASIC, C etc.!

> Für diese Aufgaben gibt es doch
>sicher bereits bewährte Lösungsansätze. Das würde ich als Beispiel
>suchen.

Hab ich dir gegeben. Der "Programmablauf", wie er in C geschrieben 
werden würde, muss hier als Ablauf in einer State-Machine programmiert 
werden. Nur dass die Abstraktionsebene VIEL näher an der Hardware ist. 
Das ist eher mit Assembler vergleichbar, teilweise noch darunter! Sowas 
wie

memcopy(a,a)
memclr(a)

kannst du in VHDL vergessen.

MFG
Falk

von Klaus S. (profi_sa)


Lesenswert?

Hallo Mr.Falk,

Durch deine schnelle Antwort hast du vieleicht jeden weiteren 
Lösungsansatz abgewürgt.Du schreibst sehr viel,nur nichts zum 
eigentlichem Problem.
Dein Lösungsansatz ist zu trivial und geht auf die Problematik generetic 
erzeugte Memories und real memories in FPGA nicht ein.Um das erzeugte 
Ram über VHDL anzusprechen müßte meiner Meinung nach ein Array Model als 
Typ eingeführt werden.
Meine Anfrage im Forum zielte darauf hinaus ab, wie Insider hier 
allgemein vorangehen und ein passendes Beispiel als Lösungsansatz 
geliefert zu bekommen.

Ich bin noch unerfahren in diesem Bereich.

mfG
Klaus

von Philip K. (plip)


Lesenswert?

@Klaus

..die Problematik generetic
erzeugte Memories und real memories in FPGA..

Was soll das bedeuten?

In Xilinx User Guides findet man Beispiele zu RAM-Beschreibungen, die 
von ISE als solche rekannt werden.
Wird da in etwa immer so gemacht:
1
entity RAM_16Bit_readfirst is
2
  generic(
3
      LP  : integer range 2 to 10 := 10;           -- Adressbusbreite
4
      size: integer range 2 to 1024  := 1024      -- Speichergroeße
5
  );
6
  port (  
7
    ADDR  : in unsigned(LP-1 downto 0);            -- Adresse Port 
8
    DI    : in std_logic_vector(15 downto 0);      -- Dateneingang  
9
    DO    : out std_logic_vector(15 downto 0);    -- Datenausgang  
10
    clk  : in std_logic;                                -- Clock Port 
11
    WE    : in std_logic;                             -- Write-Enable Port 
12
    CE    : in std_logic                            -- Chip-Enable Port 
13
  );
14
end RAM_16Bit_readfirst;
15
16
architecture bhv of RAM_16Bit_readfirst is
17
  type ram_type is array (size-1 downto 0) of std_logic_vector (15 downto 0);
18
  signal RAM : ram_type := (others => X"0000");
19
begin
20
  process (clk)
21
  begin
22
    if (rising_edge(clk)) then
23
      if (CE = '1') then
24
        if (WE = '1') then
25
          RAM(to_integer(ADDR)) <= DI;
26
        end if;
27
        DO <= RAM(to_integer(ADDR));
28
      end if;
29
    end if;
30
  end process;
31
    
32
end bhv;

Wolltest Du sowas wissen? Werd leider aus Deinen Ausführungen nicht ganz 
schlau.

von Michael N. (bigmike47)


Lesenswert?

Klaus S. wrote:

> Meine Anfrage im Forum zielte darauf hinaus ab, wie Insider hier
> allgemein vorangehen und ein passendes Beispiel als Lösungsansatz
> geliefert zu bekommen.

genau das hat Falk dir ja geliefert. Was hast du denn fuer 
wunschvorstellungen? und was bitte ist ein generetic erzeugtes memory???

von Falk B. (falk)


Lesenswert?

@ Klaus S. (profi_sa)

>Durch deine schnelle Antwort hast du vieleicht jeden weiteren
>Lösungsansatz abgewürgt.

???

>Du schreibst sehr viel,nur nichts zum eigentlichem Problem.

????????????????????????????

Die Tatsache, dass du nichts von dem was ich dir schreibe verstehst, 
kann zwei Ursachen haben

- ich drücke mich undeutlich aus
- du bist begriffsstutzig

Was davon zutrifft sollen mal andere entscheiden.

>Dein Lösungsansatz ist zu trivial und geht auf die Problematik generetic
>erzeugte Memories und real memories in FPGA nicht ein.Um das erzeugte
>Ram über VHDL anzusprechen müßte meiner Meinung nach ein Array Model als
>Typ eingeführt werden.

NEIN! Dein Memory ist eine Black Box (Entity), deren Innenleben dir zu 
99% egal sein kann. Einzig und allein die Schnittstelle mit 
Adress/Datenbus und Steuersignalen ist relevant.

>Meine Anfrage im Forum zielte darauf hinaus ab, wie Insider hier
>allgemein vorangehen und ein passendes Beispiel als Lösungsansatz
>geliefert zu bekommen.

Das habe ich getan.

>Ich bin noch unerfahren in diesem Bereich.

Ist mir nicht entgangen. Dann wäre es sinnvoll, sich mal die Grundlagen 
anzueignen, bevor du in die hohen Sphären einsteigst.

Prozesse, Signale, State Machines. Wenn das wirklich klar ist, dann 
kannst du auch Speicher ansteuern.

MfG
Falk

von profi_sa (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Falk du bist immer aktiv!!

Da mein Problem bis jetzt nicht erkannt wurde, will ich nochmals 
versuchen es besser darzustellen

Ich habe ein Rammodell mit einem Makro genneriert. Das Kenstück des 
Makros ist ein Ram der Struktur component RAM256x9SST (siehe Anhang)
Die Komponente RAM256x9SST ist im Verhalten nicht weiter dokumentiert. 
Die Beschreibung der Pins ist vorhanden ebenso die zeitlichen Bedingung 
für die Ansteuerung dieser Pins im DatenBlatt vom FPGA.(wie bei 
RAMbausteinen üblich)

Hier nochmals die Festlegungen vom Makro generiert:

entity ram512_8_sync is
   port(DO : out std_logic_vector (7 downto 0);
      RCLOCK : in std_logic;
      WCLOCK : in std_logic;
      DI : in std_logic_vector (7 downto 0);
      PO : out std_logic;
      PI : in std_logic;
      WRB : in std_logic;
      RDB : in std_logic;
      WADDR : in std_logic_vector (8 downto 0);
      RADDR : in std_logic_vector (8 downto 0);
      WPE : out std_logic;
      RPE : out std_logic);
end ram512_8_sync;

von den obigen Pins bleiben nur folgende die Bedeutung haben,übrig.

Clock  -->      RCLOCK : in std_logic;
       -->      WCLOCK : in std_logic;
Datenbus  -->       DO : out std_logic_vector (7 downto 0);
          -->       DI : in std_logic_vector (7 downto 0);
Schreibimpuls -->   WRB : in std_logic;
Lese          -->   RDB : in std_logic;
Addresse      -->      WADDR : in std_logic_vector (8 downto 0);
              -->      RADDR : in std_logic_vector (8 downto 0);

Hier handelt es sich um ein Dualportram für gleichzeitiges Lesen und 
Schreiben.Diese Funktion möchte ich vorerst garnicht nützen.Man kann 
also Schreib und Leseadressen zusammenführen.

Das Ram im FPGA ist also wie ein externes Ram zu betrachten.
Um ein externes Ram anzusteuern benötige ich eine Ablaufsteuerung 
geschrieben in VHDL.Hier müßte es doch fertige Lösungen geben. So eine 
Lösung suche ich!

Dies ist was ich als Beispiel von irgendeiner anderen Konstellstion 
suche.

Ich kann nicht wie im Vorschlag von Falg auf eine Arraystruktur 
zugreifen, sondern muß die Pins über genau definierte  zeitliche 
Signalpegel ansteuern.Nebenbei sind die die Vorgaben und Ergebisse auch 
noch zu verwalten.

mfG

Klaus

von Michael N. (bigmike47)


Lesenswert?

ich glaube eher, du hast dein problem selbst noch nicht erkannt. Das 
Beispiel von Falk macht naemlich genau das, auf eine Array-Struktur des 
RAMs selbst wird da nie zugegriffen. Einfach wenn man schreiben will, 
bei steigender Clockflanke Enable setzen, Daten u Addresse anlegen u 
fertig. Lesen ebenso. Das ist dir jetzt schon zig mal erklaert u gezeigt 
worden u du verstehst es scheinbar immer noch nicht. Keine Ahnung wie 
man das sonst noch erklaeren koennte.

von Philip K. (plip)


Lesenswert?

Wie die Ansteuerung Deines RAM aussieht hängt doch davon ab, was Du 
damit machen willst. Was soll es da für eine fertige Lösung geben? Mit 
dem RAM an sich hast Du doch bereits eine hohe Abstraktionsebene. Ich 
beschäftige mich auch erst seit ein paar Monaten mit VHDL aber RAMs sind 
nun wirklich eins der eher kleineren Probleme.
Und was das Zeitverhalten angeht machst Du Dir glaub ich wirklich zu 
viele Gedanken. Solange Deine Taktfrequenz im Rahmen des machbaren ist, 
passt doch alles.
Vielleicht schreibst Du einfach mal ganz konkret, was Du machen willst.

von Falk B. (falk)


Lesenswert?

@ profi_sa (Gast)

>Die Beschreibung der Pins ist vorhanden ebenso die zeitlichen Bedingung
>für die Ansteuerung dieser Pins im DatenBlatt vom FPGA.(wie bei
>RAMbausteinen üblich)

Na super. Was brauchst du mehr?

>Das Ram im FPGA ist also wie ein externes Ram zu betrachten.

Nein. Es ist einfacher anzusteuern, nämlich ganz normal al synchroner 
Schaltungsblock.

>Um ein externes Ram anzusteuern benötige ich eine Ablaufsteuerung
>geschrieben in VHDL.Hier müßte es doch fertige Lösungen geben.

Für exteren RAMS (DRAM, SDRAM, DDR) gibt es Module.

Anwendermodul <--> RAM-Controller <--> externer RAM

Die brauchst du aber nicht, weil dei interner RAM WESENTLICH einfacher 
anzusteuern ist.

Anwendermodul <--> interner RAM

Bleibt nur noch DEIN SPEZIELLES Modul übrig. Das kann dir KEINER 
abnehmen.

>Ich kann nicht wie im Vorschlag von Falg auf eine Arraystruktur
>zugreifen, sondern muß die Pins über genau definierte  zeitliche
>Signalpegel ansteuern.

Genau das habe ich mehrfach versucht darzustellen.

>Nebenbei sind die die Vorgaben und Ergebisse auch
>noch zu verwalten.

Das musst du selber machen. IST SO!

MfG
Falk

von profi_sa (Gast)


Lesenswert?

Hallo Falg als eifriger Verfolger meiner Hilferufe!!

Deine Bemerkung bei letzter Nachricht macht mir noch zu schaffen.
-----------------------------------------------------------------------
Nein. Es ist einfacher anzusteuern, nämlich ganz normal als synchroner
Schaltungsblock.
-----------------------------------------------------------------------

Frage:

Wie schaut den dieser synchrone Schaltungsblock aus?

Ich kann bei der generierten Ramkomponenete keine Struktur erkennen.
Die Unterkomponente RAMM256x9SST ist eine Bibliothekskomponente. Hier 
sind nur die Ports und das Zeitverhaltern beschrieben.Doch die Ports 
über das Zeitverhalten anzusprechen braucht eine Statemachine. Diese zu 
schreiben bereitet mit im Moment Probleme.

Bitte kurz den Lösungsansatz andeuten.

Gruß

Klaus

von Falk B. (falk)


Lesenswert?

@ profi_sa (Gast)

>Hallo Falg als eifriger Verfolger meiner Hilferufe!!

Bitte mit k.

>Nein. Es ist einfacher anzusteuern, nämlich ganz normal als synchroner
>Schaltungsblock.

>Wie schaut den dieser synchrone Schaltungsblock aus?

Dein erzeugtes RAM-modul IST ein synchroner Schaltungsblock.

>Ich kann bei der generierten Ramkomponenete keine Struktur erkennen.
>Die Unterkomponente RAMM256x9SST ist eine Bibliothekskomponente. Hier

Das muss und soll dich auch gar nicht interessieren. Es ist eine Black 
Box.

>sind nur die Ports und das Zeitverhaltern beschrieben.Doch die Ports

Das reicht.

>über das Zeitverhalten anzusprechen braucht eine Statemachine. Diese zu
>schreiben bereitet mit im Moment Probleme.

>Bitte kurz den Lösungsansatz andeuten.

Das habe ich bereits vor langer Zeit! Siehe hier.

Beitrag "Re: Blockram mit Statemaschine ansprechen"

E.O.D.

MfG
Falk

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.