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】:一般来说,你可以在如下表达式中使用字面量:
数字文字可以用从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
字符串、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:在常量中使用十六进制值的主要内容,如果未能解决你的问题,请参考以下文章