【问题标题】:vhdl "expression is not constant"vhdl“表达式不是常数”
【发布时间】:2019-03-25 15:44:41
【问题描述】:

我确实有以下 vhdl 代码,它为 "signal FiltReg" 行提供错误“表达式不是恒定的”:

--FILE A--
PORT
(
FindParam   : OUT STD_LOGIC_VECTOR(48 DOWNTO 0);
...
);

ARCHITECTURE a OF b IS
SIGNAL MAtaps : STD_LOGIC_VECTOR(4 DOWNTO 0);

BEGIN
FindParam <= (MAtaps & ...);

PROCESS (clk, clr_n)
  BEGIN
  IF clr_n = '0' THEN
    MAtaps <= (OTHERS => '0');
  ELSIF (clk'EVENT AND clk = '1') THEN
    MAtaps <= param2((MAtaps'HIGH) DOWNTO 0); 
  END IF;
END PROCESS;

.

 --FILE B--
 PORT
 (
 FindParam   : in STD_LOGIC_VECTOR(48 DOWNTO 0);
 ...
 );

 -- Local signals
   signal MAtaps     : integer range 0 to 16;
   signal FiltReg    : UNSIGNED(MAtaps DOWNTO 0); 


BEGIN

    MAtaps <= to_integer(unsigned(FindParam(48 DOWNTO 44)));

看起来信号声明必须是常量,但事实并非如此。

问题:是否有解决方案或变通方法可以将 MAtaps 用于信号 FiltReg 声明?

编辑: Quartus 错误消息是:

提前致谢

【问题讨论】:

  • 这不是 VHDL 语言问题,它似乎是综合限制(例如 Quartus 错误 10779)。 FiltReg 的声明是有效的 VHDL。但是 MAtaps 的值是从它的声明中的默认值派生的(0,它的范围的最左边的值,在详细说明 FiltReg 声明时)。 FiltReg 的范围为 0 到 0,长度为 1。如果您希望有人提出解决方法,请提供minimal reproducible example,包括完整的错误消息。否则 MAtaps 可能是类常量而不是信号。
  • FiltReg 的声明是有效 VHDL 的原因可以在 IEEE Std 1076-2008 6.4.2.3 信号声明注 2 中找到(“信号通过初始化驱动程序被赋予初始值。”),14.7。 3.4 信号更新、14.7.2 驱动程序、14.4 说明性部分的详细说明/14.4.2.5 对象声明(“d)将任何初始值分配给对象。”)。
  • 我添加了 Quartus 错误信息

标签: vhdl


【解决方案1】:

没有。 MAtaps 需要static,即在编译时固定。 (VHDL 是一种硬件 描述语言。您不能拥有可变数量的硬件。)MAtaps 可以是常量或泛型,但不能是另一个信号或变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多