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..)
Das liegt ganz einfach daran, dass es im FPGA keine Möglichkeit für bidirektionale Signale gibt. Du musst Dateneingang und Datenausgang voneinander trennen.
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?
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.