VHDL 中 x"00" 的含义

Fri*_*t64 2 vhdl bit

在VHDL仿真中,有以下行

signal SigA: std_logic_vector(7 downto 0)   := x"00";
...
if Rst = '1' then
  sigA<=    x"00";
Run Code Online (Sandbox Code Playgroud)

SigA是 8 位向量,我假设是8 位x"00"的表示,对吗?0

有人可以解释一下这种表示是如何完成的吗?

我有 6 位向量,也需要表示0为 6 位。

Tri*_*cky 5

这就是所谓的“位串文字”。在正确的上下文中,“”内的任何字符串都可以被假定为位字符串文字。

位字符串文字可以应用于任何类型为 bit 或 std_(u)logic 的数组。因此,对于 bit_vector,只能使用 0/1 个字符,但对于具有 9 种状态类型的 std_logic_vector,可以使用其中任何一个。例如 :

my_9bit_slv <= "U01WLHZX-";

注意:您可以使用 _ 来帮助逻辑分组字符。例如:

my_16bit_slv <= "0000_1111_0000_1111";

2008 年之前的 VHDL 定义了 3 个项目,您可以将其添加到字符串中以更改含义:

x"" = 十六进制。这里的字符只能是 0-9 或 AF(2008 年之前)。这是每个字符 4 位

o"" = 八进制。如上所述,字符只能是 0-7(2008 年之前)。这是每个字符 3 位

b"" = 二进制(默认值)。每个字符 1 位

VHDL 2008 在几个方面改进了位串文字:

在十六进制和八进制中,您现在可以使用字符 X、W、LH、-、U、Z 来表示该字符的 4/3 位

您可以通过在 o/x/b 前面加上总位数来指定文字的长度,它会将值直接放入数组中。其规则是未使用的位必须为 0,否则会出现语法错误

例如:

my_6bit_slv := 6x"3F"; -- ok

my_6bit_slv := 6x"FF"; -- syntax error, the 2 MSBs are 1, and wont fit into the array

此外,您还可以提供字母 s 和 u 来指定数字是“有符号”还是“无符号”。"signed" 将以 MSB 作为符号位并将值填充到正在分配的对象中:

my_6bit_slv := 6sx"F"; -- assigns 111111 to my_6bit_slv as it sign extends x"F" to 6 bits

  1. 您现在可以使用 d 来表示十进制数:

my_6bit_slv := 6d"10"; -- assigns 001010 to my_6bit_slv