Forum: FPGA, VHDL & Co. iCEcube2 / @N:Can't find top module!


von U.G. L. (dlchnr)


Angehängte Dateien:

Lesenswert?

Ich komm' grad nicht weiter - ich habe zwei Dateien, eine Datei 
(SR_RS_CE.vhd) mit der Beschreibung eines Scheiberegisters mit ReSet und 
ClockEnable und eine Datei (SR_RS_CE_TST.vhd), in der dieses 
Scheiberegister instanziiert wird und die die Testumgebung für das 
Schieberegister realisiert.
Ich erhalte u.a. die Fehlermeldung "@N:Can't find top module!", finde 
aber keine Möglichkeit, ein Top Module zu definieren.
Ich gestehe auch, dass ich das Hierarchiekonzept von VHDL noch nicht
verstehe - man "soll" Datei wie die darin enthaltenen Entitäten 
benennen, aber allein das "soll" statt "muss" belegt, dass darauf nicht 
ein Mechanismus basieren kann, der das C-include ersetzt?
Der width-Fehler ist mittlerweile geklärt!
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.std_logic_unsigned.all;
4
use IEEE.NUMERIC_STD.ALL;
5
6
entity SR_RS_CE_TST is
7
end SR_RS_CE_TST;
8
9
architecture behavioral of SR_RS_CE_TST is
10
11
constant cycles : integer := 10;
12
signal lss : std_logic := '1';  -- aktive Low Slave Select
13
signal hss : std_logic := '0';  -- aktive Hgh Slave Select
14
signal res : std_logic := '1';  -- RESet of main shift reg
15
signal sck : std_logic := '0';  -- Simulation ClocK
16
signal clk : std_logic := '0';  -- SCI CLocK
17
signal ena : std_logic := '0';  -- ENAble clock of main shift reg
18
signal din : std_logic := '0';  -- Data IN main shift reg
19
signal reg : std_logic_vector(6 downto 0);
20
signal dat : std_logic_vector(47 downto 0) := x"9EAA_CC00_3355";
21
22
component SR_RS_CE is
23
  generic (width : integer := 8);
24
  port(ck : in   std_logic;
25
       ce : in   std_logic;
26
       rs : in   std_logic;
27
       di : in   std_logic;
28
       do : out  std_logic_vector(width-1 downto 0));
29
end component;
30
31
for all : SR_RS_CE use entity work.SR_RS_CE(behavioral);
32
33
begin
34
35
  hss <= not lss;
36
  res <= not hss;
37
  clk <= not lss and sck;
38
  ena <= not reg(0);
39
  din <= dat(47);
40
  
41
  SR : SR_RS_CE generic map (width => 7) port map (clk,ena,res,din,reg);
42
43
  process
44
  begin
45
    for i in 1 to cycles loop
46
      sck <= not sck;
47
      wait for 25 ns;
48
      sck <= not sck;
49
      wait for 25 ns;
50
    end loop;
51
    wait;  -- simulation stops here
52
  end process;
53
  
54
  process
55
  variable cnt : integer range 0 to 63 := 0;
56
  begin
57
    if falling_edge(sck) then
58
      if (lss='0') then
59
        dat(47 downto 1) <= dat(46 downto 0);
60
      end if;
61
      if (cnt=1) then
62
        lss <= '0';
63
      end if;
64
      if (cnt=9) then
65
        lss <= '1';
66
      end if;
67
      cnt := cnt + 1;
68
    end if;
69
  end process;
70
  
71
end behavioral;

: Bearbeitet durch User
von U.G. L. (dlchnr)


Angehängte Dateien:

Lesenswert?

Seltsanerweise scheint iCEcube2 die Datei SR_RS_CE_TST.vhd sogar als 
Top-modul zu betrachten, stößt sich aber daran, das die Test-entity 
keine Ports hat, was doch üblich ist?
Ich könnte so eine Meldung verstehen, wenn ich was generieren wollte, 
was in ein physikalischen Device soll, aber ich will doch nur etwas 
generieren, mit dem ich 'ne simulation fahren kann?

: Bearbeitet durch User
von dlchnr (Gast)


Lesenswert?

Das Ganze läuft offenbar anders als von mir erwartet - der simulator 
bringt anscheinend seinen eigenen VHDL-Compiler mit - und nur diesem 
muss auch die Testbench-Datei übergeben werden.

von Duke Scarring (Gast)


Lesenswert?

dlchnr schrieb:
> der simulator
> bringt anscheinend seinen eigenen VHDL-Compiler mit - und nur diesem
> muss auch die Testbench-Datei übergeben werden.
Ja, so ist es.


U.G. L. schrieb:
> use IEEE.std_logic_unsigned.all;
> use IEEE.NUMERIC_STD.ALL;
beep *beep* beep

Bitte nur die ieee.numeric_std verwenden.
Begründung siehe hier: Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"


> component SR_RS_CE is
>   generic (width : integer := 8);
>   port(ck : in   std_logic;
>        ce : in   std_logic;
>        rs : in   std_logic;
>        di : in   std_logic;
>        do : out  std_logic_vector(width-1 downto 0));
> end component;
Für eine Übung ist es ok mal ein Register zu beschreiben.
In praktischen FPGA-Designs würde ich mit Tippen nicht fertig werden, 
wenn ich für jedes primitive Logikelement (AND, OR etc.) oder FF eine 
extra Instanz anlegen würde.

Duke

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


Lesenswert?

Duke Scarring schrieb:
> In praktischen FPGA-Designs würde ich mit Tippen nicht fertig werden,
> wenn ich für jedes primitive Logikelement (AND, OR etc.) oder FF eine
> extra Instanz anlegen würde.
Ich habe schon mal so ein Anfängerdesign (mit Namen "Diplomarbeit") zur 
Durchsicht und zum Gegenlesen bekommen. Da wurde tatsächlich auf dieser 
Ebene per Hand das ganze Design realisiert. Absolut undurchschaubar und 
unwartbar. Ich habe dann als kleine Fingerübung gezeigt, wie man 6 
Dateien dieses Designs auf von über 3000 auf knapp 50 Zeilen reduzieren 
könnte.
Das passiert, wenn ein Student mit Hochschulwissen ohne Betreuung auf 
FPGAs losgelassen wird... ;-)

von Holger (Gast)


Lesenswert?

@U.G. L. (dlchnr)
Damit habe ich mit Aldec erfolgreich angefangen...
Link: Part1 Part2
https://www.youtube.com/watch?v=_4cEZm5CXBo


Gruss Holger.

von U.G. L. (dlchnr)


Lesenswert?

Duke Scarring schrieb:
> Bitte nur die ieee.numeric_std verwenden.
> Begründung siehe hier: Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"


Wie ist diesbezüglich die Angabe im iCEcube2 User Manual zu bewerten, 
beim Einsatz des Active-HDL zu ergänzen:

library ice;
use ice.vcomponent_vital.all;

("Add the following library declaration in the HDL file. This library 
contains all the iCE primitive VHDL functional and timing models.")

von dlchnr (Gast)


Lesenswert?

>> use IEEE.std_logic_unsigned.all;
>> use IEEE.NUMERIC_STD.ALL;
> beep beep beep
>
> Bitte nur die ieee.numeric_std verwenden.
> Begründung siehe hier: Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

Also ohne "use ieee.std_logic_unsigned.all;" vermag Aldec Active-HDL auf 
einen std_logic_vector kein + auszuführen!?

# Error: COMP96_0071: SPIctrl.vhd : (83, 22): Operator "+" is not 
defined for such operands.
# Error: COMP96_0077: SPIctrl.vhd : (83, 16): Undefined type of 
expression. Expected type 'STD_LOGIC_VECTOR'.

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


Lesenswert?

dlchnr schrieb:
> Also ohne "use ieee.std_logic_unsigned.all;" vermag Aldec Active-HDL auf
> einen std_logic_vector kein + auszuführen!?
Man rechnet auch gar nicht mit std_logic_vector, sondern mit signed, 
unsigned un integer. Ein std_logic_vector ist nur ein undefinierten 
Haufen Bits ohne definierte Ordnung. Oder kannst du mir sagen, was das 
hier ist:
"1100"
Der der Wert 12? Oder der Wert -5?

Mit signed und unsigned wäre Alles sonnenklar. Und zum Rechnen und 
Konvertieren reicht die numeric_std locker aus. Zudem ist sie 
supersimpel zu merken. Auf jeden Fall wesentlich besser als das 
inkonsistente conv_integr() Gemurkse der std_logic_arith.

Sieh dir das mal an:
http://www.lothar-miller.de/s9y/categories/16-Numeric_Std

von dlchnr (Gast)


Lesenswert?

Ok - d.h., sowie Lattice einen Counter implementiert 
(www.latticesemi.com/view_document?document_id=50795), sollte man es 
nicht machen!

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


Lesenswert?

Man kann es genau so wie im letzten Jahrtausend und in Amerika mit der 
veralteten std_logic_arith Lib machen. ODER eben mit der numeric_std.
Aber niemals nie mit BEIDEN zusammen.

Klick einfach mal auf den oben verlinkten Thread. Dort und in den darin 
enthaltenen Links wird der Hintergrund erklärt...

: Bearbeitet durch Moderator
von dlchnr (Gast)


Lesenswert?

Hab' den Link selbstverstänlich angeklickt, da ich es nicht "wie im 
letzten Jahrhundert" machen möchte ;-)

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.