For loop 如何在过程中使用for循环

For loop 如何在过程中使用for循环,for-loop,vhdl,procedure,For Loop,Vhdl,Procedure,我需要在过程中使用for循环来影响信号的所有位,否则代码将非常庞大 我的代码如下所示: FSM : process(CLK, RST) procedure Reset is begin triplet_check_vec <= (others=>'0'); end Reset; procedure triplet_check is begin for k in 0 to 19 loop

我需要在过程中使用for循环来影响信号的所有位,否则代码将非常庞大

我的代码如下所示:

FSM : process(CLK, RST)
    procedure Reset is
    begin
        triplet_check_vec <= (others=>'0');
    end Reset;

    procedure triplet_check is
    begin
        for k in 0 to 19 loop
            triplet_check_vec(k) <= (DATA_IN(3*k+0) and DATA_IN(3*k+1) and DATA_IN(3*k+2)) or (not(DATA_IN(3*k+0)) and not(DATA_IN(3*k+1)) and not(DATA_IN(3*k+2)));
        end loop;
    end triplet_check;

begin
    if RST = '1' then
        Reset;

    elsif rising_edge(CLK) then
        -- some stuff
        -- ...

        triplet_check;

        -- ...
        -- some stuff
    end if;

end process FSM;
FSM:过程(时钟、RST)
程序重置为
开始
三元组检查向量“0”);
结束复位;
程序三元组检查为
开始
对于0到19循环中的k

triplet_check_vec(k)一个过程的参数列表定义了它的输入和输出,有点像一个微型模块。它可以是信号或常量,但与模块不同,它也可以是变量。欲知详情

创建过程的基本语法是

procedure <procedure_name> (signal|variable|constant <name1> : in|out|inout <type>;
                            signal|variable|constant <name2> : in|out|inout <type>;
                            ... ) is
    <signal_constant_or_variable_declarations_for_use_within_the_procedure>
begin
    <code_performed_by_the_procedure_here>
end procedure;
程序(信号|变量|常数:输入|输出|输入;
信号|变量|常数:输入|输出|输入;
…)是
开始
结束程序;
以你为例

procedure triplet_check (constant DATA_IN             : in    std_logic_vector(59 downto 0);
                         variable triplet_check_vec   : out   std_logic_vector(19 downto 0)) is
begin
    for k in 0 to 19 loop
        triplet_check_vec(k) <= (DATA_IN(3*k+0) and DATA_IN(3*k+1) and DATA_IN(3*k+2)) or (not(DATA_IN(3*k+0)) and not(DATA_IN(3*k+1)) and not(DATA_IN(3*k+2)));
    end loop;
end triplet_check;
procedure triplet\u check(常量数据\u IN:标准逻辑\u向量(59向下至0);
变量三元组校验向量:输出标准逻辑向量(19向下至0))为
开始
对于0到19循环中的k

triplet_check_vec(k)一个过程的参数列表定义了它的输入和输出,有点像一个微型模块。它可以是信号或常量,但与模块不同,它也可以是变量。欲知详情

创建过程的基本语法是

procedure <procedure_name> (signal|variable|constant <name1> : in|out|inout <type>;
                            signal|variable|constant <name2> : in|out|inout <type>;
                            ... ) is
    <signal_constant_or_variable_declarations_for_use_within_the_procedure>
begin
    <code_performed_by_the_procedure_here>
end procedure;
程序(信号|变量|常数:输入|输出|输入;
信号|变量|常数:输入|输出|输入;
…)是
开始
结束程序;
以你为例

procedure triplet_check (constant DATA_IN             : in    std_logic_vector(59 downto 0);
                         variable triplet_check_vec   : out   std_logic_vector(19 downto 0)) is
begin
    for k in 0 to 19 loop
        triplet_check_vec(k) <= (DATA_IN(3*k+0) and DATA_IN(3*k+1) and DATA_IN(3*k+2)) or (not(DATA_IN(3*k+0)) and not(DATA_IN(3*k+1)) and not(DATA_IN(3*k+2)));
    end loop;
end triplet_check;
procedure triplet\u check(常量数据\u IN:标准逻辑\u向量(59向下至0);
变量三元组校验向量:输出标准逻辑向量(19向下至0))为
开始
对于0到19循环中的k

三元组检查向量(k)
triplet检查向量
是如何声明的?什么是
CLK
?它有上升的优势吗?什么是一些东西?什么是
中的数据?你是对的,我没有提供足够的细节。CLK是一种标准逻辑,它有上升的边缘。triplet_check_vec是一个标准逻辑向量(19向下到0)DATA_IN是一个标准逻辑向量(19向下到0)我首先做的是在triplet_check过程中一点一点地影响triplet_check_vec,它起作用了。现在唯一的区别是循环,它不再工作了。例如,对于
k=19
,您正在访问(3*k+2)
中的
数据,这是
数据(57+2)
这是
数据(59)
,它不存在。计算这些索引的方式有问题。是否在过程范围内未重新定义“triplet\u check\u vec”?你能用定义的in和output参数来完成这个过程吗?对不起,我说了一个错误,DATA_in是std_logic_vector(59向下到0)如何声明三重态检查向量?什么是
CLK
?它有上升的优势吗?什么是一些东西?什么是
中的数据?你是对的,我没有提供足够的细节。CLK是一种标准逻辑,它有上升的边缘。triplet_check_vec是一个标准逻辑向量(19向下到0)DATA_IN是一个标准逻辑向量(19向下到0)我首先做的是在triplet_check过程中一点一点地影响triplet_check_vec,它起作用了。现在唯一的区别是循环,它不再工作了。例如,对于
k=19
,您正在访问(3*k+2)
中的
数据,这是
数据(57+2)
这是
数据(59)
,它不存在。计算这些索引的方式有问题。是否在过程范围内未重新定义“triplet\u check\u vec”?你能用定义的in和output参数来完成这个过程吗?对不起,我说了一个错误,数据是std逻辑向量(59到0)