For循环中的VHDL错误
在下面的代码中,我收到了以下错误,但我不明白为什么它是一个错误For循环中的VHDL错误,vhdl,Vhdl,在下面的代码中,我收到了以下错误,但我不明白为什么它是一个错误 library ieee; use ieee.std_logic_1164.all; entity RGSTR_SHFT_N_PARAL_B2 is Generic ( n: integer := 4 ); port( DATA : in std_logic_vector((n-1) downto 0); Shift_In : in std_logic; Load : i
library ieee;
use ieee.std_logic_1164.all;
entity RGSTR_SHFT_N_PARAL_B2 is
Generic (
n: integer := 4
);
port(
DATA : in std_logic_vector((n-1) downto 0);
Shift_In : in std_logic;
Load : in std_logic;
Enable : in std_logic;
CLK : in std_logic;
S : out std_logic_vector((n-1) downto 0)
);
end entity RGSTR_SHFT_N_PARAL_B2;
architecture simple of RGSTR_SHFT_N_PARAL_B2 is
signal temp_S: std_logic_vector((n-1) downto 0);
signal LOW0, HIGH1: std_logic; -- Constant Signals
-- Use the D flip flop of B1 excersise
component D_FF_B1 is
port(
Enable : in std_logic;
Load : in std_logic;
Load_Val : in std_logic;
Data_in : in std_logic;
CLK : in std_logic;
Q : out std_logic
);
end component;
begin
p0:process(Enable, CLK) is
begin
-- Initialisations
LOW0 <= '0';
HIGH1 <= '1';
if (Enable = LOW0) then
L0: for i in 0 to (n-1) loop
temp_S(i) <= temp_S(i);
end loop;
elsif (CLK 'event and CLK = HIGH1) then
if (Load = LOW0) then -- Shifter is enabled
L1: for i in 0 to (n-2) loop
temp_S(i) <= temp_S(i+1);
end loop;
temp_S(n-1) <= Shift_In;
else -- Loader is enabled
L2: for i in 0 to (n-1) loop
X1: D_FF_B1 port map(HIGH1, LOW0, LOW0, DATA(i), CLK, temp_S(i));
end loop;
end if;
end if;
L3: for i in 0 to (n-1) loop
S(i) <= temp_S(i);
end loop;
end process p0;
end architecture simple;
ieee库;
使用ieee.std_logic_1164.all;
实体RGSTR_SHFT_N_PARAL_B2为
一般的(
n:整数:=4
);
港口(
数据:标准逻辑向量((n-1)下至0);
移位输入:在标准逻辑中;
负载:在标准逻辑中;
启用:在std_逻辑中;
CLK:标准逻辑中;
S:out标准逻辑向量((n-1)向下至0)
);
终端实体RGSTR_SHFT_N_PARAL_B2;
RGSTR_SHFT_N_PARAL_B2的简单架构是
信号温度:标准逻辑向量((n-1)下降到0);
信号低0,高1:std_逻辑;——恒定信号
--使用B1练习的D触发器
部件D_FF_B1为
港口(
启用:在std_逻辑中;
负载:在标准逻辑中;
加载值:在标准逻辑中;
数据输入:在标准逻辑中;
CLK:标准逻辑中;
Q:输出标准逻辑
);
端部元件;
开始
p0:进程(启用、CLK)为
开始
--初始化
LOW0在进程中实例化模块
不是合法的VHDL语法,如所示:
p0:process(Enable, CLK) is
begin
...
L2: for i in 0 to (n-1) loop
X1: D_FF_B1 port map(HIGH1, LOW0, LOW0, DATA(i), CLK, temp_S(i));
end loop;
...
end process p0;
模块的实例化必须作为进程
之外的并发语句进行
根据代码,似乎可以移动模块实例化
在过程之外
,代码如下:
signal temp_S_x1 : std_logic_vector((n-1) downto 0);
...
L2 : for i in 0 to (n-1) generate
X1 : D_FF_B1 port map(HIGH1, LOW0, LOW0, DATA(i), CLK, temp_S_x1(i));
end generate;
...
p0 : process(Enable, CLK) is
...
L2: for i in 0 to (n-1) loop
temp_S(n-1) <= temp_S_x1(i);
end loop;
或者直接使用“0”和“1”,而不是声明任何常量
还请注意,p0
进程
不是flip的格式正确的进程
失败,因此您将收到来自Quartus的一些额外警告,因为缺少
temp_S
灵敏度列表中的信号。如果同步使用启用
,则
使用如下模板:
p0 : process(Enable, CLK) is
begin
if rising_edge(CLK) then
if (Enable = '0') then
所以我不应该在我的程序中使用进程。。。或者还有其他方法吗?@G.V.:见上面答案中添加的示例。
constant LOW0 : std_logic := '0';
constant HIGH1 : std_logic := '1';
p0 : process(Enable, CLK) is
begin
if rising_edge(CLK) then
if (Enable = '0') then