2016-11-25 2 views
0

Я понятия не имею, почему возникает следующая ошибка.Ошибка VHDL 10500

Ошибка (10500): Синтаксическая ошибка VHDL на IR_REG.vhd (15) рядом с текстом «if»; ожидая «конца», или «(», или идентификатор («если» является зарезервированным ключевым словом), или параллельный оператор

Вот мой код любая помощь будет принята с благодарностью

architecture behavior of IR_REG is 
    signal temp: std_logic_vector(1 downto 0); 
    begin 
    if IR_LD='1' then 
     temp <= Input when clk = '1'; 
     IR <= temp when clk = '0'; 
    end if; 
    end behavior; 
+0

Оператор If является последовательным заявлением. Часть оператора структуры архитектуры будет содержать параллельные операторы. – user1155120

+1

Возможный дубликат [Синтаксис ошибки VHDL рядом с] (http://stackoverflow.com/questions/20435228/vhdl-syntaxe-error-near-if) – sonicwave

ответ

0

Вы не можете иметь if заявления внутри architecture. Основная идея architecture является параллельным выполнением всех операторов Там не существует понятия порядка. например,

architecture Struct of Counter 
    signal A1: bit; 
    signal A2: bit; 
begin 
    A1 <= A2 and '1'; 
    A2 <= '1'; 
end Struct; 

Если это был последовательный блок, A1 выводит 0, так как A2 берет значение по умолчанию 0. Но алгоритм VHDL выполняет этот блок умно несколько раз, давая эффект, что оба утверждения и A2 <= '1'; произошли одновременно.

Следовательно, если вы запустите этот код, вы получите A1 как 1 и A2 как 1.

На ваш вопрос, if - это последовательный оператор и не может быть внутри процесса из-за его последовательного характера. Тем не менее, when может использоваться непосредственно, давая эффект мультиплексора .

Глядя на ваш код, кажется, вы хотели сделать чувствительную к уровню защелку. Так вы можете это сделать.

architecture behavior of IR_REG is 
    signal temp: std_logic_vector(1 downto 0); 
    begin 
     process(IR_LD, Input, temp, clk) 
     begin 
     if IR_LD = '1' and clk = '1' then 
      temp <= Input; 
     end if; 
     if IR_LD = '1' and clk = '0' then 
      IR <= temp; 
     end if; 
     end process; 
    end behavior; 

Этот код даст эффект мультиплексора, но кажется, что вы хотите создать защелку, как показано выше.

architecture behavior of IR_REG is 
    signal temp: std_logic_vector(1 downto 0); 
    begin 
     temp <= Input when clk = '1' and IR_LD = '1' else "00"; 
     IR <= temp when clk = '0' and IR_LD = '1' else "00"; 
    end behavior; 
+1

От IEEE Std 1076-2008 Приложение I Глоссарий: ** блок: * * (A) Представление части иерархии дизайна. Блок представляет собой либо внешний блок, либо внутренний блок. ** внутренний блок **: вложенный блок в блоке проектирования, как определено оператором блока. ** внешний блок: ** Объект проектирования верхнего уровня, который находится в библиотеке и может использоваться как компонент в других проектах. Есть инструкция if, нет блока if. – user1155120

+0

Ваша «основная идея в« архитектуре »отсутствует в стандарте VHDL. Слово «одновременный» используется только в одном месте, определение - защищенный тип ***: тип, объекты которого защищены от одновременного доступа более чем одним процессом. – user1155120

+0

Будет ли слово * concurrent * работать лучше здесь? Спасибо за комментарии – martianwars