Forum: FPGA, VHDL & Co. [VHDL] Internen Oszilator von Lattice FPGAs aktivieren


von Patrick M. (edge540)


Lesenswert?

Moin,

ich hab hier das TinyFPGA A2 Board mit einem Lattice XO2-1200HC FPGA 
drauf, nettes Board, schön kompakt^^

Hab es mit folgender Anleitung in Betrieb genommen: 
http://tinyfpga.com/a-series-guide.html

Den interne erzeugten Takt hab ich dann auf einen Pin gelegt und konnte 
den auch mit dem Oszi messen. Nur ist diese Beispiel in Verilog...

Also ins Datenblatt und User Guide geschaut 
http://www.latticesemi.com/en/Support/AnswerDatabase/1/4/8/~/media/5DEC3E3B3413491EADEF326C92BA8078.ashx 
(Seite 29) und das VHDL Besipiel ausprobiert, Clock wieder auf einen Pin 
geführt und... nix :/

Ich pack den VHDL Code mal rein, vielleicht ist da ja ein dusseliger 
Fehler drin ;)
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
library machxo2;
5
use machxo2.all;
6
7
8
ENTITY ENT IS
9
10
  PORT(
11
    pin1    : OUT  STD_LOGIC;  
12
    pin2    : OUT  STD_LOGIC;  
13
    pin3_sn    : OUT  STD_LOGIC;  
14
    pin4_mosi  : OUT  STD_LOGIC;  
15
    pin5    : OUT  STD_LOGIC;  
16
    pin6    : OUT  STD_LOGIC;  
17
    pin7_done  : OUT  STD_LOGIC;  
18
    pin8_pgmn  : OUT  STD_LOGIC;   
19
    pin9_jtgnb  : OUT  STD_LOGIC;  
20
    pin10_sda  : IN  STD_LOGIC;  
21
    pin11_scl  : OUT  STD_LOGIC;  
22
    pin16    : OUT  STD_LOGIC;  
23
    pin17    : OUT  STD_LOGIC;  
24
    pin18_cs  : OUT  STD_LOGIC;  
25
    pin19_sclk  : OUT  STD_LOGIC;  
26
    pin20_miso  : OUT  STD_LOGIC;  
27
    pin21    : IN  STD_LOGIC;  
28
    pin22    : IN  STD_LOGIC  
29
  );
30
END ENT;
31
32
ARCHITECTURE RTL of ENT is
33
34
  
35
  COMPONENT OSCH
36
  -- synthesis translate_off
37
    GENERIC (NOM_FREQ: string := "133.00");--133MHz
38
    -- synthesis translate_on
39
    PORT (
40
      STDBY:    IN std_logic;
41
      OSC:    OUT std_logic;
42
      SEDSTDBY:  OUT std_logic);
43
  END COMPONENT; 
44
  
45
  attribute NOM_FREQ : string;
46
  attribute NOM_FREQ of OSCinst0 : label is "133.00";--133MHz
47
48
  SIGNAL  clk    : STD_LOGIC := '0';              
49
  SIGNAL  sed  : STD_LOGIC := '0';
50
51
BEGIN
52
53
  OSCInst0: OSCH
54
  -- synthesis translate_off
55
  GENERIC MAP( NOM_FREQ => "133.00" )
56
  -- synthesis translate_on
57
  PORT MAP (
58
    STDBY=> '0',
59
    OSC => clk,
60
    SEDSTDBY => sed
61
  );
62
 
63
  SYNC: process(clk) 
64
  begin
65
    if clk = '1' and clk'event then
66
      
67
    end if;
68
  end process SYNC;  
69
    
70
  pin6 <= clk;--Diese Zuweisung klappt in Verilog wunderbar
71
  
72
73
END ARCHITECTURE RTL;

Falls jemand eine Idee Hat würde ich mich sehr freuen :)

vielen Dank
Patrick

von bitwurschtler (Gast)


Lesenswert?

Patrick M. schrieb:
> Falls jemand eine Idee Hat würde ich mich sehr freuen :)

poste mal die Synthese-/Map- und Placer-logfiles.
Deklariere SEDSTDBY  als open.

von Duke Scarring (Gast)


Lesenswert?

Bei mir funktioniert folgende Instanziierung:
1
library machxo2;
2
use machxo2.components.osch;
3
4
...
5
6
    osch_i0 : OSCH
7
    generic map 
8
    (
9
        NOM_FREQ => "2.08"
10
    )
11
    port map 
12
    (
13
  STDBY    => '0',
14
        OSC      => clock,
15
        SEDSTDBY => open
16
    );

Duke

von Patrick M. (edge540)


Lesenswert?

Moin,

@bitwurschtler
Das SEDSTDBY   als open zu deklarieren hat leider nichts gebracht.

@Duke Scarring
Wenn ich das mache kommt immer folgende Warnmeldung:

ERROR : formal nom_freq is not declared. VHDL-1084

Der Code sieht dabei so aus:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
library machxo2;
5
use machxo2.all;
6
use machxo2.components.osch;
7
8
ENTITY ENT IS
9
10
  PORT(
11
    pin1    : OUT  STD_LOGIC;  
12
    pin2    : OUT  STD_LOGIC;  
13
    pin3_sn    : OUT  STD_LOGIC;  
14
    pin4_mosi  : OUT  STD_LOGIC;  
15
    pin5    : OUT  STD_LOGIC;  
16
    pin6    : OUT  STD_LOGIC;  
17
    pin7_done  : OUT  STD_LOGIC;  
18
    pin8_pgmn  : OUT  STD_LOGIC;   
19
    pin9_jtgnb  : OUT  STD_LOGIC;  
20
    pin10_sda  : IN  STD_LOGIC;  
21
    pin11_scl  : OUT  STD_LOGIC;  
22
    pin16    : OUT  STD_LOGIC;  
23
    pin17    : OUT  STD_LOGIC;  
24
    pin18_cs  : OUT  STD_LOGIC;  
25
    pin19_sclk  : OUT  STD_LOGIC;  
26
    pin20_miso  : OUT  STD_LOGIC;  
27
    pin21    : IN  STD_LOGIC;  
28
    pin22    : IN  STD_LOGIC  
29
  );
30
END ENT;
31
32
ARCHITECTURE RTL of ENT is
33
34
  
35
  COMPONENT OSCH
36
  -- synthesis translate_off
37
    GENERIC (NOM_FREQ: string := "2.08");--133MHz
38
    -- synthesis translate_on
39
    PORT (
40
      STDBY:    IN std_logic;
41
      OSC:    OUT std_logic;
42
      SEDSTDBY:  OUT std_logic);
43
  END COMPONENT; 
44
  
45
  attribute NOM_FREQ : string;
46
  attribute NOM_FREQ of OSCinst0 : label is "2.08";--133MHz
47
48
  SIGNAL  clk    : STD_LOGIC := '0';              
49
  SIGNAL  sed  : STD_LOGIC := '0';
50
51
BEGIN
52
53
  osch_i0 : OSCH
54
    generic map 
55
    (
56
        NOM_FREQ => "2.08"
57
    )
58
    port map 
59
    (
60
  STDBY    => '0',
61
        OSC      => clock,
62
        SEDSTDBY => open
63
    );
64
  
65
  SYNC: process(clk) 
66
  begin
67
    if clk = '1' and clk'event then
68
      
69
    end if;
70
  end process SYNC;  
71
    
72
  pin6 <= clk;--Diese Zuweisung klappt in Verilog wunderbar
73
  
74
75
END ARCHITECTURE RTL;

Vielen Dank

von Bürovorsteher (Gast)


Lesenswert?

Warum setzt du das generic mit der Frequenz gleich dreimal ein?

Ich habe es in meinen Anwendungen nur ein einziges Mal getan, kann aber 
im Moment nicht sagen, wo konkret, da ich vor dem falschen Rechner 
sitze.

von bitwurschtler (Gast)


Lesenswert?

Verkürz mal die Bibliotheksinstanziierung zu:

library machxo2;
use machxo2.all;

Such dir im Internet das PDF: TN1199 - MachXO2 sysCLOCK PLL Design and 
Usage Guide

da findet sich VHDL-Code der es tun sollte.

von bitwurschtler (Gast)


Lesenswert?

Der Instanzname ist nicht einheitlich:
1
  attribute NOM_FREQ of OSCinst0 : label is "2.08";--133MHz
2
                        ^^^^^^^^
3
4
5
BEGIN
6
7
  osch_i0 : OSCH
8
  ^^^^^^^^

: Bearbeitet durch Moderator
von Patrick M. (edge540)


Lesenswert?

Moin,

vielen Dank für die Tipps :D
Ich hatte das TN1199 schon benutzt, habs ja auch verlinkt,
allerdings hab ich wohl ein Fehler gemacht...
Also nochmal neuen Code geschrieben und... ging wieder nicht :(
Und dann hab ich gemerkt, dass man ja dem Signal auch einen physischen 
Pin zuweisen sollte -> Kopf-Tisch
Danach ging es dann^^

Das ist der Code, der letztendlich auch funktioniert:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
library machxo2;
5
use machxo2.all;
6
7
ENTITY ENT IS
8
9
  PORT(
10
    pin1    : OUT  STD_LOGIC;  
11
    pin2    : OUT  STD_LOGIC;  
12
    pin3_sn    : OUT  STD_LOGIC;  
13
    pin4_mosi  : OUT  STD_LOGIC;  
14
    pin5    : OUT  STD_LOGIC;  
15
    pin6    : OUT  STD_LOGIC;  
16
    pin7_done  : OUT  STD_LOGIC;  
17
    pin8_pgmn  : OUT  STD_LOGIC;   
18
    pin9_jtgnb  : OUT  STD_LOGIC;  
19
    pin10_sda  : IN  STD_LOGIC;  
20
    pin11_scl  : OUT  STD_LOGIC;  
21
    pin16    : OUT  STD_LOGIC;  
22
    pin17    : OUT  STD_LOGIC;  
23
    pin18_cs  : OUT  STD_LOGIC;  
24
    pin19_sclk  : OUT  STD_LOGIC;  
25
    pin20_miso  : OUT  STD_LOGIC;  
26
    pin21    : IN  STD_LOGIC;  
27
    pin22    : IN  STD_LOGIC  
28
  );
29
END ENT;
30
31
ARCHITECTURE RTL of ENT is
32
33
34
35
 
36
  signal CLK: STD_LOGIC := '0';
37
  signal STDBY_INT: STD_LOGIC := '0';
38
  signal SEDSTDBY_INT: STD_LOGIC := '0';
39
  signal COUNTER: unsigned(7 downto 0) := (others => '0');
40
  
41
  COMPONENT OSCH
42
  -- synthesis translate_off
43
  GENERIC (NOM_FREQ: string := "44.33");--44.33MHz
44
  -- synthesis translate_on
45
  PORT (
46
    STDBY:IN std_logic;
47
    OSC:OUT std_logic;  
48
    SEDSTDBY:OUT std_logic);
49
  END COMPONENT;
50
  attribute NOM_FREQ : string;
51
  attribute NOM_FREQ of OSCinst0 : label is "44.33";
52
  
53
begin
54
55
  OSCInst0: OSCH
56
  -- synthesis translate_off
57
  GENERIC MAP( NOM_FREQ => "44.33" )
58
  -- synthesis translate_on
59
  PORT MAP (
60
    STDBY=> STDBY_INT,
61
    OSC => clk,
62
    SEDSTDBY => SEDSTDBY_INT
63
  );
64
 
65
 
66
  SYNC: process(clk) 
67
  begin
68
    if clk = '1' and clk'event then
69
    if COUNTER = "11111111" then
70
      COUNTER <= "00000000";
71
    else
72
      COUNTER <= COUNTER + 1;
73
    end if;
74
    
75
    end if;
76
  end process SYNC;  
77
    
78
  pin6 <= clk;
79
  pin5 <= COUNTER(7);--255 mal geteilter Takt
80
  
81
82
END ARCHITECTURE RTL;

Vielen Dank an alle, die mir geholfen haben,

Patrick

von bitwurschtler (Gast)


Lesenswert?

Patrick M. schrieb:
> Und dann hab ich gemerkt, dass man ja dem Signal auch einen physischen
> Pin zuweisen sollte -> Kopf-Tisch

Warum hat dann das Verilog-file funktioniert?

Nichtzugewiesene pins sollten auch im par-log erkennbar sein, deshalb 
die gestrige Bitte diese dem Post anzuhängen.

von Patrick M. (edge540)


Lesenswert?

Das Verilog File war Teil des Beispiel Projektes vom TinyFPGA Board:
https://github.com/tinyfpga/TinyFPGA-A-Series/tree/master/template_a2

Da das ein komplettes Lattice Projekt ist, war da wahrscheinlich die 
Zuweisung schon vorhanden.

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.