【问题标题】:VHDL: Using hex values in constantsVHDL:在常量中使用十六进制值
【发布时间】: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 进制数

标签: hex vhdl constants


【解决方案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

    【讨论】:

      猜你喜欢
      • 2018-04-21
      • 1970-01-01
      • 2013-07-04
      • 2012-06-10
      • 2018-07-26
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多