VHDL:在常量中使用十六进制值

Posted

技术标签:

【中文标题】VHDL:在常量中使用十六进制值【英文标题】:VHDL: Using hex values in constants 【发布时间】:2016-12-11 04:44:49 【问题描述】:

我是一个 VHDL 菜鸟,试图创建一些常量并为它们分配十六进制数字,但是我不断收到错误。

我希望常量 FOO_CONST 等于 0x38

像这样……

constant FOO_CONST : integer := x"38";

错误:

Type integer does not match with a string literal

我尝试了一些变体,但都没有成功。

如果有任何帮助,我将不胜感激。谢谢!

-迈克

【问题讨论】:

整数没有位。十六进制值是一个位字符串文字,其字符串值等效于可分配给一维数组。整数需要一个抽象字面量,即16#38# 形式的基于字面量。其中 16 是基数,“#”是分隔符。参见 IEEE Std 1076-2008 15. Lexical elements, 15.5.3 Based literals。您还可以use ieee.std_logic_1164.all; use ieee.numeric_std.all;constant FOO_CONST : integer := to_integer(unsigned'(x"38"));将位字符串文字转换为整数,并使用所需的限定表达式指定符号扩展。 你可能想要的是:常量 FOO_CONST : unsigned(7 downto 0) := x"38";在 VHDL 中,人们倾向于使用 unsigned 或 std_logic_vector 比整数更频繁地进行综合。 您也可以使用# numeric literal。如果你使用 16 作为前缀,那么它将接受一个 16 进制数 【参考方案1】:

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

constant FOO_CONST : integer := 16#38#;

【讨论】:

【参考方案2】:

一般来说,你可以在如下表达式中使用字面量:

数字文字可以用从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

字符串、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;

位向量字面量可以用二进制(默认)、opctal 或十六进制表示。为了清楚起见,它们还可能包含嵌入的下划线。这些形式不能用作 std_logic_vector 文字:

BIT_8_BUS <= B"1111_1111";
BIT_9_BUS <= O"353";
BIT_16_BUS <= X"AA55";

注意:

文字支持合成,只要它们是一个类型 可接受的逻辑综合工具。它们要么被合成为 连接到逻辑“1”或“0”或用于帮助最小化 所需的门数。

Refernce

【讨论】:

以上是关于VHDL:在常量中使用十六进制值的主要内容,如果未能解决你的问题,请参考以下文章

C++基础知识之常量(字面量) 变量

C中的十六进制浮点常量

你能装饰一个十六进制常量,让它被解释为一个浮点数吗?

C 常量

08 常量

C 常量