在常量中使用十六进制值

20

我尝试创建一些常量并将十六进制数分配给它们,但是我一直收到错误。

我希望常量FOO_CONST等于0x38

就像这样...

constant FOO_CONST : integer := x"38";

错误信息:

类型整数与字符串文字不匹配

我已经尝试了几种变体,但都没有成功。


2
整数没有位。十六进制值是一个比特串字面量,其字符串值等同于可分配给单维数组的值。整数需要一个抽象字面量,一个基于形式为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
你可能想要的是这样的东西: 常量 FOO_CONST: unsigned(7 downto 0) := x"38";在VHDL中,人们倾向于在综合中使用unsigned或std_logic_vector,而不是整数。 - Timmy Brolin
你也可以使用 # 数字字面量。如果你将其与前缀16一起使用,则它将接受一个16进制数。 - Bettorun
2个回答

32

您可以使用格式 base#value# 来指定整数的基数:

constant FOO_CONST : integer := 16#38#;

8

一般而言,您可以按照以下方式在表达式中使用字面量:

数字字面量可以用任何从 216 的进制表示。为了清晰起见,它们还可以使用下划线分隔。

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

字符数组的文字字面量,如stringbit_vectorstd_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;

枚举类型的字面值可以是字符(如bitstd_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”的连接,要么被用于帮助最小化所需的门数。

参考资料


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接