VHDL忽略进程外的语句

VHDL忽略进程外的语句,vhdl,Vhdl,我希望这是在正确的地方,但因为我认为这是一个语法问题,而不是实际的系统设计,也许是这样 由于某种原因,我有一条语句,当我把它放在进程之外时,它会被忽略。我可以将同一条语句复制/粘贴到一个进程中,然后它突然工作了。但是它必须等待时钟信号,这会把整个事情搞砸 architecture CU of CONTROL_UNIT is type OPCODE_ARRAY is array(3 downto 0) of std_logic_vector(3 downto 0); signal

我希望这是在正确的地方,但因为我认为这是一个语法问题,而不是实际的系统设计,也许是这样

由于某种原因,我有一条语句,当我把它放在进程之外时,它会被忽略。我可以将同一条语句复制/粘贴到一个进程中,然后它突然工作了。但是它必须等待时钟信号,这会把整个事情搞砸

architecture CU of CONTROL_UNIT is
    type OPCODE_ARRAY is array(3 downto 0) of std_logic_vector(3 downto 0);
    signal OPCODES : OPCODE_ARRAY;
begin
    OPCODES(3) <= OPCODE_IN; --problem statement!
    process(CLK)
    begin
        if rising_edge(CLK) then
            for I in 0 to 2 loop
                OPCODES(I) <= OPCODES(I + 1);
            end loop;
        end if;
    end process;
    --more code
end CU;
控制单元的架构CU为
类型操作码_数组是标准_逻辑_向量(3到0)的数组(3到0);
信号操作码:操作码_阵列;
开始

操作码(3)总结评论中的答案:

第一个示例中的过程将为来自最长静态前缀操作码(I)的所有信号创建驱动程序,即操作码。所以操作码(0)也会有驱动程序。但在您的过程中没有操作码(0)的赋值,因此它是“U”


当你把操作码(3)放进去时,这是VHDL变得非常不直观的一个怪癖。它尤其令人困惑,因为其他并行处理语言没有它

另一个解决方案是使用generate语句

architecture CU of CONTROL_UNIT is
    type OPCODE_ARRAY is array(3 downto 0) of std_logic_vector(3 downto 0);
    signal OPCODES : OPCODE_ARRAY;
begin
    OPCODES(3) <= OPCODE_IN; --problem statement!
    some_label: for I in 0 to 2 generate
        OPCODES(I) <= OPCODES(I + 1) when rising_edge(clk);
    end generate;
    --more code
end architecture;
控制单元的架构CU为
类型操作码_数组是标准_逻辑_向量(3到0)的数组(3到0);
信号操作码:操作码_阵列;
开始

操作码(3)您可以直接表示移位,并消除
for…循环
和最长静态前缀问题

process(CLK)
begin
    if rising_edge(CLK) then
        OPCODES <= OPCODE_IN & OPCODES(3 downto 1);
    end if;
end process;
过程(CLK)
开始
如果上升沿(CLK),则

操作码有用的搜索词:“最长静态前缀”+VHDLIEE Std 1076-2008 14.7.2驱动程序过程语句中的每个信号分配语句都为某些标量信号定义了一组驱动程序。处理语句中给定标量信号S有一个驱动程序,前提是该处理语句中至少有一个信号分配语句,并且该信号分配语句的目标信号的最长静态前缀表示或表示S是其子元素的复合信号。最长的静态前缀是有4个元素的操作码。见第8条。名称,8.1概述,最后一段,I是一个变量。你最好问一下如何修复它,可能会有一个适用的问题,答案与你的问题是重复的。8.1…信号名称的最长静态前缀是名称本身,如果名称是静态信号名称;否则,名称的最长前缀为静态信号名称。。。进程中最长的静态前缀是操作码。操作码(I)(8.4索引名称)不是静态表达式(9.4),流程驱动所有元素。两个驱动器的分辨率(4.6分辨率函数,14.7.3.2驱动值)将为“U”(过程中的驱动器具有操作码(3)的初始值“U”)。静态名称(例如,
操作码(2)
)具有较长的最长静态前缀。从generate语句详述的每个块语句将具有一个用迭代值声明的常量I(IEEE Std 1076-2008 11.8,…generate参数是一个常量对象…,14.5.3)。并发分配详细描述为一个流程(11.3),其中包含一个操作码驱动程序(I+1),用于分配(14.7.2)。最长的静态前缀(8.1)包括索引(I+1),它是一个全局静态表达式(9.4.2 s)。循环语句规范动态声明一个未在其语句序列中赋值的变量(10.10、14.6a)。苹果和桔子@user1155120是真的,但这类事情使语言很难学习。这就像我自己的语言荷兰语,被认为是荷兰语。它是日耳曼语的,就像英语一样。在其基础上,该语言具有相同的相对简单的语法。然而,一般情况下有许多例外情况。就连以英语为母语的人也常常感到困惑:每年我们都有一家荷兰国家电视台的听写比赛转播商,而在过去几年里,它并没有被一个荷兰人赢得;)VHDL也是如此:即使是专家也经常感到困惑。1987标准中有大约60%的文本与Ada83 LRM相同,部分重新排列,模拟和硬件描述(例如生成语句)严重受CONLAN*的影响,并创建了一种不同的语言。它的使用需要理解,不适合作为编程语言使用。参见硬件的模拟、综合和形式证明VHDL,1992年,1995年第2版,Kluwer学术出版社,ISBN 978-1-4613-6582-2和硬件描述语言的基本原理和标准,1992年,还有Kluwer,DOI 10.1007/978-94-011-1914-6Oh,我明白了,这就是静态前缀的含义。对于循环中表示的每种情况,Static as in都是相同的。这是有道理的。
process(CLK)
begin
    if rising_edge(CLK) then
        OPCODES <= OPCODE_IN & OPCODES(3 downto 1);
    end if;
end process;
architecture CU of CONTROL_UNIT is
    type OPCODE_ARRAY is array(3 downto 0) of std_logic_vector(3 downto 0);
    signal OPCODES : OPCODE_ARRAY;
begin
    process(CLK, OPCODE_IN)
    begin
        OPCODES(3) <= OPCODE_IN;
        if rising_edge(CLK) then
            for I in 0 to 2 loop
                OPCODES(I) <= OPCODES(I + 1);
            end loop;
        end if;
    end process;
    --more code
end CU;