Forum: FPGA, VHDL & Co. critical warning


von Max (Gast)


Lesenswert?

Hallo.

Quartus erzeugt 4 "critical warnings" wenn ich meinen vhdl-code 
synthetisieren lass: die 1. beim Fitter und den Rest bei der Timing 
Analysis. Jetzt wollte ich wissen woran das liegen könnte: am code oder 
irgendwas falsch eingestellt. Hier mal der code:
1
library IEEE; 
2
use ieee.std_logic_1164.all; 
3
use ieee.std_logic_arith.all; 
4
5
entity spi is 
6
  port ( spi_Tx  : out std_logic;  -- SPI-lines
7
         spi_clk : out std_logic;
8
         spi_cs  : out std_logic;
9
         spi_Rx  : in  std_logic; 
10
         
11
         new_data : in std_logic;  -- sign
12
         
13
         TxData     :  in std_logic_vector(7 downto 0);   
14
         RxData     :  out std_logic_vector(7 downto 0);
15
       
16
         reset   : in  std_logic;  
17
         clk     : in  std_logic); 
18
end spi; 
19
20
-------------------------------------------------------------------------------
21
--              ARCHITECTURE
22
-------------------------------------------------------------------------------
23
architecture rtl of spi is 
24
25
signal s_TxBuf : std_logic_vector(7 downto 0);
26
signal s_RxBuf : std_logic_vector(7 downto 0);
27
signal s_cnt   : std_logic_vector(4 downto 0);
28
signal s_busy  : std_logic;
29
30
begin
31
32
  p_spi_master : process(clk,reset)
33
  begin
34
    if(reset = '1')then
35
      s_TxBuf <= (others => '0');
36
      s_RxBuf <= (others => '0');
37
      s_cnt   <= (others => '0');
38
      s_busy  <= '0';
39
      spi_cs  <= '1';
40
      spi_clk <= '1';
41
      spi_Tx  <= '1';
42
    elsif(clk = '1' and clk'event) then
43
      if(new_data = '1' and s_busy = '0')then
44
        s_TxBuf <= TxData;
45
        s_busy  <= '1';
46
        s_cnt   <= (others => '0');
47
        spi_cs  <= '0';
48
      end if;
49
      
50
      if(s_busy = '1')then -- shifting is enabled 
51
        s_cnt <= unsigned(s_cnt) + conv_unsigned(1,1);
52
        if(s_cnt(4) /= '1')then    -- are 16 ticks over?
53
          if(s_cnt(0) = '0')then  -- shift out data on every "even" LSB
54
            s_TxBuf <= s_TxBuf(6 downto 0) & '0'; -- shift operation
55
            spi_Tx  <= s_TxBuf(7);   -- data out 
56
            spi_clk <= '0';     -- toggle sclk 
57
          else  -- s_cnt is "odd": rising sclk
58
            s_RxBuf <= s_RxBuf(6 downto 0) & spi_Rx;  -- read RxLine
59
            spi_clk <= '1';
60
          end if;
61
        else -- 16th tick is reached
62
          -- bring module in 'idle'-state
63
          s_busy   <= '0';
64
          spi_cs  <= '1';
65
          spi_Tx  <= '1';
66
          spi_clk <= '1';
67
          RxData  <= s_RxBuf;
68
          s_TxBuf <= (others => '0');
69
          s_RxBuf <= (others => '0');
70
          s_cnt   <= (others => '0');
71
        end if;
72
      end if;
73
    end if;
74
  end process  p_spi_master;
75
end rtl;

Die clock rennt mit 50MHz. In Modelsim verhaltet sich die Schaltung so 
wie ich es wollte, aber das sagt ja nix aus über das timing-problem....
Ist der Code soweit in Ordnung?

LG, Max

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


Lesenswert?

Max schrieb:
> die 1. beim Fitter und den Rest bei der Timing Analysis.
Auf welche Signale beziehen sich die Warnungen?
Was sind das für Warnungen?

von Max (Gast)


Lesenswert?

"Critical Warning: The following clock transfers have no clock 
uncertainty assignment. For more accurate results, apply clock 
uncertainty assignments or use the derive_clock_uncertainty command.
-> critical warning: from clk(rise) to clk(rise) (setup and hold)"

Alle 4 Warnungen schreiben das.

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


Lesenswert?

Max schrieb:
> sagt ja nix aus über das timing-problem....
Das ist kein Timingproblem. Du hast nur keinen Jitter für deinen Takt 
spezifiziert. Das kannst du vermutlich irgendwo in einem Constraint oder 
über die Kommandozeile noch einen Jitter spezifizieren...

Ich würde sagen: schalt deinen Modus auf -ignore

von Matthias G. (mgottke)


Lesenswert?

Ich vermute, dass du keine oder unvollständige Timing-Constraints 
vorgegeben hast. Woher soll das Tool denn wissen wie viel Signallaufzeit 
es zur Verfügung hat. Und so führt es dann zu den Warnings.

von Max (Gast)


Lesenswert?

Ok, danke für Eure Hilfe!

von Fpgakuechle K. (Gast)


Lesenswert?

Ist die vectorbreite 1 beim Zählerincrement hier gewollt? Ich hätte hier 
5 erwartet:

...
signal s_cnt   : std_logic_vector(4 downto 0);
...
 s_cnt <= unsigned(s_cnt) + conv_unsigned(1,1);
...

MfG

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.