在 VHDL 中连接位向量和十六进制
Concatenating bit vector and hex in VHDL
这里有一个快速的问题要问你们。我在这一行中得到了标准的“运算符 & 的 0 定义”:
if(unsigned(counter) > to_unsigned("000" & x"8000000")) then
我知道有更简单的解决方法,包括仅向“计数器”添加一点并使用 x"08000000",但我想知道将来处理这种特殊情况的正确方法以进行连接。
正如评论中所强调的那样,您收到错误的原因是因为 to_unsigned
需要一个类型为 natural
的参数,而您给它的是一个未指定类型的向量文字。
对我来说,这里真正的解决方案是一般编码练习。为了可读性和可维护性,您的代码中不应有 'magic numbers',就像您在示例中所做的那样。两年后,可能有人会想“0x08000000 到底有什么意义!?”。类似下面的内容将完全避免您问题中的情况:
constant COUNTER_WIDTH : natural := 30;
-- Some comment explaining why the following is a concatenation of two things
constant COUNTER_THRESHOLD : unsigned(COUNTER_WIDTH-1 downto 0) := "000" & x"8000000";
signal counter : unsigned(COUNTER_WIDTH-1 downto 0);
...
if(counter > COUNTER_THRESHOLD) then
- 使用常量设置宽度,然后用于常量和信号声明
- 将幻数阈值移动到一个常量,如果给定上下文,该常量可以再次具有更有意义的名称
- 首先给出计数器类型
unsigned
,以避免转换
请注意,我可能还会给 counter
一个更有意义的名称,例如在 UART 中,它可能被称为 rx_bit_counter
.
本网站上的大量问题都有不止一种可能的解决方案,所以我认为这并不能构成所有问题 'opinion based',因为我们在问题指南中使用了该短语。
这里有一个快速的问题要问你们。我在这一行中得到了标准的“运算符 & 的 0 定义”:
if(unsigned(counter) > to_unsigned("000" & x"8000000")) then
我知道有更简单的解决方法,包括仅向“计数器”添加一点并使用 x"08000000",但我想知道将来处理这种特殊情况的正确方法以进行连接。
正如评论中所强调的那样,您收到错误的原因是因为 to_unsigned
需要一个类型为 natural
的参数,而您给它的是一个未指定类型的向量文字。
对我来说,这里真正的解决方案是一般编码练习。为了可读性和可维护性,您的代码中不应有 'magic numbers',就像您在示例中所做的那样。两年后,可能有人会想“0x08000000 到底有什么意义!?”。类似下面的内容将完全避免您问题中的情况:
constant COUNTER_WIDTH : natural := 30;
-- Some comment explaining why the following is a concatenation of two things
constant COUNTER_THRESHOLD : unsigned(COUNTER_WIDTH-1 downto 0) := "000" & x"8000000";
signal counter : unsigned(COUNTER_WIDTH-1 downto 0);
...
if(counter > COUNTER_THRESHOLD) then
- 使用常量设置宽度,然后用于常量和信号声明
- 将幻数阈值移动到一个常量,如果给定上下文,该常量可以再次具有更有意义的名称
- 首先给出计数器类型
unsigned
,以避免转换
请注意,我可能还会给 counter
一个更有意义的名称,例如在 UART 中,它可能被称为 rx_bit_counter
.
本网站上的大量问题都有不止一种可能的解决方案,所以我认为这并不能构成所有问题 'opinion based',因为我们在问题指南中使用了该短语。