【问题标题】:VHDL: "others-like" command for std_logic signalsVHDL:std_logic 信号的“others-like”命令
【发布时间】:2017-01-07 16:22:33
【问题描述】:

我想编写一个代码,其中我的 W_EN (std_logic) 信号在需要时设置为 1(如果满足某些条件),否则(如果没有另外指定)为零。如果 W_EN 是 std_logic_vector,我可以使用“others”语句以这种方式执行此操作(在示例代码中,“W_EN”称为“one_if_one”):

signal cnt : unsigned (1 downto 0); --incremented at every clk_cycle
signal one_if_one : std_logic;

process (cnt)
begin
one_if_one <= (others => '0');
if (cnt = "01") then
 one_if_one <= '1';
end if;
end process;

但由于 W_EN 只是一个位,“others”不能与它一起使用。 所以我想问你是否有某种方法可以实现“如果没有在过程中以不同方式指定,则设置为零”命令。

PS:我知道我可以简单地编写 if 的 else 分支,但我不想这样做,因为我的真实代码会出现更多问题。

PPS:目前我找到的唯一解决方案是替换该行:

one_if_one <= (others => '0');

 one_if_one <= 'L';

但这会有不同的含义,因为“其他人”强加的零是一个强零。

提前感谢您的帮助。

【问题讨论】:

  • one_if_one &lt;= '0'; ... 在一个进程中,“最后一个分配获胜”,因此您不会在同一个信号上创建多个驱动程序。
  • 如果您有问题,为什么不发布您的真实代码,而不是一些问题不明显的假设代码?
  • Brian 指出的过程中有一个驱动程序,每个驱动程序对于在特定模拟时间活动的每个投影输出波形都有一个事务(IEEE Std 1076-2008 10.5 Signal assignment statement, 10.5.2.2执行一个简单的赋值语句)。在您的 if 语句之前分配“0”而不是聚合值。当您的 if 语句中的条件为真时,它的封闭赋值取代了先前赋值为“1”的赋值。在 if 语句中指定不同 而不是“...在进程中指定不同”。

标签: vhdl hardware


【解决方案1】:

你不需要在这里做任何特别的事情。如果一个信号在特定进程中被多次分配,last 分配就是实际分配的值。

process (cnt)
begin
  one_if_one <= '0';
  if (cnt = "01") then
    one_if_one <= '1';
  end if;
end process;

等价于

process (cnt)
begin
  if (cnt = "01") then
    one_if_one <= '1';
  else
    one_if_one <= '0';
  end if;
end process;

您尝试使用的others 语法专门用于分配数组类型,因此它对于std_logic 类型的对象没有任何意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多