开发者

VHDL: Problem with unexpected IF

Hello I am trying to learn VHDL in xilinx ISE enviroment and I can not get this code to work and i do not know why. I have tried single quotes using/not using ands, but nothing works. Could someone please help me?

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

---- Uncomm开发者_StackOverflowent 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;

end Behavioral;

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

Thanks!


Fundamentally, you can't use if outside of a process.

Also, don't use std_logic_arith, use numeric_std - http://parallelpoints.com/node/3


To fix, make a process, or use the proper combinatorial syntax as suggested by patrick.

The way you have it currently it will have to be a combinatorial process, so be careful to get all your inputs in the sensitivity list or use the new VHDL-2008 process(all) syntax. Depends on which version of ISE you are using as to whether that is supported.

Or make it a synchronous process - this is how most code for FPGAs is written.

Add a clk input to your entity and then put your if/elsif/else code inside a synchronous process:

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

Finally, you don't use AND to make several things happen at once:

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

is the right way!


An if can only be used inside a process. You can use a WHEN instead or you have to create a process. I Should go for the when statement, which looks like this.

Example:

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';

I didn't test it, but this is to give you an idea.


You should also be careful with thermo_input > "0111"

Make sure you think twice about what "0111" represents. Is it a signed or unsigned 4 bit integer? I recommend to make this explicit. Library 'numeric_std' contains a lot of helpful methods.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜