EmbDev.net

Forum: FPGA, VHDL & Verilog Clock port and any other port of a register should not be driven by the same signal source


von Robert (Guest)


Rate this post
useful
not useful
Hallo,

I get this Warning from Altera Design Assistant for the below:

Clock port and any other port of a register should not be driven by the 
same signal source

Critical Warning (308012): Node 
"App_Logic:inst1|LGVCtrl:inst1|i_Soll_Skal:inst|s_clk"

I previously made some changes to this to meet Timing requirements. I 
tried driving just a '1' instead of driving the sys_clk to v_clk. But 
the timing requirements do not meet when I do so. Any suggestions?
1
LIBRARY IEEE;
2
USE IEEE.numeric_std.all;
3
USE IEEE.std_logic_1164.all;
4
5
ENTITY i_Soll_Skal IS
6
7
GENERIC(
8
    ADC_Res       : INTEGER:=  4095; 
9
    ADC_Res_I    : INTEGER:= 9840;       
10
    
11
    
12
);
13
14
PORT(
15
    sys_clk,reset   : IN STD_LOGIC;
16
    i_Sample_Clock  : IN STD_LOGIC;
17
    i_sollwert     : IN STD_LOGIC_VECTOR(13 downto 0);   -- Input Sollwert
18
    i_istwert    : IN STD_LOGIC_VECTOR(11 downto 0);    -- Input Istwert (IFact)    
19
    o_sollwert    : OUT STD_LOGIC_VECTOR(15 downto 0);   -- Scaled Sollwert 
20
    o_istwert    : OUT STD_LOGIC_VECTOR(15 downto 0);   -- Scaled Istwert 
21
    o_new_data     : OUT STD_LOGIC;                       -- Trigger to PID for new data
22
    
23
);
24
25
END ENTITY i_Soll_Skal;
26
27
ARCHITECTURE behaviour OF i_Soll_Skal IS
28
29
--Altera-Divider 
30
  --Typ: lpm_divide, 24/12 Bit (unsigned)
31
  COMPONENT lpm_divide_44_24_pip
32
    PORT
33
    (
34
    clock    : IN STD_LOGIC ;
35
    denom    : IN STD_LOGIC_VECTOR (23 DOWNTO 0);
36
    numer    : IN STD_LOGIC_VECTOR (43 DOWNTO 0);
37
    quotient  : OUT STD_LOGIC_VECTOR (43 DOWNTO 0)
38
    );
39
  END COMPONENT;
40
  
41
42
  -- Signals  
43
  signal s_Div_N      : STD_LOGIC_VECTOR(43 DOWNTO 0);
44
  signal s_Div_D      : STD_LOGIC_VECTOR(23 DOWNTO 0);
45
  signal s_Div_Q      : STD_LOGIC_VECTOR(43 DOWNTO 0);
46
  signal s_clk      : STD_LOGIC;
47
 
48
BEGIN
49
50
div : lpm_divide_44_24_pip
51
  PORT MAP
52
  (
53
     clock    => s_clk,
54
    denom    => s_Div_D,
55
    numer    => s_Div_N,
56
    quotient  => s_Div_Q
57
  );
58
  
59
calc_wert : PROCESS(reset, sys_clk)
60
  variable v_Sample_Clock      : std_logic;
61
  variable v_sollwert        : unsigned(13 downto 0);
62
  variable v_actVal          : std_logic_vector(11 downto 0);
63
  variable v_numer          : unsigned(43 downto 0);
64
  variable v_denom          : unsigned(23 downto 0);
65
  variable v_startNewCalc      : std_logic;
66
  variable v_calc    : unsigned(1 DOWNTO 0);
67
  variable v_div_result      : std_logic_vector(35 downto 0);
68
  variable v_updateVal        : std_logic;
69
  variable v_clk                : std_logic;
70
BEGIN
71
   
72
  
73
  IF reset = '0' THEN
74
    -- Asynchronous reset
75
    v_Sample_Clock      := '0';
76
    v_actVal          := (others => '0');
77
    v_numer          := (others => '0');
78
    v_denom          := (others => '0');
79
    v_startNewCalc      := '0';
80
    v_calc    := (others => '0');
81
    v_div_result      := (others => '0');
82
    v_updateVal        := '0';
83
    
84
  ELSIF rising_edge(sys_clk) THEN    
85
    -- Update Istwert/IFact
86
    o_new_data      <= '0';
87
  
88
    
89
    IF i_Sample_Clock = '1' AND v_Sample_Clock = '0' THEN
90
        
91
        v_actVal        := i_istwert; 
92
        v_numer         := v_sollwert * (to_unsigned(ADC_Res,30));
93
        v_denom         := to_unsigned(ADC_Res_I,24);
94
        v_startNewCalc    := '1';
95
          v_clk             := sys_clk; -- '1';
96
    END IF;
97
    v_Sample_Clock  := i_Sample_Clock;
98
    
99
    IF v_updateVal = '1' THEN
100
      o_sollwert  <= "0000" & v_div_result(11 downto 0); 
101
      o_istwert  <= "0000" & v_actVal;            
102
      o_new_data  <= '1';                           
103
      v_updateVal  := '0';
104
    END IF;
105
    
106
            
107
    CASE v_calc IS 
108
     
109
       WHEN "01" =>  s_Div_D        <= std_logic_vector(v_denom);
110
                s_Div_N        <= std_logic_vector(v_numer);
111
                  s_clk             <= v_clk;    
112
      WHEN "10" =>  v_div_result    := s_Div_Q(35 downto 0);
113
                v_updateVal      := '1';
114
                v_calc  := "00";
115
                s_clk             <= v_clk;  
116
      WHEN OTHERS => NULL;
117
    END CASE;
118
    
119
    IF v_startNewCalc = '1' OR v_calc /= "00" THEN
120
      v_calc  := v_calc + 1;
121
    END IF;
122
    
123
    v_startNewCalc  := '0';  
124
  END IF;
125
   
126
END PROCESS calc_wert;
127
128
END ARCHITECTURE behaviour;

von Achim S. (Guest)


Rate this post
useful
not useful
inside the FPGA a signal is either a standard logic signal or it is a 
clock. Compared to standard logic signals clocks run on own, separate 
CLK-lines in the FPGA and are driven by own, separate buffers. And 
clocks have a different function: they "trigger" a flip flop, while 
standard logic signals run through logic gates to deliver e.g. the 
data-input for the flip-flop.

Do not try, to derive clocks from logic signals - it won't work. If a 
signal should work as clock, it has to stem from a clock source (a 
clk-input or a PLL or ...), it must not stem from standard logic gates.

In your actual design you assign sys_clk to v_clk, then you assign v_clk 
to s_clk, and then you use s_clk to drive the clock-input of your 
divider. Skip the whole assignment chain: use sys_clk to drive the 
clock-input of your divider directly.

If your intention is, that the divider is only active in some cycles of 
sys_clk and is stall in other cycles of sys_clk, then redesign your 
divider so that it uses a Clock-Enable input and set it Clock Enable 
active only in the desired cycles of sys_clk.

von lcsdesigner (Guest)


Rate this post
useful
not useful
As said you are driving two destinations without a required clock Buffet

von Robert (Guest)


Rate this post
useful
not useful
Thank you. I altered the design directly assigning to the divider clock. 
It did not meet the timing requirements. But solved it finally.

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.