【问题标题】:Output value conflict of signals in VHDLVHDL中信号的输出值冲突
【发布时间】:2017-07-10 06:15:34
【问题描述】:

我编写了一个简单的 vhdl 代码,用于在某些条件下通过某些控制信号启用/禁用输出端口。问题是输出信号是 U 或 X,而代码看起来很好。

主要实体如下图所示。第一个进程对rst 敏感,当它为1 时将禁用oe。第二个进程对clk 敏感,并在时钟转换时启用oe。输出值也设置为5

entity test2 is
   port( clk: in std_logic;
         rst: in std_logic;
         num: out integer range 0 to 7;
         oe: out std_logic );
end;
architecture behav of test2 is
begin
    process( rst )
    begin
       if rst = '1' then
         oe <= '0';
       end if;
    end process;
    process( clk )
    begin
       if (clk'event and clk = '1') then
         num <= 5;
         oe <= '1';
       end if;
    end process;
end;

现在考虑测试台文件。可以看出,在主进程中,我将连接到rstr设置为1再设置为0。

entity test2_tb is
end;
architecture behav of test2_tb is
    component test2 port( clk: in std_logic;
                          rst: in std_logic;
                          num: out integer range 0 to 7;
                          oe: out std_logic );
    end component;
    signal c: std_logic := '0';
    signal r: std_logic;
    signal n: integer range 0 to 7 := 2;
    signal o: std_logic;
begin
    u1: test2 port map( c, r, n, o );
    process( c )
    begin
       c <= not c after 2ns;
    end process;
    process
    begin   
       r <= '1';
       wait for 4 ns;
       r <= '0';
       wait for 8 ns;
    end process;
end;

虽然r 为1,但连接到oeo 设置为U。为什么?而且,在时钟的上升沿,o 的值变成了 X。为什么?请看下面的波浪

【问题讨论】:

  • 您之前发布了一个类似的问题,但您删除了该问题证明了同样的问题 - 两个进程驱动一个信号 we。每个具有信号分配的进程都有一个用于该信号的驱动程序。精心设计的网络中的各种驱动程序被分解为一个有效值,该值仅通过分配、强制释放或驱动程序断开来修改。在未解析类型的信号上拥有多个驱动程序是错误的。两个答案都推荐解决方案,从单个进程驱动信号。 Renaud Pacalet 展示了一个符合综合条件的表格。
  • "...虽然代码看起来不错。",这就是你的问题:它没有。在网上找到的许多示例中都描述了您想要创建她的内容。在论坛、教程、Xilinx/IntalAltera 用户指南等上。通过进行一些研究,您可能已经找到了自己的答案。

标签: vhdl


【解决方案1】:

简而言之:您的oe 端口可能不是std_logic 类型,而是std_ulogicclkrst 相同)并且它可能应该由一个进程而不是两个进程驱动:

process(clk)
begin
  if clk'event and clk = '1' then
    if rst = '1' then
      oe <= '0';
    else
      num <= 5;
      oe <= '1';
    end if;
  end if;
end process;

或者,如果您更喜欢异步重置:

process(clk, rst)
begin
  if rst = '1' then
    oe <= '0';
  elsif clk'event and clk = '1' then
    num <= 5;
    oe <= '1';
  end if;
end process;

如果您的工具不能正确支持std_ulogic(不幸的是,有些逻辑合成器不支持std_ulogic,至少在顶层),请使用std_logic,但要非常小心始终驱动您的输出端口(和内部信号)在一个进程中,除非在非常特殊的情况下,您确实希望多个硬件同时驱动相同的硬件线,这是非常罕见的(三态逻辑,高阻抗......)

【讨论】:

  • 所以问题是为什么process(clk,rst) 有效,而process(rst)process(clk) 无效!!两者都应该同时运行。不是吗?
  • 很抱歉坚持,但您真的应该看看 SO VHDL 文档的这个主题。
  • 答案中显示的单个进程有效,因为只有一个驱动程序。
  • @mahmood 我猜你不明白的是,当两个进程驱动相同的信号时会发生什么。而且,也许,一个信号驱动器不会仅仅因为另一个驱动器也驱动信号而停止驱动。
  • (重试)“两者都应该同时运行”因为它们同时运行,它们都在竞争驱动信号......这会导致“0”和“1”的冲突,最终解析为“X”。
【解决方案2】:

即使在您将任务分配给 oe 之后,这些流程仍将继续推动其价值观(因为您从未告诉他们做任何其他事情)。一个驱动 0 一个驱动 1 给出一个 X。使用 if-elsif 语句将两个过程合并为一个。只有一名司机没有冲突。最初他们都在开车。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多