VHDL: проблема с неожиданным IF - PullRequest
0 голосов
/ 12 сентября 2011

Здравствуйте, я пытаюсь изучить VHDL в среде xilinx ISE, и я не могу заставить этот код работать, и я не знаю, почему. Я пробовал одинарные кавычки, используя / не используя ands, но ничего не работает. Может ли кто-нибудь помочь мне?

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;

entity teh_3 is
    Port ( thermo_input : in  STD_LOGIC_VECTOR(3 DOWNTO 0);
           too_hot : out  STD_LOGIC;
           too_cold : out  STD_LOGIC;
           just_right : out  STD_LOGIC);
end teh_3;

architecture Behavioral of teh_3 is

begin

IF thermo_input < "1000" THEN
  too_cold <='1' and
  too_hot <='0' and
  just_right <='0';
ELSIF thermo_input > "1011" THEN 
    too_hot <='1' and
    too_cold <='0' and
    just_right <='0';
ELSIF thermo_input > "0111" THEN 
  just_right <='1' and
  too_hot <='0' and
  too_cold <='0';
ELSE
  just_right <='0' and
  too_hot <='0' and
  too_cold <='0';
END IF;

конец поведенческий;

ERROR:HDLParsers:164 - "/home/student/kokeilu/kokeil.vhd" Line 40. parse error, unexpected IF

Спасибо!

Ответы [ 3 ]

5 голосов
/ 12 сентября 2011

По сути, вы не можете использовать, если вне процесса.

Кроме того, не используйте std_logic_arith, используйте numeric_std - http://parallelpoints.com/node/3


Для исправления, создания процесса или использования правильного комбинаторного синтаксиса, предложенного Патриком..

То, как вы это делаете в настоящее время, должно быть комбинаторным процессом , поэтому будьте осторожны, чтобы получить все ваши входные данные в списке чувствительности или использовать новыйVHDL-2008 process(all) синтаксис.Зависит от того, какую версию ISE вы используете, от того, поддерживается ли она.

Или сделайте это синхронным процессом - так пишется большая часть кода для ПЛИС.

Добавьте вход clk к вашей сущности, а затем поместите свой код if/elsif/else в синхронный процесс:

process (clk)
begin
  if thermo_input < "1000" then
   .... etc
end process;

Наконец, вы не используете AND, чтобы сделать нескольковещи происходят одновременно:

IF thermo_input < "1000" THEN
  too_cold <='1'; -- semicolons here, not ANDs!
  too_hot <='0';
  just_right <='0';

- правильный путь!

2 голосов
/ 12 сентября 2011

if может использоваться только внутри процесса.Вместо этого вы можете использовать WHEN или создать процесс.Мне следует обратиться к утверждению когда, которое выглядит следующим образом.

Пример:

too_cold   <= '1' WHEN (thermo_input < "1000") ELSE '0';
too_hot    <= '1' WHEN (thermo_input > "1011") ELSE '0';
just_right <= '1' WHEN (thermo_input > "0111" AND thermo_input < "1011") ELSE '0';

Я не проверял его, но это для того, чтобы дать вам представление.

1 голос
/ 12 сентября 2011

Вы также должны быть осторожны с thermo_input > "0111"

Убедитесь, что вы дважды подумаете о том, что означает "0111".Это 4-х разрядное целое число со знаком или без знака?Я рекомендую сделать это явным.Библиотека 'numeric_std' содержит множество полезных методов.

...