Forum: FPGA, VHDL & Co. Hyperram ohne nios 2 ?


von FPGA Neuling (Gast)


Lesenswert?

Hallo,

ich habe mir das Cyclone 10 LP Entwicklungsboard von intel zugelegt. Auf 
diesem ist Hyperram vorhanden. Es gibt einige Tutorials, in denen der 
Hypperram auch angesteuert wird. Diese habe ich bereits durchgearbeitet. 
Darin wird dann mittels QSys Plattform Designer z.B. ein Nios 2 
eingerichtet, der auf den Ram zugreift. Soweit, so gut. Ich als Anfänger 
möchte nun jedoch mal ganz schlicht und einfach mittels VHDL ein paar 
bytes in den Ram schreiben und wieder auslesen... Jedoch fehlt mir das 
Wissen, wie ich so eine "kleine" Aufgabe lösen kann. Kennt ihr ein ganz 
einfaches Tutorial, in dem man wirklich lernt, was man tut und nicht nur 
durchklickt, was geschrieben steht? nach dem Durcharbeiten habe ich Null 
ahnung, wie der Zugreif auf den Speicher überhaupt erfolgt.

Ich habe folgendes probiert: Auch mittels Platform Designer habe ich die 
Hyperbus IP erstellt und generiert. Das qip File habe ich in Quartus 
eingefügt. Ist diese Vorgehensweise grundsätzlich richtig? Und wie mache 
ich nun weiter?

Danke im Voraus

von Donni D. (Gast)


Lesenswert?

Du solltest nicht direkt mit etwas wie RAM anfangen. Klingt nicht nach 
sonderlich viel, komplex klingt es auch nicht, ist es aber. Wenn du es 
trotzdem machen willst Nutz den IPCore und schau dir an wie das Avalon 
Interface funktioniert.

von Weltbester-FPGA Pongo (Gast)


Lesenswert?

Die Frage ist, was du denn bauen möchtest.

Mit "Hyperram" ist sicher das Cypress HyperRAM gemeint, oder?

von FPGA Neuling (Gast)


Lesenswert?

@ Donni D: Ich möchte es auf jeden Fall mit der IP Core realisieren. 
Hast Du ein empfehlendswertes Tutorial für das Avalon Interface? Habe 
auch schon einige Infos dazu durch google gefunden. Aber vielleicht hast 
Du ja einen besonders guten Tipp?

@Weltbester-FPGA Pongo: Ich möchte für den Anfang z.B. einfach Werte, 
die über einen ADC rein kommen im Speicher ablegen und anschließend 
auslesen (und über RS232 an den PC senden). Dies soll eine Übung sein. 
Und ja: Der Hyperram ist vom Hersteller Cypress.

von Duke Scarring (Gast)


Lesenswert?

FPGA Neuling schrieb im Beitrag #5623790:
> Ich möchte für den Anfang z.B. einfach Werte,
> die über einen ADC rein kommen im Speicher ablegen und anschließend
> auslesen (und über RS232 an den PC senden).
Dann würde ich mir erstmal eine passende State-Machine für die Aufgabe 
ausdenken.

Duke

von FPGA Neuling (Gast)


Lesenswert?

Vielen Dank für Deinen Hinweis. Wie geschrieben, habe ich jedoch 
Probleme, den Hyperram anzubinden. Um alles weitere, was nur der 
Beantwortung der Frage für "Weltbester-FPGA Pongo" diente, der wissen 
wollte, was ich vor habe, müsst ihr nicht weiter beachten. Das bekomme 
ich schon hin. Aber danke nochmal.

von Christian G (Gast)


Lesenswert?

Hi, mein tipp, auch noch ziemlich grün hinter den Ohren was die ganze 
hardware design Sache angeht, schaue dir einfach an wie das RAM im QSYS 
instanziert wird, sollten man eigentlich in dessen Haupt-entity finden. 
Was für Signale und Parameter braucht die Komponente? Kopiers nicht 
einfach nur sondern versuche zu verstehn warum und wofür diese gebraucht 
werden, warscheinlich (nur geschätzt da ich das Hyperram nicht kenne) 
Takt, read und write Adressen, data in und out, read und write enable, 
leg diese entspechend in deinem entity an, instanzier damit das RAM, 
schmeiss das QSYS raus (natürlich nicht dessen files aus dem Projekt 
entfernen) und dann brauchste warscheinlich eine statemachine in der du 
die Signale des RAMs, je nachdem was du tun möchtest (schreiben / 
lesen), manipulierst. Sollte gehen ausser ich hab falsch verstanden was 
das Problem ist.

Viel Erfolg.

von C. A. Rotwang (Gast)


Angehängte Dateien:

Lesenswert?

FPGA Neuling schrieb im Beitrag #5623027:
> Jedoch fehlt mir das
> Wissen, wie ich so eine "kleine" Aufgabe lösen kann. Kennt ihr ein ganz
> einfaches Tutorial, in dem man wirklich lernt, was man tut und nicht nur
> durchklickt, was geschrieben steht? nach dem Durcharbeiten habe ich Null
> ahnung, wie der Zugreif auf den Speicher überhaupt erfolgt.

Tutorial ist der falsche Ansatz, du musst dir ein Datenblatt nehmen und 
daraus die Ansteuerung ermitteln. Sowas wird an der Hochschule in 
Fächern wie Digitaltechnik unterrichtet. Oder schau mal in eine 
Quellcodesammlung wie opencores.org.

Für den Einstieg kanns du ja mit einem internen SRAM üben, der Cyc10-LP 
hat etliche davon. Dazu nimmst du einen RAM: 1-Port aus dem IP - Catalog 
(siehe Anhang).

Dann bastelst du eine statemachine drumherum und schaust dir das in der 
Simu an und überlegst dir eine Testschaltung (BIST) mit der du das ganze 
testest, eventuell hilft Signal-Tap.
Dann Uart und ADC drm und das meiste steht erst mal. Jetzt kann man sich 
dran machen den internen RAM durch den externen Hyperram (im prinzip 
SRAM mit DDR-dateninterface) ersetzen.

von FPGA Neuling (Gast)


Lesenswert?

Danke nochmal an alle für die Tipps. Ich leider jetzt erst dazu 
gekommen, weiter zu machen.

C.A. Rotwang:

Diese Vorgehensweise hat mir sehr geholfen. ich habe einen 1-Port Ram 
angelegt, und eine Statemachine zum Füllen geschrieben. Ich habe es zum 
Testen so gemacht, wenn ich button1 drücke, wird gelesen. Button 2-4 
füllen an Adresse 0x01 einfach eine 1, 3 oder 7, die ich mir über LEDs 
anzeigen lasse. Ich habe eine Testbench erzeugt und es mir in Modelsim 
angeschaut. Dort funktioniert es scheinbar, wie ich möchte. Wenn ich es 
aber auf den FPGA lade, dann leuchtet eine beliebige LED, wenn ich einen 
button drücke. Und zwar manchmal mehrmals hintereinander die gleiche 
LED, manchmal aber auch eine andere für ein und denselben Button. Kann 
mir vielleicht jemadn weiter helfen? Anmerkung: bitte achtet nicht auf 
die Entity bezeichnungen. Ich wollte erst SDRAM nehmen, hab ich jetzt 
aber doch nicht.
1
library IEEE; 
2
use IEEE.STD_LOGIC_1164.ALL; 
3
use IEEE.NUMERIC_STD.ALL; 
4
 
5
entity SDRAM1 is 
6
    Port ( clk  : in  STD_LOGIC; 
7
        reset: in std_logic;
8
        button1: in std_logic;
9
        button2: in std_logic;
10
        button3: in std_logic;
11
        button4: in std_logic;
12
           leds : out STD_LOGIC_VECTOR(3 downto 0)
13
       ); 
14
end SDRAM1; 
15
 
16
architecture Behavioral of SDRAM1 is 
17
18
  signal x : std_logic_vector (3 downto 0) := (others=>'0');  
19
20
  type state_type is (state_decision, state_read, state_write);
21
  signal state : state_type;
22
  
23
  --für Ram
24
  signal myAddress : std_logic_vector (9 downto 0) := (others=>'0');
25
  signal myData    : STD_LOGIC_VECTOR (13 DOWNTO 0);
26
  signal myWren    : std_logic;
27
  signal myQ       : std_logic_vector (13 downto 0);
28
  
29
  Component ram1 IS
30
    PORT
31
    (
32
      address  : IN STD_LOGIC_VECTOR (9 DOWNTO 0);
33
      clock    : IN STD_LOGIC  := '1';
34
      data    : IN STD_LOGIC_VECTOR (13 DOWNTO 0);
35
      wren    : IN STD_LOGIC ;
36
      q       : OUT STD_LOGIC_VECTOR (13 DOWNTO 0)
37
    );
38
  END component ram1;
39
  
40
  
41
42
  
43
  begin 
44
    Ram1_1: Ram1 port map (
45
              address=>myAddress, 
46
              clock=>clk, 
47
              data=>myData, 
48
              wren=>myWren, 
49
              q=>MyQ);
50
    
51
    process (clk, reset)
52
    begin  
53
      if (reset = '1') then
54
        state <= state_decision;
55
      elsif (rising_edge(clk)) then
56
        case state is
57
          
58
          when state_decision =>
59
            if button1 = '0' then
60
              myAddress <= "0000000001";
61
              state <= state_read;
62
            elsif button2 = '0' then
63
              myAddress <= "0000000001";
64
              myData <= "00000000000001";
65
              myWren <='1';
66
              state<=state_write;
67
            elsif button3 = '0' then
68
              myAddress <= "0000000001";
69
              myData <= "00000000000010";
70
              myWren <='1';
71
              state<=state_write;
72
            elsif button4 = '0' then
73
              myAddress <= "0000000001";
74
              myData <= "00000000000100";
75
              myWren <='1';
76
              state<=state_write;
77
            else
78
              state <= state_decision;
79
            end if;
80
          
81
          
82
          when state_read =>
83
               x<=myQ(3 downto 0);
84
              state <= state_decision;
85
          
86
          
87
          when state_write =>
88
              myWren <='0';
89
              state<= state_decision;
90
          
91
          
92
          when others =>
93
            state <= state_decision;
94
        
95
        end case;
96
      end if;
97
    end process; 
98
    
99
    leds <= not x;    -- Signal x an LEDs ausgeben 
100
  
101
  
102
end Behavioral;

von C. A. Rotwang (Gast)


Lesenswert?

FPGA Neuling schrieb im Beitrag #5640079:
> Kann
> mir vielleicht jemadn weiter helfen?

erzeug mit einem simulator ein wave-diagramm der signale am ram und 
vergleich die mit der Darstellung im Datenblatt.

Benutze "Signal Tap" zur Aufzeichnung der Signale am RAM und vergleiche 
diese mit dem Datenblatt.

von Markus F. (mfro)


Lesenswert?

FPGA Neuling schrieb im Beitrag #5640079:
> Wenn ich es
> aber auf den FPGA lade, dann leuchtet eine beliebige LED, wenn ich einen
> button drücke.

Hast Du deine Taster-Signale vernünftig entprellt und einsynchronisiert?

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.