Vivado frisst massig RAM und liefert nichts.

#5600493
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.
Gast #5600501
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.
#5600506
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.
Gast #5600517
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/
Gast #5600609
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
#5600647
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.
Persönliche Seite #5604564
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.
Gast #5604581
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.
Gast #5604618
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.
#5605736
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...?
Gast #5605842
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).

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