我尝试创建一些常量并将十六进制数分配给它们,但是我一直收到错误。
我希望常量FOO_CONST
等于0x38
就像这样...
constant FOO_CONST : integer := x"38";
错误信息:
类型整数与字符串文字不匹配
我已经尝试了几种变体,但都没有成功。
您可以使用格式 base#value#
来指定整数的基数:
constant FOO_CONST : integer := 16#38#;
一般而言,您可以按照以下方式在表达式中使用字面量:
数字字面量可以用任何从 2
到 16
的进制表示。为了清晰起见,它们还可以使用下划线分隔。
FOO_CONST_HEX <= 16#FF#;
FOO_CONST_BIN <= 2#1010_1010#;
FOO_CONST_BROKEN := 1_000_000.0; -- breaking the number using _
为了清楚地回答这个问题,你可以像Erasmus Cedernaes建议的那样做:
constant FOO_CONST: integer:= 16#38#;
或者
constant FOO_CONST : std_logic_vector := X"38"; -- if you will convert it to a std_logic_vector later
字符数组的文字字面量,如string
、bit_vector
和std_logic_vector
,都放置在双引号中:
constant FLAG :bit_vector(0 to 7) := "11111111";
constant MSG : string := "Hello";
带有小数点的数字字面量是实数,没有小数点的是整数;
constant FREEZE : integer := 32;
constant TEMP : real := 32.0;
实数可以用指数形式表示:
FACTOR := 2.2E-6;
时间类型(以及其他物理类型)的文字必须有单位。单位应该在空格之前,尽管某些工具可能不要求这样做:
constant DEL1 :time := 10 ns;
constant DEL2 :time := 2.27 us;
枚举类型的字面值可以是字符(如bit
和std_logic
),也可以是标识符:
type MY_LOGIC is ('X','0','1','Z');
type T_STATE is (IDLE, READ, END_CYC);
signal CLK : MY_LOGIC := '0';
signal STATE : T_STATE := IDLE;
位向量文字可以用二进制(默认)、八进制或十六进制表示。它们还可以包含嵌入的下划线以增强可读性。这些形式不能用作 std_logic_vector
文字。
BIT_8_BUS <= B"1111_1111";
BIT_9_BUS <= O"353";
BIT_16_BUS <= X"AA55";
字面量在综合时是被支持的,但必须是逻辑综合工具可接受的类型。它们要么被综合为与逻辑“1”或“0”的连接,要么被用于帮助最小化所需的门数。
16#38#
的基本字面量。其中16是基数,'#'是分隔符。请参阅IEEE Std 1076-2008 15.词法元素,15.5.3基于字面量。您还可以使用ieee.std_logic_1164.all; use ieee.numeric_std.all;
和constant FOO_CONST : integer := to_integer(unsigned'(x"38"));
将比特串字面量转换为整数,并使用所需的限定表达式指定符号扩展。 - user1155120#
数字字面量。如果你将其与前缀16一起使用,则它将接受一个16进制数。 - Bettorun