在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 位。
这就是所谓的“位串文字”。在正确的上下文中,“”内的任何字符串都可以被假定为位字符串文字。
位字符串文字可以应用于任何类型为 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
my_6bit_slv := 6d"10"; -- assigns 001010 to my_6bit_slv