因此,如果想将std_logic分配给1位usnigny,我可以编写...
signal X : unsigned(0 downto 0);
signal Y : std_logic;
X(0) <= unsigned(Y)
但是在表达式中使用std_logic到unsigned的最佳方法是什么? 也就是说,无需直接对unsigned类型的信号进行赋值。
我的情况是这样。我有两个标志A和B,它们是std_logic类型的信号。 每个标志都有一个std_logic类型的选通脉冲(A_valid,B_valid),每当它们的标志(A,B)有效时,它就会断言1个时钟周期。 我有一个计数器(CNT),它是无符号类型的信号,该信号必须计算两个标志之一为“ 1”的次数。 在任何给定的时钟周期内,我必须根据CNT的标志个数将CNT加0、1或2。
这是使用“ 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;
在VHDL中的表达式中,是否还有其他内置方法(除了编写函数外)可将std_logic转换为unsigned?
答案 0 :(得分:1)
最简单的方法是将std_logic与空数组连接起来,生成长度为1的数组。
Cnt <= cnt + ("" & a_valid);
它应该能够从上下文中计算出类型,否则您可能需要使用未签名的字符来对其进行限定'