【问题标题】:How to convert std_logic to unsigned in an expression如何在表达式中将 std_logic 转换为无符号
【发布时间】:2019-07-17 13:05:24
【问题描述】:

因此,如果想将 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 表达式中的无符号?

【问题讨论】:

    标签: vhdl


    【解决方案1】:

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

    Cnt &lt;= cnt + ("" &amp; a_valid);

    它应该能够从上下文中计算出类型,否则你可能需要用 unsigned' 来限定它

    【讨论】:

    • 我喜欢这个。它是一个很好的选择。它可能必须写成 (unsigned("") & (A and A_valid))。
    • 就像我说的,这将取决于上下文。这里不需要限定,因为只有一种可能的“+”函数——无符号+无符号。所以 (""&A_Valid) 变成了无符号数(0 到 0)。
    猜你喜欢
    • 2019-09-15
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2020-10-22
    相关资源
    最近更新 更多