2013-12-22 4 views
2

В следующем коде я получаю следующие ошибки, но я не понимаю, почему это ошибка.Ошибка 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 : 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 "<=" 

я скомпилировать программу VHDL с Quartus II.

ответ

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 Присвоить в p0process:

constant LOW0 : std_logic := '0'; 
constant HIGH1 : std_logic := '1'; 

или просто используйте '0' и '1' непосредственно вместо объявления каких-либо констант.

Также отметим, что p0process не правильно отформатированный процесс для флип-флоп , так что вы получите дополнительные предупреждения от Quartus из-за отсутствия temp_S сигнала в списке чувствительности. Если Enable будет использовать синхронно, то использовать шаблон, как:

p0 : process(Enable, CLK) is 
begin 
    if rising_edge(CLK) then 
    if (Enable = '0') then 
+0

Так что я не должен использовать процесс для моей программы ... или есть другой способ? –

+0

@ G.V .: См. Добавленный пример в ответе выше. –

Смежные вопросы