时钟阵列的VHDL语法(合成可接受,但非活动HDL模拟器)

时钟阵列的VHDL语法(合成可接受,但非活动HDL模拟器),vhdl,Vhdl,我想重用一些旧代码中的VHDL语法有问题。合成工具(Synplify)可以接受,但模拟器(Aldec Active HDL 8.3)给出以下错误。(注:此结构已被此模拟器的早期版本接受) #错误:COMP96_0228:buffered_data.vhdl:(19,28):如果实际值与任何模式的信号参数相关联,则实际值必须由静态信号名称表示 我知道错误与信号clk(I)中的(I)不一样,但我不想将循环展开到(0)、(1)等,因为它用于不同端口大小的几个不同配置中,我确信一定有一种方法来描述这一点

我想重用一些旧代码中的VHDL语法有问题。合成工具(Synplify)可以接受,但模拟器(Aldec Active HDL 8.3)给出以下错误。(注:此结构已被此模拟器的早期版本接受)

#错误:COMP96_0228:buffered_data.vhdl:(19,28):如果实际值与任何模式的信号参数相关联,则实际值必须由静态信号名称表示

我知道错误与信号clk(I)中的(I)不一样,但我不想将循环展开到(0)、(1)等,因为它用于不同端口大小的几个不同配置中,我确信一定有一种方法来描述这一点

到目前为止,我的解决方案是将一个实例封装在它自己的实体/arch层次结构中,并使用“generate”为每个端口实例化一次,但我不喜欢它。还有更好的主意吗

非常简单的例子正好显示了我的问题。(目的是确保数据首先使用其自身的相关时钟进入FPGA,然后再进行其他操作)

IEEE库;
使用IEEE.STD_LOGIC_1164.all;
实体输入缓冲区为
港口(
clk:标准逻辑向量;
数据输入:标准逻辑向量;
数据输出:输出标准逻辑向量
);
终端输入缓冲区;
输入缓冲区的rtl结构是
常数c_numoforts:整数:=3;
开始
p_过程:过程(clk)
开始
对于0到c_numoforts-1循环中的i
如果上升沿(clk(i))那么——这里的错误

数据输出(i)FWIW,我与Modelsim得到相同的结果:

Model Technology ModelSim PE vcom 10.0a Compiler 2011.02 Feb 20 2011
-- Loading package STANDARD
-- Loading package TEXTIO
-- Loading package std_logic_1164
-- Compiling entity input_buffer
-- Compiling architecture rtl of input_buffer
** Error: clk.vhd(19): (vcom-1450) Actual (indexed name) for formal "s" is not a static signal name.
** Error: clk.vhd(25): VHDL Compiler exiting
顺便问一下,您是否有理由使用
常量而不仅仅是这样做

    for i in clk'range loop

但是我还没有想到真正的答案,对不起

如果您将进程内部的循环更改为进程外部的generate语句,那么它在ModelSim中工作得很好(我没有可用的Aldec),而且IMHO似乎比一个有大量时钟的进程更干净。我通常也会使用泛型来定义端口宽度,而不是将它们作为体系结构中的常量引入,但我认为这样做是有原因的:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity input_buffer is
     port(
         clk : in std_logic_vector;
         data_in : in std_logic_vector;
         data_out : out std_logic_vector
         );
end input_buffer;

architecture rtl of input_buffer is
    constant c_NumOfPorts : integer := 3;
begin

    gen : for i in 0 to c_NumOfPorts-1 generate
    begin
        p_process: process(clk(i))
        begin
            if rising_edge(clk(i)) then -- error here
                data_out(i) <= data_in(i);
            end if;
        end process;
    end generate;

end rtl;
IEEE库;
使用IEEE.STD_LOGIC_1164.all;
实体输入缓冲区为
港口(
clk:标准逻辑向量;
数据输入:标准逻辑向量;
数据输出:输出标准逻辑向量
);
终端输入缓冲区;
输入缓冲区的rtl结构是
常数c_numoforts:整数:=3;
开始
gen:为0中的i生成c_numoforts-1
开始
p_过程:过程(clk(i))
开始
如果上升沿(clk(i))那么——这里的错误

data_out(i)只是出于好奇,您在活动HDL中启用了什么语言选项?您使用的是什么版本的synplify?这两个工具之间的语言支持差异也常常让我感到有些心痛。目前使用的是Synplify Pro D-2009.12A,但早期版本在这方面表现相同。以下两个激活的HDL 8.3命令都显示了这一点:acom-O3-work-work-2002$dsn/src/buffered_data.vhdl acom-O3-work-2008$dsn/src/buffered_data.vhdl我还没有找到接受此语法的任何其他组合(可能无效)。7.3不支持-2008,但是这段代码没有问题。这是一个简化的示例。在原始代码中,常量来自一个包,并且不是clk的每个元素都可以使用。问题是如何更好地编写上升沿(clk(i))或以不需要为clk的每个元素声明单独信号的方式重新排列代码。实际上,我很高兴ModelSim也出现了错误,因为这意味着活动HDL可能是正确的,代码可能是错误的。但是在这种情况下,正确的定义仍然是合成工具所接受的:)谢谢,这现在是有意义的!(还有我自己没有看到“在流程之外生成”的解决方案,因为我几周前自己也在使用它!)谢谢。我可以发誓我已经试着像你一样在一个生成器中嵌套每个时钟的进程,但这绝对是我想要的。
library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity input_buffer is
     port(
         clk : in std_logic_vector;
         data_in : in std_logic_vector;
         data_out : out std_logic_vector
         );
end input_buffer;

architecture rtl of input_buffer is
    constant c_NumOfPorts : integer := 3;
begin

    gen : for i in 0 to c_NumOfPorts-1 generate
    begin
        p_process: process(clk(i))
        begin
            if rising_edge(clk(i)) then -- error here
                data_out(i) <= data_in(i);
            end if;
        end process;
    end generate;

end rtl;