Forum: FPGA, VHDL & Co. Wie Block RAM mit Komponente verbinden


von Läubi .. (laeubi) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich habe eine Komponente (CPU) welche aus einem BlockRAM ihre 
Befehle/Daten lesen soll. Läßt sich auch ohne Probleme synthetisieren, 
wenn ich jezt aber in der Top Entity versuche ein Blockram anzubinden 
wird mir dies immer mit dem Hinweis unterbunden, das es multiple Treiber 
für Daten/Addressbus gibt, einmal meine CPU und einmal das RAM...

Habe im Anhang mal ein Datei mit TOP Entity+RAM+Fehler angehängt.
(Nicht wündern das dort der 16bit Addressbus 16 bit als Komentar hat..)

von Jan M. (mueschel)


Lesenswert?

Das liegt ganz einfach daran, dass es im FPGA keine Möglichkeit für 
bidirektionale Signale gibt. Du musst Dateneingang und Datenausgang 
voneinander trennen.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Hm.. richtig da war doch mal was. Naja dann muß ich mal sehen ob ich den 
rest aufgedröselt kreige in input/output. Also kann ich im Prinzip 
innerhalb des FPGA garkeinen "bus" der von mehreren Komponenten geteilt 
wird aufbauen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Also kann ich im Prinzip innerhalb des FPGA gar keinen "bus" der von
> mehreren Komponenten geteilt wird aufbauen?
Doch, aber wenn du es schafft, so einen Bus zu beschreiben, wird dieser 
Bus in einem Multiplexer abgebildet. Busleitungen mit Tristate Treibern 
gibt es bei Xilinx schon seit Spartan 2 nicht mehr.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ah okay, das erklärt es, die Beschreibung war ursprünglich auf einen 
Sparta-II zugeschnitten und ich nutze es jezt mit nem Spartan-3.
Habe es jezt auch soweit hinbekommen, das einzige ist, wenn ich in 
meiner TOP Entety nicht irgenwas mit den Signalen mache optimiert mir 
die Synthese alles weg weil alles angeblich statische Signale hat??
1
.
2
.
3
.
4
    signal RAMDin  : D_TYPE;
5
    signal RAMDout : D_TYPE;
6
    signal A    : A_TYPE;
7
    signal RW   : std_logic;
8
    for all: CPU use entity WORK.CPU(STRUKTUR);
9
    for all: RAM use entity WORK.RAM(ram_arch);
10
begin
11
    InstRAM: RAM port map(
12
        clk       => CLK,
13
        wr        => RW,
14
        addr     => A,
15
        data_in  => RAMDout,
16
        data_out => RAMDin
17
    );
18
    InstCPU: CPU PORT MAP(
19
        CLK       => CLK,
20
        RESET     => RESET,
21
        Din       => RAMDin,
22
        Dout      => RAMDout,
23
        A         => A,
24
        READWRITE => RW
25
    );
26
    
27
    -- Ohne Diesen Prozess wird das ganze Design wegoptimiert
28
    blabla : process(CLK)
29
        begin
30
            if CLK='1' and CLK'event then
31
                if RESET='1' then
32
                    IO <= (others => '0');
33
                else
34
                    IO <= RAMDout;
35
                end if;
36
            end if;
37
        end process;
38
39
end SoftCore;
IO ist dabei einfach ein Ausgangsport welcher der CPU später ermöglichen 
soll ein paar LEDs blinken zu lassen...

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.