【问题标题】:Initializing an array of records in VHDL在 VHDL 中初始化记录数组
【发布时间】:2013-12-17 09:27:16
【问题描述】:

我的记录定义如下

type ifx_t is
record
  data                        : std_logic_vector(127 downto 0);
  address                     : std_logic_vector (19 downto 0); 
  WrReq                       : std_logic;-- 
  RdReq                       : std_logic; --
end record;
type Array_ifx_t is array (0 to 2) of ifx_t;

我必须初始化这个记录数组的一个实例,我尝试了以下方法,但它不起作用

signal pair_in       : Array_ifx_t:= (others =>((others =>'0'),(others=>'0'),'0','0')); 

请帮助。

【问题讨论】:

  • 您使用的是什么工具,您看到了什么错误信息?它在 ModelSim 编译中运行良好。
  • 这里的错误信息是“Formal has no actual or default value”并且代码在“ISim Simulator: Behavioral Check Syntax”中被编译。
  • 刚刚尝试过 ISim 14.6 (nt64),它通过了“行为检查语法”运行而没有错误。也许错误是由于与其他代码的某种关系。您可以尝试将模块缩减为仅实体、架构和上面的代码,然后查看是否通过。否则,请在此处发布整个精简模块。
  • 问题是由于没有映射pair_in应该映射的端口。

标签: arrays signals vhdl records


【解决方案1】:

正如评论中所说,ModelSim 在使用 ModelSim 编译来自问题的代码时工作。但是,其他工具可能更严格地对 Array_ifx_t 中的元素使用类型化值。

对于命名记录元素的类型化分配和使用,我认为这可以提供 getter 概述并避免位置引用错误,您可以使用以下方法进行初始化:

constant IFX_T_0S : ifx_t := (data => (others =>'0'),
                              address => (others=>'0'),
                              WrReq => '0',
                              RdReq => '0');

signal pair_in : Array_ifx_t:= (others => IFX_T_0S);

【讨论】:

  • 感谢您的回复。仍然无法正常工作。错误消息是“正式的 没有实际值或默认值”
  • 线索是“正式”这个词......你没有告诉我们的代码,一个名为“pair_in”的端口或过程参数没有正确连接到这个信号(或否则初始化。找到它并将其添加到问题中。
  • 听起来像 a) 没有默认表达式,其中 pair_in 被声明为“设计实体的正式端口或正式泛型、块语句或 a 的正式参数子程序”(正式的 LRM 词汇表)并且它不是驱动的。您是否在多个地方使用了名称pair_in
  • 问题是由于没有映射pair_in应该映射的端口。
【解决方案2】:

看到pair_in 的默认值中的聚合,我最初的反应是“其他”太多了,所以我使用记录类型声明本身独立编写了一个:

library ieee;
use ieee.std_logic_1164.all;

package some_record is

    type ifx_t is
    record
      data                        : std_logic_vector(127 downto 0);
      address                     : std_logic_vector (19 downto 0); 
      WrReq                       : std_logic;-- 
      RdReq                       : std_logic; --
    end record;
    type Array_ifx_t is array (0 to 2) of ifx_t;
    -- positional association in an aggregate used for initialization:
    signal pair_in:    ifx_t := ((others => '0'), (others => '0'),'0','0');
end package;

这分析成功了。聚合有两种类型的关联,位置关联或命名关联。上面的默认值表达式是位置的。使用命名关联:

signal pair_in:    ifx_t := -- named association of record elements:
                           (
                             data => (others => '0'), 
                             address => (others =>'0'), 
                             WrReq => '0',
                             RdReq => '0'
                           );

您会注意到这与 Morten 接受答案的常量声明中的值表达式有着惊人的相似之处,并且实际上讲述了聚合表达式的兼容性。

与记录类型兼容的聚合包含与记录类型的每个元素兼容的值表达式。这是通过为其默认值提供聚合来为数组元素数据和地址完成的,而 WrReq 和 RdReq 则直接提供其默认值。

如果pair_in 是由ifx_t 记录类型元素组成的数组组成的复合类型,则在原始尝试中发现的额外其他语句是合适的。

LRM(例如 IEEE Std 1076-1993)有一个关于表达式的部分,一个关于聚合的小节,还有一个关于记录聚合的小节。

还有一个关于类型的部分,一个关于复合类型的小节,还有一个关于记录类型的小节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多