Dual-Port RAMs with synchronous Read

Gast #828782
Lesenswert?

Hi,

ich verwende in meinem Design Dual-Port RAMs with synchronous Read (Read 
Trough) and Two Clocks.

Nun beobachte ich beim Test an der Hardware, dass im Mittel nach jeder 
10en FPGA Konfiguartion die Logik nicht wie gewünscht arbeitet. Die 
Funktionen die Informationen vom Dual Output Port benötigen 
funktionieren dann nicht richtig.

Kann das mit der Arbitrationslogik ("Zugriffsverwaltung") des Dual-Port 
RAMs zusammenhängen? Wie wird der Zugriff gesteuert?
Vielleicht sind die Phasenversätze der beiden Taktquellen so ungünstig, 
dass immer nur der Primary Output Port richtig ausgelesen wird und der 
Dual-Port nicht????

Was denkt Ihr dazu?

Gruß Horst
Gast #828809
Lesenswert?

Zielarchitektur ist ein Virtex II FPGA XC2V1000

Die RAM-Blöcke habe ich folgendermaßen implementiert:
--
-- Dual-Port Block RAM with Different Clocks
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ram is
port (clka : in std_logic;
clkb : in std_logic;
wea : in std_logic;
addra : in std_logic_vector(8 downto 0);
addrb : in std_logic_vector(8 downto 0);
dia : in std_logic_vector(31 downto 0);
doa : out std_logic_vector(31 downto 0);
dob : out std_logic_vector(31 downto 0));
end ram;
architecture syn of ram is
type ram_type is array (511 downto 0) of std_logic_vector (15 downto
0);
signal RAM : ram_type;
signal read_addra : std_logic_vector(8 downto 0);
signal read_addrb : std_logic_vector(8 downto 0);
begin
process (clka)
begin
if (clka'event and clka = '1') then
if (wea = '1') then
RAM(conv_integer(addra)) <= dia;
end if;
read_addra <= addra;
end if;
end process;
process (clkb)
begin
if (clkb'event and clkb = '1') then
read_addrb <= addrb;
end if;
end process;
doa <= RAM(conv_integer(read_addra));
dob <= RAM(conv_integer(read_addrb));
end syn;
Gast #828836
Lesenswert?

Das ist ein Beispiel für die Implementierung eines DUAl-Port RAMs von 
Xilinx. Viele Alternativen gibt es nicht, sonst wird die Beschreibung 
nicht als BLOCK RAM implementiert.

Das Abspeichern funktioniert!!! Ich wollte nur mal von euch wissen ob es 
möglich ist, dass die Phasenbeziehung zwischen den Takten (clka und clkb 
haben die gleiche Frequenz aber unterschiedliche externe Quellen) die 
Arbitrierung beeinflusst:
#828844
Lesenswert?

Ja natuerlich kann das sein: Z.B. wenn du an eine Adresse schreibst und 
liest direkt wieder von ihr in der anderen Clockdomaene - das kann 
Probleme geben.

Probier es doch mal, die Ausgaenge zu registrieren. Ich glaube aber 
eher, dass das Problem an irgendeinem anderen unsauberen Uebergang 
zwischen beiden Domaenen ist.
Gast #832893
Lesenswert?

>>Probier es doch mal, die Ausgaenge zu registrieren. Ich glaube aber
>>eher, dass das Problem an irgendeinem anderen unsauberen Uebergang
>>zwischen beiden Domaenen ist.

Wozu sollte man die Ausgänge registrieren? Meiner Meinung nach unnötig. 
Außerdem sollte ein gleichzeitiger Zugriff auf d-bram zu keinen 
Problemen führen.

Hängen bei dir die Phasen unmittelbar voneinander ab?
#832960
Lesenswert?

Hallo Horst,

Wenn Du Deinen Speicher generisch beschreibst, bekommst Du in der 
Simulation keine Warnings mehr, falls Du von beiden Ports aus auf die 
selbe Speicherstelle schreibst bzw. liest und schreibst. Es sei den Du 
implementierst den Test selbst.
Das Xilinx Blockram Model testet solche Sachen und warnt. Dafür 
simuliert es aber auch etwas langsamer :).

Die Ausgänge in Registern buffern würde ich dann machen, wenn die ca. 
2.5 ns Outputdelay nicht stören und der Netzload für die Outputsignale 
nicht zu hoch ist.


Gruß DaMicha.

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