Hallo zusammen,
ich habe in meinem Design einen SJA1000-Core (CAN-Controller) von
OpenCores.org eingesetzt. Er lief auf meinem Spartan 3E wunderbar. Jetzt
möchte ich aber auf einen Spartan 6 wechseln und stelle fest, dass es
Probleme mit dem BlockRAM gibt: Der Core verwendet die RAMB Primitive
RAMB4_S8_S8, RAMB4_S4_S4 und RAMB4_S1_S1. Diese existieren auf dem
Spartan 6 aber nicht mehr. Stattdessen gibt es dort nur noch die
Primitive RAMB8BWER und RAMB16BWER.
Also versuche ich jetzt, bspw. das RAMB4_S8_S8 auf das BWER Primitiv
umzumappen:
Funktionierendes Mapping für Spartan 3E Primitive:
1
RAMB4_S8_S8fifo
2
(
3
.DOA(),
4
.DOB(data_out),
5
.ADDRA({3'h0,wr_pointer}),
6
.CLKA(clk),
7
.DIA(data_in),
8
.ENA(1'b1),
9
.RSTA(1'b0),
10
.WEA(wr&(~fifo_full)),
11
.ADDRB({3'h0,read_address}),
12
.CLKB(clk),
13
.DIB(8'h0),
14
.ENB(1'b1),
15
.RSTB(1'b0),
16
.WEB(1'b0)
17
);
Mein neues Mapping für Spartan 6 Primitive:
1
RAMB8BWERfifo
2
(
3
.DIADI({8'h0,data_in}),
4
.DIPADIP(2'b0),
5
.ADDRAWRADDR({7'b0,wr_pointer}),
6
.WEAWEL({wr&(~fifo_full),wr&(~fifo_full)}),
7
.ENAWREN(1'b1),
8
.REGCEA(1'b0),
9
.RSTA(1'b0),
10
.CLKAWRCLK(clk),
11
.DOADO(),
12
.DOPADOP(),
13
14
.DIBDI(16'h0),
15
.DIPBDIP(2'b0),
16
.ADDRBRDADDR({7'b0,read_address}),
17
.WEBWEU(2'b00),
18
.ENBRDEN(1'b1),
19
.REGCEBREGCE(1'b0),
20
.RSTBRST(1'b0),
21
.CLKBRDCLK(clk),
22
.DOBDO(data_out),
23
.DOPBDOP()
24
);
Mein neues Mapping lässt sich einwandfrei synthetisieren. Nur leider
funktioniert das Design beim späteren Test der CAN-Verbindung nicht. Mit
wird immer der gleiche Wert als Empfangsnachricht angezeigt (was nicht
stimmt).
Wo liegt mein Fehler?
Grüße
Steffen
Ich vermute, dass ich dem Primitive irgendwie seine Parameter mitteilen
muss. Ich habe nur leider überhaupt keine Ahnung, wie das in Verilog
geht.
Offensichtlich wird die Kommentarzeile nach dem Schlüsselwort "synthesis
attribute" geparst - kann das sein?
Steffen Hausinger schrieb:> Offensichtlich wird die Kommentarzeile nach dem Schlüsselwort "synthesis> attribute" geparst - kann das sein?
Aha, "defparam" ist das Zauberwort! Das werde ich gleich ausprobieren!
Hallo Stefan,
ich könnte mir vorstellen, dass es sinnvoll ist, wenn Du das neue
RAM-Modul RAMB8BWER so mit einem Wrapper umwickelst, dass die Ports und
die Funktion des alten RAMB4_S8_S8 dabei rauskommen. Und dann lässt man
die Quelldatei so wie sie ist.
Grüße,
Harald
Wie waere es mit Code, der das Ram "infered" und nicht "instanziiert?
Im angehaengten Code als "write first"
PS: Gibt es einen deutschen Begriffe fuer "infered" ?
Eine "Instanz" kenne ich, und daraus kann man "nstanziieren" ableiten,
aber was ist ein "Infer" aus dem Du "Inferieren" ableitest. Da ist das
gleich Denglich wie "gedownloadet"...
"Ableiten" finde ich in dem Kontext auch nicht so prickelnd...