Guten Mittag,
ich versuche eine PLL in einem ICE40UP zu instanziieren und bekomme da
einen sehr seltsamen Fehler.
1
u_osc:SB_HFOSC
2
GENERICMAP(CLKHF_DIV=>"0b00")
3
portmap(
4
CLKHFEN=>nreset,
5
CLKHFPU=>nreset,
6
CLKHF=>HFOSC_CLK_48MHZ
7
);
8
pll0:pow1_pll
9
portmap(
10
REFERENCECLK=>HFOSC_CLK_48MHZ,
11
PLLOUTCORE=>open,
12
PLLOUTGLOBAL=>pll_clk,
13
RESET=>reset
14
);
Die u_osc Instanz ist der interne Oszillator mit seinen 48MHz.
Wenn ich HFOSC_CLK_48MHZ als takt für meine anderen VHDL-Module
verwende, funktioniert alles wunderbar.
Wenn ich aber die pll dazwischen schalte, schlägt der Fitter fehl.
1
I2712: Tool unable to find location for GB curl0.N_8_i_g_gb
2
Error during global Buffer placement
3
E2055: Error while doing placement of the design
4
I2709: Tool unable to complete IOPlacement for the design
Ich weiß auch gar nicht, was das für ein komischer GB sein soll ...
Ich verwende die letzte iceCube2 aus Dez'2017.
Die PLL wurde mit dem Generator von iceCube2 erzeugt - ich hab aber eine
andere PLL, die ich irgendwo gefunden hatte, auch schon ausprobiert -
selber Effekt.
Hat jemand schon mal ähnliche Beobachtungen gemacht?
Viele Grüße,
Mampf
vollständigkeitshalber noch die erzeugte PLL (mit vhdl syntax
highlighting^^):
die Beschreibung in Lattice ist etwas wage, jedoch glaube ich, dass dies
prinzipiell gehen müsste.
GB wird der GlobalBuffer für den Takt sein. Vielleicht musst du noch
manuell einen GB dazwischen instantiieren.
Klakx schrieb:> GB wird der GlobalBuffer für den Takt sein. Vielleicht musst du noch> manuell einen GB dazwischen instantiieren.
Ja das ist seltsam ...
Wenn man den PLLOUTGLOBAL verwendet, funktioniert es nicht (mit oder
ohne zusätzlichem SB_GB).
Wenn man den PLLOUTCORE verwendet, funktioniert es auch nicht - es
scheint aber dann zu funktionieren, wenn man dann noch einen SB_GB an
den Ausgang baut.
Muss ich mir noch weiter anschauen ... Ich war schon fast verzweifelt
...^^
*edit*: Ich frag mich, wieso die ice40 nicht vom normalen Diamon
unterstützt wird ... Dieses iceCube2 ist totaler Mist.
Mampf F. schrieb:> *edit*: Ich frag mich, wieso die ice40 nicht vom normalen Diamon> unterstützt wird ... Dieses iceCube2 ist totaler Mist.
Das liegt an der Geschichte der ICE* FPGAs, die wurden nämlich nicht von
Lattice selber entwickelt sondern von der Firma SiliconBlue, die dann
von Lattice inkl. iceCube2 aufgekauft wurde.
Aber ja, ist schade, dass sie dass in den Jahren seither nicht in
Diamond eingepflegt haben.
Es gibt in der Zwischenzeit eine neue IDE für die UltraPlus FPGAs, nennt
sich Radiant. Das soll wohl mal Diamond ablösen, aber im Moment wird nur
der ICE40-UP unterstützt.
Die UltraPlus Einbindung in IceCube ist sehr schlecht. Da stimmt vieles
nicht, vor allem auch die Timingangaben. Anscheinend willst du mit der
PLL einen 80 MHz Clock erzeugen. Das ist für fast alles viel zu hoch,
meine Erfahrung ist, dass schon 48 MHz meist nicht funktionieren, auch
wenn die Timinganalyse das für gut befindet.
Eine andere Alternative ist Yosys/Icestorm, die freie OpenSource
Toolchain für ICE40. Da wird der UltraPlus auch unterstützt. Synthese
und Routing geht viel schneller, aber die erzeugte Logik ist meist
langsamer, als bei IceCube und Radiant.
Andi schrieb:> Es gibt in der Zwischenzeit eine neue IDE für die UltraPlus FPGAs,> nennt> sich Radiant. Das soll wohl mal Diamond ablösen, aber im Moment wird nur> der ICE40-UP unterstützt.
Vielen Dank für den Tipp!
Hab ich mir runtergeladen und ausprobiert - macht einen wesentlich
besseren Eindruck :)
> Die UltraPlus Einbindung in IceCube ist sehr schlecht. Da stimmt vieles> nicht, vor allem auch die Timingangaben. Anscheinend willst du mit der> PLL einen 80 MHz Clock erzeugen. Das ist für fast alles viel zu hoch,> meine Erfahrung ist, dass schon 48 MHz meist nicht funktionieren, auch> wenn die Timinganalyse das für gut befindet.
Ja, du hast recht ... Das Timing-Tool sagt nun statt 75MHz sowas um die
43MHz ... Schon etwas enttäuschend, aber dafür sind das
Low-Power-Devices.
Mit Radiant trat das PLL-Problem übrigens auch nicht auf ... Das
iceCube2 können die echt in die Tonne treten.
Kann es sein, dass ich der einzige Mensch auf der Welt bin, der die
dedizierten Open-Dran-Outputs der ICE40 für **LEDs** verwenden möchte?
Das ist ein Ding der Unmöglichkeit ... Ich bin wohl echt Xilinx und
Altera verwöhnt, Lattice hat mich schon immer angekotzt und jetzt weiß
ich auch wieder weshalb xD
Ein Beispiel, wo ich wieder nicht weiter komme:
1
entityde1is
2
port(
3
...
4
led_found:outstd_logic;
5
...
6
);
7
8
architectureimpl1ofde1is
9
...
10
11
COMPONENTBB_OD
12
PORT(
13
T_N:INstd_logic:='X';
14
I:INstd_logic:='X';
15
O:OUTstd_logic:='X'
16
B:INOUTstd_logic:='X');
17
);
18
ENDCOMPONENT;
19
...
20
21
begin
22
...
23
led0:BB_ODportmap(
24
T_N=>'1',
25
I=>notfound,
26
O=>led_found,
27
);
28
...
29
endimpl1;
Den Pin led_found hab ich an einen der 3 Pins gehängt, die OD-Outputs
haben.
Jetzt meckert mich der Mapper an, dass das nicht geht:
ERROR - Pin [39], which supports Ports of type [BB_OD or OB_RGB] does
not support placement of Port [led_found] with type [BB_B]. Please check
for the device's IO placement limitations and change the port's locate
Constraint to a compatible pin.
Hat jemand eine Idee, was ich falsch mache?
Muss man die Pins in der Entity evtl anders definieren?
Wenn du die OD Pins nur für LED-Ausgänge verwenden willst, geht das am
Einfachsten mit dem IP Primitive: SB_RGBA_DRV in IceCube, beim Radiant
heisst das nun einfach RBG (um den Umstieg nicht zu einfach zu machen
wurden viele IPs umbenannt).
Jedenfalls kannst du damit auch die LED Ströme einstellen.
In Verilog, mit Radiant sieht die Instanzierung dann etwa so aus:
1
RGBrgbled(
2
.CURREN(1'b1),
3
.RGBLEDEN(1'b1),
4
.RGB0PWM(leds[0]),//das sind die LED Steuersignale 1=ON
5
.RGB1PWM(leds[1]),
6
.RGB2PWM(leds[2]),
7
.RGB2(rgbpin[2]),//das sind die Pins, als Ausgänge definiert
8
.RGB1(rgbpin[1]),
9
.RGB0(rgbpin[0])
10
);
11
12
defparamrgbled.CURRENT_MODE="0";
13
defparamrgbled.RGB0_CURRENT="0b000001";//so etwa 2 mA
So, mittlerweile bin ich so weit, dass meine Schaltung mit dem ice40up
läuft.
Das hat dann wirklich funktioniert ... interner Oszillator an die PLL
und das als Systemtakt.
Aber ich muss einem Andi(Gast) recht geben ... Die 75MHz von icecube2
sind utopisch und sogar die 45MHz von Radiant sind zu optimistisch.
Auf 24MHz läuft es - mit 40MHz nicht.
Muss mal schauen, wo das Mittel ist, wo es zuverlässig läuft.
Aber immerhin schön stromsparend mit 45mW.
Stefan schrieb:> Gibt es die iCE40 UltraPlus auch ohne das NVCM, welches als OTP> ausgeführt ist?> Ich weiß, passt nicht ganz hier rein.
Neben NVCM kannst du den internen RAM nutzen - oder ein externes
SPI-Flash dran hängen.
Also zusammengefasst:
- NVCM
- internes RAM (flüchtig) über SPI-Slave Interface
- externes SPI-Flash über SPI-Master Interface
Danke Dir für die Info.
Ich habe die iCE40UP's durch Zufall letztes Jahr in der Elektor gesehen,
aber noch nicht tiefergehend beleuchtet. Mal sehen, vielleicht lohnt der
Einstieg. War bisher auf Xilinx und Altera festgenagelt.
Einen schönen Abend Dir.
LG
Stefan
Stefan schrieb:> Danke Dir für die Info.> Ich habe die iCE40UP's durch Zufall letztes Jahr in der Elektor gesehen,> aber noch nicht tiefergehend beleuchtet. Mal sehen, vielleicht lohnt der> Einstieg. War bisher auf Xilinx und Altera festgenagelt.
Ja, ich auch :)
Ich bin nur auf die ice40 gekommen, weil ich einen FPGA gesucht hab, der
(für den Port eines bestehenden Projekts) genügend Resourcen hat,
nicht-volatil (sein kann) und ein Package hat, für das $2-Platinen vom
Chinesen reichen :)
Verwende den QFN48 mit 5k ... Echt toll, dass es sowas mittlerweile gibt
:)
Kleines Update zum Timing ...
Die 45MHz, die Radiant errechnet hat, hab ich nun doch funktionierend
erreicht - schuld war ein 1 Ohm-Widerstand in der 1,2V Leitung zur
Strombestimmung.
Ich hatte im Eval-Board von Lattice solche Widerstände gesehen und
dachte mir, wird schon passen - die Idee ist im Prinzip gut.
War wohl doch nicht so gut in der Praxis ;-)
Normalerweise messe ich den Strom über ein Zwischenkabel, welches nur
temporär vewendet wird.
Mit einen 'normalen' eingeschleiften Multimeter zum Strommessen hatte
ich auch schon den Effekt, das Vcc nicht mehr ausgereicht hat.
Du kannst ja 0,1 Ohm statt 1 Ohm verwenden...
Duke
Ich krame mal den alten Thread wieder raus:
Mampf F. schrieb:> ERROR - Pin [39], which supports Ports of type [BB_OD or OB_RGB] does> not support placement of Port [led_found] with type [BB_B]. Please check> for the device's IO placement limitations and change the port's locate> Constraint to a compatible pin.
Hast du das eigentlich je aufgelöst bekommen?
Ich kann den Pin zwar (ohne die BB_OD-Komponente) in den constraints
zuweisen, aber bekomme dann einen vergleichbaren Fehler:
1
Error 71003024 Project ERROR - Pin [41], which supports Ports of type [BB_OD or OB_RGB] does not support placement of Port [LED] with type [BB_B]. Please check for the device's IO placement limitations and change the port's locate Constraint to a compatible pin.
Nichtsdestotrotz wird das Design ordentlich synthetisiert und gemappt,
wenn man den Fehler ignoriert, dann gibt es nur noch:
1
Info 52291017 Map INFO - Port 'LED' is located on BB_OD pad '41'. Its IO buffer is mapped to BB_OD accordingly. Please notice PULLMODE is not applicable to BB_OD.
Aber es wäre natürlich interessant, wie man so einen BB_OD-Pin richtig
deklariert.
(Dass es mit der RGB-Primitive klappt, ist ein anderer Punkt. Das haben
sie ja letztlich auch als VHDL-Beispiel in ihrem Demoprojekt drin.)
Jörg W. schrieb:> Ich krame mal den alten Thread wieder raus:>> Mampf F. schrieb:>> ERROR - Pin [39], which supports Ports of type [BB_OD or OB_RGB] does>> not support placement of Port [led_found] with type [BB_B]. Please check>> for the device's IO placement limitations and change the port's locate>> Constraint to a compatible pin.>> Hast du das eigentlich je aufgelöst bekommen?
Nope, ich hab dann keine BB_OD o.ä. benutzt und die Ports direkt als
Ausgänge für LEDs benutzt.
Das hat problemlos funktioniert.
Ist ja schon eine Zeit her, aber ich kann mich erinnern, dass ich da
eeewig nach diesem Problem gegoogelt hab und keine Lösung gefunden
hatte.
Mir ist damals noch aufgefallen, dass Radiant viel besser funktioniert
als diese IceCube-IDE. Aber das wirst du vermutlich schon verwenden.
Mampf F. schrieb:> Nope, ich hab dann keine BB_OD o.ä. benutzt und die Ports direkt als> Ausgänge für LEDs benutzt.
Ja, wahrscheinlich ist es eh am sinnvollsten, diese drei Ports dediziert
zu benutzen, zumal ja auf dem Demoboard eine schöne RGB-LED dran hängt.
> Mir ist damals noch aufgefallen, dass Radiant viel besser funktioniert> als diese IceCube-IDE. Aber das wirst du vermutlich schon verwenden.
Ja, das benutze ich.