www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Ram vom Cyclone FPGA lesen


Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe eine Cyclone II FPGA und möchte das RAM ( mit dem 
one-port Ram von Altera )ansprechen und wieder auslesen.
 LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE IEEE.numeric_std.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


--  Entity Declaration

ENTITY block_name IS
  -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
    -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE!
  PORT
  (
    clock : IN STD_LOGIC;
    resultim : IN STD_LOGIC_VECTOR(23 downto 0);
    ausgang2 : OUT STD_LOGIC_VECTOR(31 downto 0);
    summe : out std_logic_vector ( 11 downto 0 );
    adresse : buffer std_logic_vector (11 downto 0);
    speicher : in Std_logic_vector (31 downto 0);
    writeenable : out std_logic
  );
  -- {{ALTERA_IO_END}} DO NOT REMOVE THIS LINE!
  
END block_name;


--  Architecture Body

ARCHITECTURE aufsummiererimaginaerteil_architecture OF block_name IS
signal zaehler : natural range 0 to 12;

BEGIN
writeenable <= '1';
process (clock  ) 
begin
If clock = '1' and clock'event then

  if zaehler = 12 then 
    zaehler <= 0;
  else zaehler <= zaehler + 1;
  end if;
 
  ausgang2 <= resultim + speicher;

case zaehler is 
when 0 => adresse <= "000000000000";
when 1 => adresse <= "000000001000";
when 2 => adresse <= adresse + "1000";
when 3 => adresse <= adresse + "1000";
when 4 => adresse <= adresse + "1000";
when 5 => adresse <= adresse + "1000";
when 6 => adresse <= adresse + "1000";
when 7 => adresse <= adresse + "1000";
when 8 => adresse <= adresse + "1000";
when 9 => adresse <= adresse + "1000";
when 10 => adresse <= adresse + "1000";
when 11 => adresse <= adresse + "1000";
when 12 => adresse <= adresse + "1000";
end case;
end if;
end process;
END aufsummiererimaginaerteil_architecture;

dabei sind read und write-Adresse gleich, leider wird nur aus der 
allersten Adresse gelesen( Speicher gibt den Wert aus dem Ram an). liegt 
das am Code oder am Baustein, wie muss ich ihn dann einstellen, damit er 
den wert der aktuellen Adrese liest? MfG

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, entweder:
USE IEEE.numeric_std.ALL;
oder
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

In sich konsistent/besser ist die erste Bibliothek (numeric_std).

Welchen Speicher willst Du verwenden? Internen? Externen?

Hast Du eine Testbench dazu? Hast Du schonmal simuliert?

Das sieht sehr redundant aus:
when 2 => adresse <= adresse + "1000";
when 3 => adresse <= adresse + "1000";
when 4 => adresse <= adresse + "1000";
when 5 => adresse <= adresse + "1000";
when 6 => adresse <= adresse + "1000";
when 7 => adresse <= adresse + "1000";
when 8 => adresse <= adresse + "1000";
when 9 => adresse <= adresse + "1000";
when 10 => adresse <= adresse + "1000";
when 11 => adresse <= adresse + "1000";
when 12 => adresse <= adresse + "1000";

Duke

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja der geschriebene Code läuft so wie er soll, die Speicheradresse fürs 
Ram ändert sich mit jedem Takt, trotzdem wird immer wieder der gleiche 
Wert vom Ram aus gelesen, deshalb weiß ich nicht, ob der Rambaustein 
richtig eingestellt ist. Hat jemand vllt schon mal  mit dem
one-port Ram von Altera gearbeitet und kann mir helfen?

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abgesehen davon, das ich keine richtige Antwort auf meine Fragen 
erkennen kann:

Roman schrieb:
> trotzdem wird immer wieder der gleiche
> Wert vom Ram aus gelesen
Vielleicht, weil in jeder Speicherstelle das gleiche drinsteht?

Duke

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich habe auch schonmal simuliert und in jeder Speicher zelle steht 
auch der selbe Wert drin  bis er sich nach einer Runde wieder erhöhen 
soll ( wenn alle cases durchgespielt wurden, dann erhöht sich ausgang2, 
ausgang2 wiederum ist gleichzeitig der DatenEingang des Ram bausteines) 
. Allerdings ändert sich Ausgang2 mit jedem clocktakt statt für die 12 
cases den gelichen Wert anzunehmen. Ich nehme übrigens den internen 
Speicher

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.