【问题标题】:VHDL: formal port 'portName' has no actual or default valueVHDL:正式端口“portName”没有实际值或默认值
【发布时间】:2019-08-24 14:54:09
【问题描述】:

我在 VHDL 测试台实例化 VHDL 模块 PWM 时收到编译错误:“正式端口 'Duty_Cycle' 没有实际值或默认值”。站在“dev_to_test:PWM”代码行时会出现错误。在实例化的 PWM 模块中,Duty_Cycle stg_logic_vector 被强制转换为无符号,然后分配为整数,但不要认为这可能会影响端口实例化。 我试图在端口映射中传递“00001111”向量值,这会导致相同的错误。 请帮助确定错误是什么。

architecture test of test_pwm is
component PWM
    Generic (
        BIT_DEPTH   : integer;
        INPUT_CLK   : integer; -- 50MHz
        FREQ        : integer); -- 50Hz
    Port (
        Pwm_Out     : out std_logic;
        Duty_Cycle  : in std_logic_vector(BIT_DEPTH - 1 downto 0);
        Clk         : in std_logic;
        Enable      : in std_logic);
end component;

constant BIT_DEPTH  : integer := 8;
constant INPUT_CLK  : integer := 125000000; -- 50MHz
constant FREQ       : integer := 50; -- 50Hz

signal Enable      : std_logic := '0';
signal Duty_Cycle  : std_logic_vector(BIT_DEPTH - 1 downto 0) := "00001111";
signal Clk         : std_logic := '1';
signal Pwm_Out     : std_logic;   


begin
    dev_to_test: PWM
        generic map(BIT_DEPTH,INPUT_CLK,FREQ);
        port map(Pwm_Out,Duty_Cycle,Clk,Enable);

【问题讨论】:

  • Giampietro Seu 所示的简单印刷错误可以通过提供minimal reproducible example 并尝试(此处为分析或“编译”)该示例来检测。这是一个带有多余分号的语法错误,应该会产生一个错误,即port 不会导致并发语句。该错误是由组件实例化语句由必需元素(标签、组件名称)和两个可选元素(通用映射和端口映射方面)组成,它们是完整的而不是并发语句。
  • IEEE Std 1076-2008 11.7.1 “组件实例化声明和相应的配置规范(如果有的话)合在一起意味着要扩展包含组件实例化的设计实体中的块层次结构具有由另一个设计实体定义的块的唯一副本。组件实例化语句和配置规范的绑定指示中的通用映射和端口映射方面标识了为了完成扩展而要建立的连接。
  • 3.1 "一个设计实体可以用blocks的层次结构来描述,每个blocks代表整个设计的一部分。这样的顶层block层次结构是设计实体本身;这样的块是驻留在库中的外部块,可以用作其他设计的组件。层次结构中的嵌套块是内部 块,由块语句定义(见 11.2)。”块不是模块。什么版本的 Vivado?在综合内部块语句中不能有端口或通用子句,而它们模拟得很好。
  • Vivado 版本为 2019.1。

标签: vhdl vivado


【解决方案1】:

IEEE 标准 1076-2008

11.7 组件实例化语句

component_instantiation_statement ::=
    instantiation_label :
        instantiated_unit
            [ generic_map_aspect ]
            [ port_map_aspect ] ; 

generic_map_aspect ::=     
   generic map (generic_association_list ) 

generic map(BIT_DEPTH,INPUT_CLK,FREQ); 末尾的分号过多,因此,它没有看到端口的映射并给您错误。 要解决该错误,只需删除该分号:

dev_to_test: PWM
        generic map(BIT_DEPTH,INPUT_CLK,FREQ)
        port map(Pwm_Out,Duty_Cycle,Clk,Enable);

PS:为了降低设计错误的风险,最好在端口和通用映射中使用命名关联而不是位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多