VHDL: Type of “variable” is incompatible with type of <=

▼魔方 西西 提交于 2019-12-25 02:09:00

问题


Could some explain why i get syntax error with this piece of code..

An <= "1110" when anode = "00" else
AN <= "1101" when anode = "01" else
An <= "1011" when anode = "10" else 
An <= "0111" when anode = "11";

segment <= counter_1r    when anode = "00" else
segment <= counter_10r   when anode = "01" else
segment <= counter_100r  when anode = "10" else
segment <= counter_1000r When anode = "11";

it says

ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 181. Type of An is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 182. Type of An is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 183. Type of An is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 181. Type of An is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 182. Type of An is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 183. Type of An is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 186. Type of segment is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 187. Type of segment is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 188. Type of segment is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 186. Type of segment is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 187. Type of segment is incompatible with type of <=.
ERROR:HDLParsers:800 - "C:/.Xilinx/Stopur/main.vhd" Line 188. Type of segment is incompatible with type of <=.

Which i Don't understand, because In my code i've set all the affected element in my entity to be output, they are all using the same type.

PORT(
    CLK: in std_logic;
--  LED: out std_logic_vector (7 downto 0);
--  Switch: in std_logic_vector(7 downto 0);
    Segment: out std_logic_vector (7 downto 0); 
    AN: out std_logic_vector (3 downto 0) 
);
end Main;

architecture Behavioral of Main is
    signal counter_1000:  integer range 0 to 9;
    signal counter_100:   integer range 0 to 9;
    signal counter_10:    integer range 0 to 9;
    signal counter_1:     integer range 0 to 9;
    signal counter_1r:    std_logic_vector(7 downto 0);
    signal counter_10r:   std_logic_vector(7 downto 0);
    signal counter_100r:  std_logic_vector(7 downto 0);
    signal counter_1000r: std_logic_vector(7 downto 0);
    signal prescaler:     integer range 0 to 50000000;
    signal limit:         integer range 0 to 50000000;
    signal Anode:         std_logic_vector(1 downto 0);
begin

回答1:


To see why you get the error message, look at your code like this:

An <= "1110" when anode = "00" else (AN <= "1101")....

The else clause will be compiled as a comparison of AN with 1101 to see if it's less-than-or-equal-to. Which is of type boolean, which is incompatible with the type of An, a vector. (I wish VHDL hadn't picked <= as an assignment operator, but there we are!)

The syntax you need is more like this (note the lack of <= on the other lines)

An <= "1110" when anode = "00" else
      "1101" when anode = "01" else
      "1011" when anode = "10" else    
      "0111" when anode = "11" else
      null;



回答2:


Conditional Signal Assignment (outside of a process) is written as:

An <=
    "1110" when anode = "00" else
    "1101" when anode = "01" else
    "1011" when anode = "10" else 
    "0111" when anode = "11" else
    "0000";

segment <=
    counter_1r    when anode = "00" else
    counter_10r   when anode = "01" else
    counter_100r  when anode = "10" else
    counter_1000r When anode = "11" else
    "00000000";

Inside of a process, you will either need to use an if statement or a case statement.



来源:https://stackoverflow.com/questions/22282539/vhdl-type-of-variable-is-incompatible-with-type-of

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!