如何在表达式中将 std_logic 转换为无符号
How to convert std_logic to unsigned in an expression
因此,如果想将 std_logic 分配给 1 位 usnigned,我可以只写...
signal X : unsigned(0 downto 0);
signal Y : std_logic;
X(0) <= unsigned(Y)
但是在表达式中使用时,将 std_logic 转换为无符号数的最佳方法是什么。
也就是说,没有直接对unsigned类型的信号做赋值。
我的场景是这样的。我有两个标志 A 和 B,它们是 std_logic 类型的信号。
每个标志都有一个类型为 std_logic 的选通脉冲(A_valid,B_valid),每次它们的标志(A,B)有效时都会断言 1 个时钟周期。
我有一个计数器 (CNT),它是一个无符号类型的信号,必须计算其中一个标志为“1”的次数。
在任何给定的时钟周期,我必须将 CNT 递增 0、1 或 2,具体取决于有多少标志为 1。
这是使用 "if" 语句的直接方法。
signal A : std_logic;
signal A_valid : std_logic;
signal B : std_logic;
signal B_valid : std_logic;
signal CNT : unsigned;
if rising_edge(clk) then
if (A and A_valid and B and B_valid) = '1' then
CNT <= CNT + 2;
elsif (A and A_valid) = '1' then
CNT <= CNT + 1;
elsif (B and B_valid) = '1' then
CNT <= CNT + 1;
end if;
end if;
上面代码的问题在于它不能很好地泛化,因为案例的数量随着标志的数量呈指数增长。例如,如果我有 5 个标志,我将不得不在 IF 语句中写出 32 个分支。
使用聚合和类型标记表示同一事物的更紧凑的方式是...
这样更好,因为我只为每个标志写了一个表达式。
if rising_edge(clk) then
CNT <= CNT + unsigned'(0=> A AND A_valid) + unsigned'(0=> B AND B_valid);
end if;
是否有任何其他内置方法(除了编写函数)将 std_logic 转换为 VHDL 表达式中的无符号?
最简单的方法是将 std_logic 与空数组连接起来,生成长度为 1 的数组。
Cnt <= cnt + ("" & a_valid);
它应该能够从上下文中计算出类型,否则你可能需要用 unsigned'
来限定它
因此,如果想将 std_logic 分配给 1 位 usnigned,我可以只写...
signal X : unsigned(0 downto 0);
signal Y : std_logic;
X(0) <= unsigned(Y)
但是在表达式中使用时,将 std_logic 转换为无符号数的最佳方法是什么。 也就是说,没有直接对unsigned类型的信号做赋值。
我的场景是这样的。我有两个标志 A 和 B,它们是 std_logic 类型的信号。 每个标志都有一个类型为 std_logic 的选通脉冲(A_valid,B_valid),每次它们的标志(A,B)有效时都会断言 1 个时钟周期。 我有一个计数器 (CNT),它是一个无符号类型的信号,必须计算其中一个标志为“1”的次数。 在任何给定的时钟周期,我必须将 CNT 递增 0、1 或 2,具体取决于有多少标志为 1。
这是使用 "if" 语句的直接方法。
signal A : std_logic;
signal A_valid : std_logic;
signal B : std_logic;
signal B_valid : std_logic;
signal CNT : unsigned;
if rising_edge(clk) then
if (A and A_valid and B and B_valid) = '1' then
CNT <= CNT + 2;
elsif (A and A_valid) = '1' then
CNT <= CNT + 1;
elsif (B and B_valid) = '1' then
CNT <= CNT + 1;
end if;
end if;
上面代码的问题在于它不能很好地泛化,因为案例的数量随着标志的数量呈指数增长。例如,如果我有 5 个标志,我将不得不在 IF 语句中写出 32 个分支。
使用聚合和类型标记表示同一事物的更紧凑的方式是... 这样更好,因为我只为每个标志写了一个表达式。
if rising_edge(clk) then
CNT <= CNT + unsigned'(0=> A AND A_valid) + unsigned'(0=> B AND B_valid);
end if;
是否有任何其他内置方法(除了编写函数)将 std_logic 转换为 VHDL 表达式中的无符号?
最简单的方法是将 std_logic 与空数组连接起来,生成长度为 1 的数组。
Cnt <= cnt + ("" & a_valid);
它应该能够从上下文中计算出类型,否则你可能需要用 unsigned'
来限定它