两个相同类型对象的未定义关系运算符 - VHDL

时间:2018-04-29 19:02:54

标签: operators vhdl

我目前在VHDL中有一个项目来制作一台简单的自动售货机。我有std_logic信号来确定现金是否大于或等于物品的价格。成本是无符号常量,现金是无符号信号,但尽管它们都是等位长度的无符号数,但它告诉我>=运算符未定义。我查看了多个参考指南,我所能找到的只是两个参数必须是同一类型(它们是......)所以我不确定它为什么抛出这个错误

我已经包含了正确的numeric_std库。

type STATE_TYPE is (RDY, CLCT, VND);
signal state : STATE_TYPE;
signal next_state : STATE_TYPE;

signal cash : unsigned (7 downto 0);
signal cashnew : unsigned (7 downto 0);

signal candy : std_logic;
signal candy_vend : std_logic;
constant cost_candy : unsigned := to_unsigned(60, 8);

signal chips : std_logic;
signal chips_vend : std_logic;
constant cost_chips : unsigned := to_unsigned(50, 8);

begin

candy <= candy1 or candy2 or candy3;
chips <= chip1 or chip2;

candy_vend <= candy and (cash >= cost_candy);
chips_vend <= chips and (cash >= cost_chips);

1 个答案:

答案 0 :(得分:1)

与其他语言一样,VHDL具有boolean类型。它是一个完整的类型,在包std.standard中提供。因此,此类型始终可见,因为默认情况下会引用此包。

与其他语言一样, relational 运算符会产生布尔值。整数类型bit和数字逻辑类型std_logic都不是布尔值。 Boolean的值为truefalse,其中位为01std_logic类型支持9个值(9值逻辑,包括例如错误值)。

大多数运算符被定义为接受相同类型的左右操作数,同时再次返回该类型。

因此,您需要在某些时候将表达式转换回std_logic,因为candy_vend期待该类型。

解决方案1:

candy_vend <= candy and ('1' when (cash >= cost_candy) else '0');

解决方案2:

candy_vend <= '1' when ((candy = '1') and (cash >= cost_candy)) else '0';

解决方案3:

function to_sl(value : boolean) return std_logic is
begin
  if value then
    return '1';
  else
    return '0';
  end if;
 end function;

用法:

 candy_vend <= candy and to_sl(cash >= cost_candy);
 candy_vend <= to_sl((candy = '1') and (cash >= cost_candy));