Forum: FPGA, VHDL & Co. freehdl, components, ambiguousness


von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Hallo,

ich möchte mit freehdl eine testbench für ein design simulieren. Bei dem 
design handelt es sich um das example lightshow aus dem ZTEX SDK, 
welches mit ISE Webpack synthetisiert auf dem Board auch funktioniert.

Die tb kann ich zwar compilen...
1
$ gvhdl --libieee tb_lightshow.vhdl 
2
gvhdl: FreeHDL root path is '/usr'.
3
gvhdl: executing '/usr/bin/freehdl-v2cc -m tb_lightshow._main_.cc -L /usr/share/freehdl/lib   -o tb_lightshow.cc tb_lightshow.vhdl'
4
gvhdl:
5
gvhdl: ================================
6
gvhdl: Compiling 'tb_lightshow.cc'...
7
gvhdl: ================================
8
gvhdl: x86_64-linux-gnu-g++  -I /usr/include -c tb_lightshow.cc
9
gvhdl:
10
gvhdl: ================================
11
gvhdl: Compiling simulator main file 'tb_lightshow._main_.cc'...
12
gvhdl: ================================
13
gvhdl: x86_64-linux-gnu-g++  -I /usr/include -c tb_lightshow._main_.cc
14
gvhdl: Linking simulator 'tb_lightshow'...
15
gvhdl: libtool --mode=link --tag CXX x86_64-linux-gnu-g++  tb_lightshow._main_.o  tb_lightshow.o -lm /usr/lib/libfreehdl-kernel.la /usr/lib/libfreehdl-std.la /usr/lib/freehdl/libieee.la -o tb_lightshow
16
linker: libtool: link: x86_64-linux-gnu-g++ tb_lightshow._main_.o tb_lightshow.o -o tb_lightshow  -lm /usr/lib/libfreehdl-kernel.so /usr/lib/libfreehdl-std.so /usr/lib/freehdl/libieee.so -Wl,-rpath -Wl,/usr/lib/freehdl -Wl,-rpath -Wl,/usr/lib/freehdl
17
gvhdl: ================================
18
gvhdl: Simulator 'tb_lightshow' created.
19
gvhdl: ================================
...aber simulieren kann ich dann noch nicht
1
$ ./tb_lightshow 
2
Sorry, only default component binding is currently supported. No default binding for component lightshow found!
Wenn ich jetzt versuche, das dut zu compilen, bekomme ich
1
$ gvhdl --libieee lightshow.vhd 
2
gvhdl: FreeHDL root path is '/usr'.
3
gvhdl: executing '/usr/bin/freehdl-v2cc -m lightshow._main_.cc -L /usr/share/freehdl/lib   -o lightshow.cc lightshow.vhd'
4
lightshow.vhd: in lightshow(RTL):
5
lightshow.vhd:38: use of ">=" is ambigous, candidates are
6
/usr/share/freehdl/lib/ieee/std_logic_1164.vhdl:77:  ">="(std_logic_vector,std_logic_vector) return BOOLEAN
7
/usr/share/freehdl/lib/ieee/std_logic_unsigned.vhdl:60:  ">="(std_logic_vector,std_logic_vector) return BOOLEAN
8
lightshow.vhd:54: use of ">=" is ambigous, candidates are
9
/usr/share/freehdl/lib/ieee/std_logic_1164.vhdl:77:  ">="(std_logic_vector,std_logic_vector) return BOOLEAN
10
/usr/share/freehdl/lib/ieee/std_logic_unsigned.vhdl:60:  ">="(std_logic_vector,std_logic_vector) return BOOLEAN
11
lightshow.vhd:63: use of ">=" is ambigous, candidates are
12
/usr/share/freehdl/lib/ieee/std_logic_1164.vhdl:77:  ">="(std_logic_vector,std_logic_vector) return BOOLEAN
13
/usr/share/freehdl/lib/ieee/std_logic_unsigned.vhdl:60:  ">="(std_logic_vector,std_logic_vector) return BOOLEAN
14
v2cc: lightshow.vhd: 3 errors
15
gvhdl: Compilation failed!
16
Died at /usr/bin/gvhdl line 211.
Was mach ich falsch? Wie kann ich da eine Entscheidung forcen? Und 
welche ist die richtige?

Der code

tb_lightshow.vhdl
1
library ieee;
2
3
use ieee.std_logic_1164.all;
4
use ieee.numeric_std.all;
5
use ieee.std_logic_arith.all;
6
use ieee.std_logic_unsigned.all;
7
8
entity tb_lightshow is
9
end tb_lightshow;
10
11
architecture tb_arch of tb_lightshow is
12
13
  component lightshow is
14
    port(
15
      led1     : out std_logic_vector(9 downto 0);   -- LED1 on debug board
16
      led2     : out std_logic_vector(19 downto 0);  -- LED2 + LED3 on debug board
17
      sw       : in std_logic_vector(3 downto 0);
18
      fxclk    : in std_logic
19
    );
20
  end component;
21
22
  signal tb_led1     : std_logic_vector(9 downto 0);   -- LED1 on debug board
23
  signal tb_led2     : std_logic_vector(19 downto 0);  -- LED2 + LED3 on debug board
24
  signal tb_sw       : std_logic_vector(3 downto 0);
25
  signal tb_fxclk    : std_logic;
26
27
begin
28
29
  tb_sw <= (others => '0');
30
  tb_fxclk <= not tb_fxclk  after 20 ns;  -- 25 MHz clock
31
32
  dut : lightshow
33
    port map (
34
      led1       => tb_led1,
35
      led2       => tb_led2,
36
      sw         => tb_sw,
37
      fxclk      => tb_fxclk
38
    );
39
40
end architecture;

lightshow.vhd
1
library ieee;
2
use IEEE.std_logic_1164.all;
3
use IEEE.std_logic_arith.all;
4
use IEEE.std_logic_unsigned.all;
5
6
entity lightshow is
7
   port(
8
      led1     : out std_logic_vector(9 downto 0);   -- LED1 on debug board
9
      led2     : out std_logic_vector(19 downto 0);  -- LED2 + LED3 on debug board
10
      sw       : in std_logic_vector(3 downto 0);
11
      fxclk    : in std_logic
12
   );
13
end lightshow;
14
15
--signal declaration
16
architecture RTL of lightshow is
17
18
type tPattern1 is array(9 downto 0) of integer range 0 to 255;
19
type tPattern2 is array(19 downto 0) of integer range 0 to 255;
20
21
signal pattern1  : tPattern1 := (0, 10, 41, 92, 163, 255, 163, 92, 41, 10);             -- pattern for LED1
22
signal pattern20 : tPattern2 := (0, 1, 2, 9, 16, 25, 36, 49, 64, 81, 64, 49, 36, 25, 16, 9, 2, 1, 0, 0);  -- 1st pattern for LED2
23
signal pattern21 : tPattern2 := (0, 19, 77, 174, 77, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);    -- 2nd pattern for LED2
24
signal pattern2  : tPattern2;                       -- pattern20 + pattern21
25
26
signal cnt1,cnt20, cnt21  : std_logic_vector(22 downto 0);
27
signal pwm_cnt            : std_logic_vector(19 downto 0);
28
signal pwm_cnt8           : std_logic_vector(7 downto 0);
29
30
begin
31
    pwm_cnt8 <= pwm_cnt(19 downto 12);
32
    
33
    dp_fxclk: process(fxclk)
34
    begin
35
         if fxclk' event and fxclk = '1' then
36
      
37
      -- pattern for led 1
38
      if ( cnt1 >= conv_std_logic_vector(7200000,23) )  -- 1/1.5 Hz
39
      then
40
    if ( sw(0) = '1' )
41
    then
42
        pattern1(8 downto 0) <= pattern1(9 downto 1);
43
        pattern1(9) <= pattern1(0);
44
    else
45
        pattern1(9 downto 1) <= pattern1(8 downto 0);
46
        pattern1(0) <= pattern1(9);
47
    end if;
48
        cnt1  <= (others => '0');
49
          else
50
    cnt1 <= cnt1  + 1;
51
      end if;
52
53
      -- pattern for led 2
54
      if ( ( cnt20 >= conv_std_logic_vector(4800000,23) ) or ( (sw(2)= '1') and (cnt20 >= conv_std_logic_vector(1600000,23)) ) )  -- SW1 off: 1/3Hz, SW1 on: 1Hz
55
      then
56
    pattern20(18 downto 0) <= pattern20(19 downto 1);
57
    pattern20(19) <= pattern20(0);
58
    cnt20 <= (others => '0');
59
      else
60
    cnt20 <= cnt20 + 1;
61
      end if;
62
63
      if ( ( cnt21 >= conv_std_logic_vector(2000000,23) ) or ( (sw(3)= '1') and (cnt21 >= conv_std_logic_vector(500000,23)) ) )
64
      then
65
    if ( sw(1) = '1' )
66
    then
67
        pattern21(18 downto 0) <= pattern21(19 downto 1);
68
        pattern21(19) <= pattern21(0);
69
    else
70
        pattern21(19 downto 1) <= pattern21(18 downto 0);
71
        pattern21(0) <= pattern21(19);
72
    end if;
73
    cnt21 <= (others => '0');
74
      else
75
    cnt21 <= cnt21 + 1;
76
      end if;
77
78
      for i in 0 to 19 loop
79
    pattern2(i) <= pattern20(i) + pattern21(i);
80
      end loop;
81
      
82
      -- pwm
83
      if ( pwm_cnt8 = conv_std_logic_vector(255,8) )
84
      then
85
    pwm_cnt <= ( others => '0' );
86
      else
87
    pwm_cnt <= pwm_cnt + 1;
88
      end if;
89
      -- led1
90
      for i in 0 to 9 loop
91
    if ( pwm_cnt8 < pattern1(i) ) 
92
    then
93
        led1(i) <= '1';
94
    else
95
        led1(i) <= '0';
96
    end if;
97
      end loop;
98
      for i in 0 to 19 loop
99
    if (pwm_cnt8 < pattern2(i) ) 
100
    then
101
        led2(i) <= '1';
102
    else
103
        led2(i) <= '0';
104
    end if;
105
      end loop;
106
107
  end if;
108
    end process dp_fxclk;
109
    
110
end RTL;

Kann mich jemand in die richtige Richtung stupsen?

von VHDL hotline (Gast)


Lesenswert?

Md M. schrieb:
> use ieee.numeric_std.all;
> use ieee.std_logic_arith.all;
> use ieee.std_logic_unsigned.all;

Schreibe 100 mal:

Ich soll nicht std_logic_arith und std_logic_unsigned verwenden und erst 
recht nicht zusammen mit numeric_std.

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

VHDL hotline schrieb im Beitrag #4496340:
> Ich soll nicht std_logic_arith und std_logic_unsigned verwenden und erst
> recht nicht zusammen mit numeric_std.

Gesaved. Ist mir auch irgendwie noch aus meinen ersten VHDL-Gehversuchen 
bekannt, jetzt wo ich es lese. Ok, dann sind die Beispiele also 
schlecht. Denn egal was davon ich weglasse, es zieht eine Reihe 
Fehlermeldungen nach sich.

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Ich habe jetzt aus dem Beispiel-Code alles rausgenommen, was Fehler 
verursacht hat, ich kann es jetzt also comilen. Aber die tb will so 
immernoch nicht.
1
library ieee;
2
3
use IEEE.std_logic_1164.all;
4
use IEEE.std_logic_arith.all;
5
6
--use IEEE.std_logic_unsigned.all;
7
8
entity lightshow is
9
   port(
10
      led1     : out std_logic_vector(9 downto 0);   -- LED1 on debug board
11
      led2     : out std_logic_vector(19 downto 0);  -- LED2 + LED3 on debug board
12
      sw       : in std_logic_vector(3 downto 0);
13
      fxclk    : in std_logic
14
   );
15
end lightshow;
16
17
--signal declaration
18
architecture RTL of lightshow is
19
20
type tPattern1 is array(9 downto 0) of integer range 0 to 255;
21
type tPattern2 is array(19 downto 0) of integer range 0 to 255;
22
23
signal pattern1  : tPattern1 := (0, 10, 41, 92, 163, 255, 163, 92, 41, 10);             -- pattern for LED1
24
signal pattern20 : tPattern2 := (0, 1, 2, 9, 16, 25, 36, 49, 64, 81, 64, 49, 36, 25, 16, 9, 2, 1, 0, 0);  -- 1st pattern for LED2
25
signal pattern21 : tPattern2 := (0, 19, 77, 174, 77, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);    -- 2nd pattern for LED2
26
signal pattern2  : tPattern2;                       -- pattern20 + pattern21
27
28
signal cnt1,cnt20, cnt21  : std_logic_vector(22 downto 0);
29
signal pwm_cnt            : std_logic_vector(19 downto 0);
30
signal pwm_cnt8           : std_logic_vector(7 downto 0);
31
32
begin
33
    pwm_cnt8 <= pwm_cnt(19 downto 12);
34
    
35
    dp_fxclk: process(fxclk)
36
    begin
37
         if fxclk' event and fxclk = '1' then
38
      
39
      -- pattern for led 1
40
      if ( cnt1 >= conv_std_logic_vector(7200000,23) )  -- 1/1.5 Hz
41
      then
42
    if ( sw(0) = '1' )
43
    then
44
        pattern1(8 downto 0) <= pattern1(9 downto 1);
45
        pattern1(9) <= pattern1(0);
46
    else
47
        pattern1(9 downto 1) <= pattern1(8 downto 0);
48
        pattern1(0) <= pattern1(9);
49
    end if;
50
        cnt1  <= (others => '0');
51
          else
52
--    cnt1 <= cnt1  + 1;
53
      end if;
54
55
      -- pattern for led 2
56
      if ( ( cnt20 >= conv_std_logic_vector(4800000,23) ) or ( (sw(2)= '1') and (cnt20 >= conv_std_logic_vector(1600000,23)) ) )  -- SW1 off: 1/3Hz, SW1 on: 1Hz
57
      then
58
    pattern20(18 downto 0) <= pattern20(19 downto 1);
59
    pattern20(19) <= pattern20(0);
60
    cnt20 <= (others => '0');
61
      else
62
--    cnt20 <= cnt20 + 1;
63
      end if;
64
65
      if ( ( cnt21 >= conv_std_logic_vector(2000000,23) ) or ( (sw(3)= '1') and (cnt21 >= conv_std_logic_vector(500000,23)) ) )
66
      then
67
    if ( sw(1) = '1' )
68
    then
69
        pattern21(18 downto 0) <= pattern21(19 downto 1);
70
        pattern21(19) <= pattern21(0);
71
    else
72
        pattern21(19 downto 1) <= pattern21(18 downto 0);
73
        pattern21(0) <= pattern21(19);
74
    end if;
75
    cnt21 <= (others => '0');
76
      else
77
--    cnt21 <= cnt21 + 1;
78
      end if;
79
80
      for i in 0 to 19 loop
81
    pattern2(i) <= pattern20(i) + pattern21(i);
82
      end loop;
83
      
84
      -- pwm
85
      if ( pwm_cnt8 = conv_std_logic_vector(255,8) )
86
      then
87
    pwm_cnt <= ( others => '0' );
88
      else
89
--    pwm_cnt <= pwm_cnt + 1;
90
      end if;
91
      -- led1
92
      for i in 0 to 9 loop
93
--    if ( pwm_cnt8 < pattern1(i) ) 
94
--    then
95
--        led1(i) <= '1';
96
--    else
97
--        led1(i) <= '0';
98
--    end if;
99
      end loop;
100
      for i in 0 to 19 loop
101
--    if (pwm_cnt8 < pattern2(i) ) 
102
--    then
103
--        led2(i) <= '1';
104
--    else
105
--        led2(i) <= '0';
106
--    end if;
107
      end loop;
108
109
  end if;
110
    end process dp_fxclk;
111
    
112
end RTL;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Md M. schrieb:
> Aber die tb will so immernoch nicht.
Was geht nicht?

BTW: nimm zum Rechnen die numeric_std. Und NUR die.
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

: Bearbeitet durch Moderator
von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Lothar M. schrieb:
>> Aber die tb will so immernoch nicht.
> Was geht nicht?

Immernoch das hier
1
$ ./tb_lightshow 
2
Sorry, only default component binding is currently supported. No default binding for component lightshow found!

Lothar M. schrieb:
> BTW: nimm zum Rechnen die numeric_std. Und NUR die.
> http://www.lothar-miller.de/s9y/categories/16-Numeric_Std
> Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

Alles klar.
Eine großartige website hast du da.

von Md M. (Firma: Potilatormanufaktur) (mdma)


Angehängte Dateien:

Lesenswert?

Ich hab es jetzt folgendermaßen zumindest irgendwie zum Laufen bekommen:
Ich habe die tb direkt mit in die lightshow.vhd geschrieben, die signals 
der entity vorinitialisiert und mir ein paar uses rausgepickt, ohne die 
es nicht ging. Am ehesten stört mich natürlich, dass ich die tb mit ins 
design file packen muss. Wie kreig ich das denn jetzt bloß gelöst? Den 
code habe ich angehängt.

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Md M. schrieb:
> Was mach ich falsch?
Mehreres, aber jeder hat mal angefangen ;-)

Hier ist die letzten Variante Deines Codes (getrennte Dateien) mit 
Modelsim simuliert:
1
$ vlib work
2
3
$ vcom lightshow.vhd
4
Start time: 06:52:04 on Mar 08,2016
5
vcom lightshow.vhd
6
Model Technology ModelSim SE-64 vcom 10.3d Compiler 2014.10 Oct  7 2014
7
-- Loading package STANDARD
8
-- Loading package TEXTIO
9
-- Loading package std_logic_1164
10
-- Loading package NUMERIC_STD
11
-- Loading package std_logic_arith
12
-- Loading package STD_LOGIC_SIGNED
13
-- Compiling entity lightshow
14
-- Compiling architecture RTL of lightshow
15
End time: 06:52:04 on Mar 08,2016, Elapsed time: 0:00:00
16
Errors: 0, Warnings: 0
17
18
$ vcom lightshow_tb.vhd
19
Start time: 06:52:10 on Mar 08,2016
20
vcom lightshow_tb.vhd
21
Model Technology ModelSim SE-64 vcom 10.3d Compiler 2014.10 Oct  7 2014
22
-- Loading package STANDARD
23
-- Loading package TEXTIO
24
-- Loading package std_logic_1164
25
-- Loading package NUMERIC_STD
26
-- Loading package std_logic_arith
27
-- Loading package STD_LOGIC_UNSIGNED
28
-- Compiling entity tb_lightshow
29
-- Compiling architecture tb_arch of tb_lightshow
30
End time: 06:52:10 on Mar 08,2016, Elapsed time: 0:00:00
31
Errors: 0, Warnings: 0
32
33
$ vsim -gui tb_lightshow
34
> add wave *
35
> run 1 ms

1. Erst sollte das DUT kompiliert werden, danach die Testbench.

2. Du verwendest immer noch std_logic_arith und STD_LOGIC_UNSIGNED.
Wirf die Libs raus. numeric_std kennt auch plus und minus, aber 
sinnvollerweise nur mit den Datentypen signed und unsigned.
Wer std_logic_vector verwendet muss casten.

3. In Deiner Simulation geht nix los, weil der Takt nicht initialisiert 
wird.
Ich verwende gerne die folgende Konstruktion:
1
constant clk_period     : time       := (1 sec) / 10000000;
2
signal   tb_clk         : std_ulogic := '0';
3
signal   simulation_run : boolean    := true;
4
...
5
  tb_clk <= not tb_clk after clk_period / 2 when simulation_run;
6
...
7
  wait for 1 ms;
8
  simulation_run <= false;
9
  report "Simulation ended.";
10
  wait;
11
...

Wenn man die Initialisierung anfügt, passiert auch was (siehe Anhang).

Duke

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Duke Scarring schrieb:
>...

Nunja, das ganze hat ja mit Xilinx tools auch out of the box 
funktioniert, ohne dass ich was geändert habe - mit ISE Webpack konnte 
ich das synthetisieren und per ZTEX SDK in das FPGA schieben. Das heißt 
ja, dass die Xilinx tools mit dem Bibliotheken-Mix was anfangen können, 
ob das jetzt gut ist oder nicht sei hier egal. Mir ging es ja aber 
darum, es mit freehdl zu simulieren. Den Xilinx Simulator habe ich gar 
nicht erst versucht. Ich würde auch die Xilinx tools zum synthetisieren 
nicht nehmen, wenn es eine open source Alternative gäbe. Und mit meiner 
letzten Version konnte ich es ja sogar mit freehdl simulieren, nur 
musste ich dafür die testbench mit in das eigentlich design schreiben, 
damit freehdl das richtig compiled und linkt. Mich würde jetzt 
eigentlich nur interessieren, wie ich freehdl korrekt mit zwei files 
füttere. Und ja, ich weiß, dass ich jede Menge Baustellen habe, auch das 
mit den Libs weiß ich eigentlich. ich hatte sogar zwei Semester 
Digitaltechnik in VHDL, ist aber doch ein paar Jahre her, dass ich 
wirklich ein konkretes Vorhaben in VHDL angegangen bin. Deshalb ja auch 
die examples, um mein neues Board mal blinken zu sehen und um mir die 
Arbeitsumgebung einzurichten usw. Und da hat eben das 
freehdl/gtkwave-Gespann aus verschiedenen Gründen seinen unumstößlichen 
Platz eingenommen. Aber danke für die steten Hinweise, ich werde sie 
beherzigen, sobald ich im Sattel sitze :)

: Bearbeitet durch User
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.