如何在表达式中将std_logic转换为unsigned

时间:2019-07-17 13:05:24

标签: vhdl

因此,如果想将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?

1 个答案:

答案 0 :(得分:1)

最简单的方法是将std_logic与空数组连接起来,生成长度为1的数组。

Cnt <= cnt + ("" & a_valid);

它应该能够从上下文中计算出类型,否则您可能需要使用未签名的字符来对其进行限定'