Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[SOLVED] Error: Subprogram <mmcm_count_calc> does not have a body when creating vhdl package.

Status
Not open for further replies.

Cesar0182

Member level 5
Joined
Feb 18, 2019
Messages
85
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
825
Error: Subprogram <mmcm_count_calc> does not have a body when creating vhdl package.

Greetings ... comment that I am new creating vhdl packages and a couple of days ago I am trying to create one, but I am having the following error shown in the image.

error_package.PNG

Can someone please help me with this error? I leave the code I am using.

Code:
LIBRARY ieee;
  USE ieee.std_logic_1164.all;
  USE ieee.std_logic_unsigned.all;
  USE ieee.std_logic_misc.all;
  USE ieee.numeric_std.all;

package g1_mmcme2_drp_func_vhdl is

  function mmcm_count_calc (divide : std_logic_vector(7 downto 0) ; phase: std_logic_vector(31 downto 0) ; duty_cycle : integer) return std_logic_vector(37 downto 0);
            
end package  g1_mmcme2_drp_func_vhdl;

package body g1_mmcme2_drp_func_vhdl is
function mmcm_count_calc (
  divide     : in std_logic_vector(7 downto 0); -- Max divide is 128
  phase      : in std_logic_vector(31 downto 0);
  duty_cycle : integer)                         -- Multiplied by 100,000
  return std_logic_vector is 

  variable div_calc        : std_logic_vector(13 downto 0);
  variable phase_calc      : std_logic_vector(16 downto 0);
  begin
  
  div_calc   := mmcm_divider(divide, std_logic_vector(to_unsigned(duty_cycle,32)));
  -- mx[10:9], pm[8:6], dt[5:0]
  phase_calc(10 downto 0) := mmcm_phase(divide, phase);

  -- Return value is the upper and lower address of counter
  --    Upper address is:
  --       RESERVED    [31:26]
  --       MX          [25:24]
  --       EDGE        [23]
  --       NOCOUNT     [22]
  --       DELAY_TIME  [21:16]
  --    Lower Address is:
  --       PHASE_MUX   [15:13]
  --       RESERVED    [12]
  --       HIGH_TIME   [11:6]
  --       LOW_TIME    [5:0]

  return
        -- Upper Address
        "000000000000" & phase_calc(10 downto 9) & div_calc(13 downto 12) & phase_calc(5 downto 0) &
        -- Lower Address
        phase_calc(8 downto 6) & '0' & div_calc(11 downto 0);
 end function;
end g1_mmcme2_drp_func_vhdl;
 

ads-ee

Super Moderator
Staff member
Joined
Sep 10, 2013
Messages
7,914
Helped
1,821
Reputation
3,652
Reaction score
1,800
Trophy points
1,393
Location
USA
Activity points
59,896
Re: Error: Subprogram <mmcm_count_calc> does not have a body when creating vhdl packa

The declaration of the function's return type is just the type it doesn't include a range, i.e. "indexed" name is not a type
 

Cesar0182

Member level 5
Joined
Feb 18, 2019
Messages
85
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
825
Re: Error: Subprogram <mmcm_count_calc> does not have a body when creating vhdl packa

Thanks for answering ads-ee ... I'm not sure what you mean by "indexed" name is not a type.
I have made some changes based on the data sheets https://www.xilinx.com/support/documentation/sw_manuals/xilinx2019_1/ug901-vivado-synthesis.pdf on page 207, but I'm still getting the same error. These are the changes in my code.

Code:
LIBRARY ieee;
  USE ieee.std_logic_1164.all;
  USE ieee.std_logic_unsigned.all;
  USE ieee.std_logic_misc.all;
  USE ieee.numeric_std.all;

package g1_mmcme2_drp_func_vhdl is

  type type_mmcm_count_calc is  
    record
      divide          : std_logic_vector(7 downto 0);  
      phase           : std_logic_vector(31 downto 0);  
      duty_cycle      : integer;   
  end record;

  function mmcm_count_calc (arguments: type_mmcm_count_calc) return std_logic_vector(37 downto 0);
            
end package  g1_mmcme2_drp_func_vhdl;

package body g1_mmcme2_drp_func_vhdl is

function mmcm_count_calc (
  arguments     : type_mmcm_count_calc)                         
  return std_logic_vector is 
  
  variable mmcm_count_calc : std_logic_vector(37 downto 0);
  variable div_calc        : std_logic_vector(13 downto 0);
  variable phase_calc      : std_logic_vector(16 downto 0);
  begin
  
  div_calc   := mmcm_divider(arguments.divide, std_logic_vector(to_unsigned(arguments.duty_cycle,32)));
  -- mx[10:9], pm[8:6], dt[5:0]
  phase_calc(10 downto 0) := mmcm_phase(arguments.divide, arguments.phase);

  -- Return value is the upper and lower address of counter
  --    Upper address is:
  --       RESERVED    [31:26]
  --       MX          [25:24]
  --       EDGE        [23]
  --       NOCOUNT     [22]
  --       DELAY_TIME  [21:16]
  --    Lower Address is:
  --       PHASE_MUX   [15:13]
  --       RESERVED    [12]
  --       HIGH_TIME   [11:6]
  --       LOW_TIME    [5:0]
  mmcm_count_calc := "000000000000" & phase_calc(10 downto 9) & div_calc(13 downto 12) & phase_calc(5 downto 0) &
          -- Lower Address
          phase_calc(8 downto 6) & '0' & div_calc(11 downto 0);
  return
  mmcm_count_calc;
        -- Upper Address
        
end function;
end g1_mmcme2_drp_func_vhdl;
 

Cesar0182

Member level 5
Joined
Feb 18, 2019
Messages
85
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
825
Re: Error: Subprogram <mmcm_count_calc> does not have a body when creating vhdl packa

I just fixed it, I wasn't getting it very much. This is my new code.
Code:
BIBLIOTECA ieee;
  USE ieee.std_logic_1164.all;
  USE ieee.std_logic_unsigned.all;
  USE ieee.std_logic_misc.all;
  USE ieee.numeric_std.all;

el paquete g1_mmcme2_drp_func_vhdl es

  función mmcm_count_calc (divide: std_logic_vector (7 downto 0); fase: std_logic_vector (31 downto 0); duty_cycle: integer) return std_logic_vector;
            
paquete final g1_mmcme2_drp_func_vhdl;

el cuerpo del paquete g1_mmcme2_drp_func_vhdl es
función mmcm_count_calc (
  dividir: en std_logic_vector (7 downto 0); - La división máxima es 128
  fase: en std_logic_vector (31 downto 0);
  duty_cycle: integer) - Multiplicado por 100,000
  return std_logic_vector es 

  variable div_calc: std_logic_vector (13 downto 0);
  variable phase_calc: std_logic_vector (16 downto 0);
  empezar
  
  div_calc: = mmcm_divider (divide, std_logic_vector (to_unsigned (duty_cycle, 32)));
  - mx [10: 9], pm [8: 6], dt [5: 0]
  phase_calc (10 downto 0): = mmcm_phase (división, fase);

  - El valor de retorno es la dirección superior e inferior del contador
  - La dirección superior es:
  - RESERVADO [31:26]
  - MX [25:24]
  - BORDE [23]
  - CUENTA [22]
  - DELAY_TIME [21:16]
  - Dirección inferior es:
  - PHASE_MUX [15:13]
  - RESERVADO [12]
  - HIGH_TIME [11: 6]
  - LOW_TIME [5: 0]

  regreso
        - Dirección superior
        "000000000000" y phase_calc (10 downto 9) y div_calc (13 downto 12) y phase_calc (5 downto 0) &
        - Dirección inferior
        phase_calc (8 downto 6) & '0' & div_calc (11 downto 0);
 función final;
end g1_mmcme2_drp_func_vhdl;
 

ads-ee

Super Moderator
Staff member
Joined
Sep 10, 2013
Messages
7,914
Helped
1,821
Reputation
3,652
Reaction score
1,800
Trophy points
1,393
Location
USA
Activity points
59,896
Re: Error: Subprogram <mmcm_count_calc> does not have a body when creating vhdl packa

Thanks for answering ads-ee ... I'm not sure what you mean by "indexed" name is not a type.
That was from the error message in your first post.

The error is due to the line in post #3.
Code:
function mmcm_count_calc (arguments: type_mmcm_count_calc) return std_logic_vector[COLOR="#FF0000"](37 downto 0)[/COLOR];

which you finally changed to this in post #4.
Code:
función mmcm_count_calc (divide: std_logic_vector (7 downto 0); fase: std_logic_vector (31 downto 0); duty_cycle: integer) return std_logic_vector;

where you finally removed the index "(37 downto 0)" from the type "std_logic_vector".
 

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top