【发布时间】: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 声明?
提前致谢
【问题讨论】:
-
这不是 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