Forum: FPGA, VHDL & Co. Vivado frisst massig RAM und liefert nichts.


von Gustl B. (-gb-)


Lesenswert?

Hallo,

ich will testen wie zwei Clocks zueinander aussehen und ob die 
ordentlich funktionieren. Zum FPGA geht eine 100 MHz Clock und aus einem 
ADC kommen zwei 25 MHz Takte. Und genau die letzteren will ich testen.

Also betreibe ich zwei Schieberegister im FPGA die 64 Bit lang sind und 
schiebe dort mit 100 MHz die 1 oder 0 der beiden 25 MHz Clocks hinein.

Wenn das dann gemacht wurde soll das über einen UART zum PC geschickt 
werden.

So, das ist alles echt wenig Code, der UART ist getestet und 
funktioniert in vielen weiteren Projekten. In diesem Projekt läuft die 
Simulation problemlos durch. Aber die Synthese läuft ewig und frisst 
konstant neuen RAM bis der dann voll ist. Dann stürtzt Vivado und leider 
auch Windows 10 ab.

Code:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity XC7S50_CLK is Port(
6
  -- CLK
7
  clk : in std_logic;
8
  -- ADC
9
  ADC_DCOA : in std_logic;
10
  ADC_DCOB : in std_logic;
11
  -- UART
12
  TX : out std_logic;
13
  RX : in std_logic);
14
end XC7S50_CLK;
15
16
architecture Behavioral of XC7S50_CLK is
17
18
component uart is
19
  generic(
20
  clk_freq: integer;
21
  baudrate: integer);
22
  Port (
23
  clk : in std_logic;
24
  start_snd: in std_logic;
25
  start_rcv: out std_logic;
26
  byte_snd : in std_logic_vector(7 downto 0);
27
  byte_rcv : out std_logic_vector(7 downto 0);
28
  tx : out std_logic;
29
  rx : in std_logic;
30
  ready : out std_logic);
31
end component;
32
33
signal CLK_A_SR: std_logic_vector(63 downto 0):=(others => '0');
34
signal CLK_B_SR: std_logic_vector(63 downto 0):=(others => '0');
35
signal FSM: integer range 0 to 2:=0;
36
signal rec_counter: integer range 0 to 63:=0;
37
signal send_counter_A: integer range 0 to 7:=0;
38
signal send_counter_B: integer range 0 to 7:=0;
39
--------------------------------------- UART ---------------------
40
signal UART_start_snd: std_logic:='0';
41
signal UART_start_rcv: std_logic:='0';
42
signal UART_byte_snd: std_logic_vector(7 downto 0):="00000000";
43
signal UART_byte_rcv: std_logic_vector(7 downto 0):="00000000";
44
signal UART_ready: std_logic:='0';
45
46
begin
47
48
FT2232H_uart: uart 
49
  generic map(
50
  clk_freq => 100000000,
51
  baudrate => 921600)
52
  port map(
53
  clk => clk,
54
  start_snd => UART_start_snd,
55
  start_rcv => UART_start_rcv,
56
  byte_snd => UART_byte_snd,
57
  byte_rcv => UART_byte_rcv,
58
  tx => TX,
59
  rx => RX,
60
  ready => UART_ready);
61
  
62
process begin
63
  wait until rising_edge(clk);
64
  UART_start_snd <= '0';
65
  if FSM = 0 then
66
    CLK_A_SR <= CLK_A_SR(62 downto 0) & ADC_DCOA;
67
    CLK_B_SR <= CLK_B_SR(62 downto 0) & ADC_DCOB;
68
    rec_counter <= rec_counter +1;
69
    if rec_counter = 63 then
70
      FSM <= 1;
71
    end if;
72
    send_counter_A <= 0;
73
    send_counter_B <= 0;
74
  elsif FSM = 1 then
75
    rec_counter <= 0;
76
    if UART_ready = '1' then
77
      UART_start_snd <= '1';
78
      UART_byte_snd <= CLK_A_SR((7-send_counter_A)*8+7 downto (7-send_counter_A)*8);
79
      send_counter_A <= send_counter_A +1;
80
      if send_counter_A = 7 then
81
        FSM <= 2;
82
      end if;
83
    end if;
84
  elsif FSM = 2 then
85
    rec_counter <= 0;
86
    if UART_ready = '1' then
87
      UART_start_snd <= '1';
88
      UART_byte_snd <= CLK_B_SR((7-send_counter_B)*8+7 downto (7-send_counter_B)*8);
89
      send_counter_B <= send_counter_B +1;
90
      if send_counter_B = 7 then
91
        FSM <= 0;
92
      end if;
93
    end if;
94
  end if;
95
  
96
end process;
97
98
end Behavioral;

Ich verwende Vivado 2018.2 und hatte bisher noch nie so ein Verhalten. 
Vielleicht habe ich auch einen krassen Fehler. Zuerst hatte ich ein 
deutlich längeres Schieberegister, aber jetzt mit 64 Bit sollte das 
locker in den Spartan passen und auch zu routen sein.

von C. A. Rotwang (Gast)


Lesenswert?

Gustl B. schrieb:


> signal CLK_A_SR: std_logic_vector(63 downto 0):=(others => '0');
> signal CLK_B_SR: std_logic_vector(63 downto 0):=(others => '0');


Nur ne Kleinigkeit, aber nimm mal den defaultwert für die Shiftregs 
raus. Und lass mal das ganze ohne timingconstraints laufen resp. nicht 
"timing driven" -einfach um mal zu testen ob es am speed klemmt.

von Gustl B. (-gb-)


Lesenswert?

Nun, die Defaults sollten nichts machen, das sind nur ein paar Bits die 
im Bitstream gesetzt werden. Und Constraints habe ich keine. Ich habe 
nur mitgeteilt, dass die Clock einen Takt von 100 MHz hat. Oh und bei 
den ADC Clocks habe ich mitgeteilt, dass das 25 MHz sind. Das nehme ich 
jetzt mal raus und mache das zu normalen IOs.

Edit:
Hat nichts gebracht.

Vielleicht sollte ich mal ein älteres Vivado testen ... aber die 
unterstützen den Spartan7 nicht.

: Bearbeitet durch User
von C. A. Rotwang (Gast)


Lesenswert?

Gustl B. schrieb:
> UART_byte_snd <= CLK_B_SR((7-send_counter_B)*8+7 downto
> (7-send_counter_B)*8);



Hm, hat ein so beschriebene Byte multiplexer schon mal funktioniert?
Ich wurde das auskodieren, statt mit "dynamischen" Index beschreiben.
Also im prozess in etwa
1
if send_counter_B = 7 then UART_byte_snd <= CLK_B_SR(7 downto 0);
2
3
elsif send_counter_B = 6 then UART_byte_snd <= CLK_B_SR(15 downto 8);
4
--..

Oder wie auch sonst die klassische Muxbeschreibung ausschaut.
https://surf-vhdl.com/how-to-implement-digital-mux-in-vhdl/

von Gustl B. (-gb-)


Lesenswert?

Ja, sowas habe ich schon öfter verwendet, aber noch nicht bei einem 
Schieberegister. Aber stimmt, ich könnte das mal hinschreiben.

Edit:
Tatsache, das hat geholfen. Warum auch immer. Vielen Dank!

: Bearbeitet durch User
von C. A. Rotwang (Gast)


Lesenswert?

Gustl B. schrieb:
> Ja, sowas habe ich schon öfter verwendet, aber noch nicht bei einem
> Schieberegister. Aber stimmt, ich könnte das mal hinschreiben.
>
> Edit:
> Tatsache, das hat geholfen. Warum auch immer.

Das freut, vielleicht liegt es ja daran das das Shiftregister hier nicht 
(nur) als Shift register benutzt wird.
Bei einem klassischen Shift-register und bei den Shiftregister-Makros 
die Xilinx benutzt um FF zu sparen ist nur der Datenausgang des letzten 
FF erreichbar, für den Muxer braucht es aber auch die Datenleitungen 
zwischen den einzelnen Registern.


https://www.xilinx.com/support/documentation/user_guides/ug474_7Series_CLB.pdf 
S.35


 Ist halt so etwa wie der Unterschied zwischen FIFO und RAM. Es ist 
natürlich trotzdem unschön das sich Xilinx verschluckt und keine Warning 
ausspuckt. Vielleicht läuft der Code ohne automatische Extraktion der 
Shiftregister durch Vivado:

https://www.xilinx.com/support/answers/53956.html

von Gustl B. (-gb-)


Lesenswert?

Vielen Dank!

Mit
1
attribute shreg_extract : string;
2
attribute shreg_extract of CLK_A_SR: signal is "false";
3
attribute shreg_extract of CLK_B_SR: signal is "false";
läuft es jetzt ganz normal durch. Ich hatte so eine Beschreibung bisher 
tatsächlich nicht mit Vivado benutzt, aber mehrmals in ISE Projekten und 
da ging das auch ohne Basteleien.

von Michael W. (Gast)


Lesenswert?

Das Absturzverhalten bei Vivado 2018.2 habe ich auch. Mitten in der 
Synthese ist manchmal Ende, teilweise auch schon beim Anlegen des 
Projektes oder gar beim Laden des Programmes.

Beitrag "Vivado 2018.2 Projekte anlegen mislingt"

von Gustl B. (-gb-)


Lesenswert?

Da würde ich mir wünschen, dass Xilinx mehr Details zu neuen Versionen 
rausgibt. Bei 2018.3 steht nur da, dass es neueere FPGAs unterstützt, 
aber nicht, ob Bugs behoben wurden.

von user (Gast)


Lesenswert?

Xilinx macht mit Vivado new-Feature releases (.1 und .3 Version) und 
bugfix releases (.2 und .4 Versionen), also macht es Sinn nur .2/.4 
Versionen zu verwenden, wenn man nicht die neuen Features benötigt

von Gustl B. (-gb-)


Lesenswert?

Oh man ... das ist ja noch schlimmer als Patchdays. Wenn ein Bug da ist, 
dann will ich den schnell gefixt haben. Und dann ist mir egal ob die 
nächste Nummer gerade oder ungerade ist, da hat der Patch drinnen zu 
sein.

von S. R. (svenska)


Lesenswert?

Gustl B. schrieb:
> Und dann ist mir egal ob die nächste Nummer gerade oder
> ungerade ist, da hat der Patch drinnen zu sein.

Isser ja auch. Nur gibt's eben zusätzlichen Bugs dazu. :-)

von Florian (Gast)


Lesenswert?

Gustl B. schrieb:
> Aber die Synthese läuft ewig und frisst konstant neuen RAM bis der dann
> voll ist.

Hört sich an als wäre die Synthese nun politisch geworden.

von Gustl B. (-gb-)


Lesenswert?

Ich fühle mich mit meiner Beschreibung diskriminiert! Lösung: 
Signalnamen korrekt gendern und auch vom Master/Slave Konzept großen 
Abstand halten.

von J. S. (engineer) Benutzerseite


Lesenswert?

Gustl B. schrieb:
> Signalnamen korrekt gendern
Pass mal auf, wenn erst die Gleichstellungsbeauftragte kommt und dich 
rund macht, weil die wichtigen Funktionen im Code ausschließlich mit 
männlichen Namen belegt sind, während weibliche Funktionen nur 
vorkommen, wenn sie negativ besetzt sind, wie bei der Subtraktion.
Dann wird sicher auch sofort wieder bemängelt, dass Zählerinnen bei 
gleicher Frequenz doppelt so viele Bits schalten müssen, wie ihre 
männlichen Kollegen, um überhaupt wahrgenommen zu werden und nach wie 
vor trotz gleichem Ergebnis immer noch durchschnittlich 18% weniger 
Strom bekommen.

>Dann stürzt Vivado und leider auch Windows 10 ab.
Kannst du einen Tracker installieren, der den Absturz protokolliert? Nur 
so kann man dem beikommen.

von -gb- (Gast)


Lesenswert?

Ist ja schon gelöst. Hab den Code umgeschrieben.

Tja das mit dem Gendern ... heutzutage glauben wirklich Einige dadurch 
würde etwas besser. Ja, es gibt Ungerechtigkeiten, aber die sollte man 
anders lösen. Und wieso überhaupt statt männlich weiblich? Wieso nicht 
neutral? Das Baum, das Blume, fertig.

In Niederbayern sagt man statt Mädchen übrigens Mescha. Und zwar der 
Mescha.

von Germane (Gast)


Lesenswert?

Bevor uns die Römer die beiden bestimten Artikel gebracht haben, hatten 
wir ja auch nur einen. Da de heutigen deutschsprachigen Regionen aber 
nur teilweise romanisiert wurden, überlebte der unbestimmte Artikel. Am 
Ende waren es dann drei. Die Engländer, die sich die Sprache von den 
primitiven Germanen abgekupfert haben, haben nur einen.

von S. R. (svenska)


Lesenswert?

Germane schrieb:
> Bevor uns die Römer die beiden bestimten Artikel gebracht haben,
> hatten wir ja auch nur einen.

Latein hat drei grammatische Geschlechter und die Existenz für 
grammatische Geschlechter überhaupt lässt sich bis ins indogermanische 
zurückführen. Vermutlich als Trennung zwischen "belebt/unbelebt".

Rückblickend der größte Fehler war, die Dinger "Geschlechter" zu nennen. 
Also als Beschreibung für etwas, was hauptsächlich in einer von zwei 
Varianten vorkommt und dummerweise auch noch ein Biologismus ist.

Die skandinavischen Sprachen haben zwei Artikel, und zwar 
"nicht-neutral" und "neutral". Wäre doch auch mal was...?

: Bearbeitet durch User
von dfIas (Gast)


Lesenswert?

Der Windows-Absturz ist aber nur scheinbar, oder? Eine Applikation kann 
eigentlich nur das System durch Speicherbedarf verlangsamen, es müsste 
dann viel mehr auf der "Platte" ein- und ausgelagert werden. Kommt man 
noch in den Task-Manager? Oder gibt es einen Blue-Screen? Treibermäßig 
etc. sollte doch beim Synthetisieren nichts weiter passieren (können).

von -gb- (Gast)


Lesenswert?

Das kann gut sein. Was der Fehler war weiß ich auch nicht aber mein 
Windows hat neu gestartet. Ist ein Notebook, vielleicht wurde es zu warm 
oder so.

von VHDL hotline (Gast)


Lesenswert?

Sowas ähnliches hatte ich auch schon. Siehe hier:

https://www.xilinx.com/support/answers/52302.html

von Michael W. (Gast)


Lesenswert?

VHDL hotline schrieb im Beitrag #5606065:
> Sowas ähnliches hatte ich auch schon. Siehe hier:
>
> https://www.xilinx.com/support/answers/52302.html

Wo ist da nun der Bezug zum Thema des TE?

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.