[VHDL] Internen Oszilator von Lattice FPGAs aktivieren

OP #5280277
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
Gast #5280338
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
OP #5280381
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
Gast #5280438
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.
OP #5281292
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren