在下面的代码中,我收到以下错误,但我不明白为什么会出错。
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;
错误讯息:
Error (10500): VHDL syntax error at RGSTR_SHFT_N_PARAL_B2.vhd(79) near text "port"; expecting "(", or "'", or "."
Error (10500): VHDL syntax error at RGSTR_SHFT_N_PARAL_B2.vhd(79) near text ";"; expecting ":=", or "<="
我使用Quartus II编译VHDL程序。
答案 0 :(得分:3)
process
中模块的实例化不是合法的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;
模块的实例化必须在process
之外的并发语句中完成。
基于代码,看起来可能会移动模块实例化
在process
之外,代码类似于:
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;
请注意,您应该使用LOW0
声明常量HIGH1
和constant
而不是signal
,然后移除LOW0
HIGH1
中的p0
和process
分配:
constant LOW0 : std_logic := '0';
constant HIGH1 : std_logic := '1';
或直接使用'0'和'1'而不是声明任何常量。
另请注意,p0
process
不是正确格式化的翻转过程
翻牌,所以你会因为失踪而从Quartus得到一些额外的警告
灵敏度列表中的temp_S
信号。如果同步使用Enable
,那么
使用如下模板:
p0 : process(Enable, CLK) is
begin
if rising_edge(CLK) then
if (Enable = '0') then