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?
@ 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
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.
@ 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
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 ?
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
@ 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
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.
@ 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
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
@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.
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???
@ 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
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
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.
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.
@ 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
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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.