【问题标题】:VHDL: how to set a value on an inout port?VHDL:如何在输入端口上设置值?
【发布时间】:2009-10-02 16:32:31
【问题描述】:

我正在尝试测试VHDL 组件,但我似乎无法让这个输入端口给我任何行为。我尝试将端口设置为从“1”到“-”的所有内容,但它在模拟中仍然显示为“U”。任何可能有什么问题的建议?

【问题讨论】:

  • 将其显式设置为 Z 使端口为我提供数据,但现在我似乎无法从端口读取内部信号:(

标签: vhdl


【解决方案1】:

对于 Inout 端口(例如在 RAM 中):

....
port(
    data    :inout std_logic_vector (DATA_WIDTH-1 downto 0);
....
-- Memory Write Block
-- Write Operation : When we = 1, cs = 1
  MEM_WRITE: process (address, cs, we, data, address_1, cs_1, we_1, data_1) begin
    if (cs = '1' and we = '1') then
       mem(conv_integer(address)) <= data;
    end if;
  end process;

 -- Tri-State Buffer control
  data <= data_out when (cs = '1' and oe = '1' and we = '0') else (others=>'Z');

 -- Memory Read Block
  MEM_READ: process (address, cs, we, oe, mem) begin
    if (cs = '1' and we = '0' and oe = '1') then
      data_out <= mem(conv_integer(address));
    else
      data_out <= (others=>'0');
    end if;
  end process;

您使用条件为 inout 分配数据读取和写入。读取数据时,由另一个模块驱动。写的时候是内部驱动的。

  • 当由另一个模块驱动时(如在信号中),数据在所有“Z”和向量“0101010”之间解析。数据将驱动为“0101010”。
  • 在另一种情况下:其他模块必须将数据驱动全“Z”,然后内部信号才能将其值放入数据。

【讨论】:

    【解决方案2】:

    您需要一个明确的驱动程序来“Z”。

    【讨论】:

    • 我知道是这种情况,但我不知道它在 vhdl 代码中的含义
    【解决方案3】:

    我尝试将端口设置为从“1”到“-”的所有值,但在模拟中它仍然显示为“U”。

    除了关于分配/读取输入端口的好答案之外,上面引用的文本可能与分配到两个不同位置的端口有关,因此它被解析为“U”。

    【讨论】:

      【解决方案4】:

      当使用 inout 端口时,当 VHDL 语句显然太复杂而无法通过综合来推断 IOBUF 时,我被一个实例化 OBUF 而不是 IOBUF 的综合工具所困扰。下面是一个简单的例子(假设所有信号都是std_logic)让我感到困惑:

      data_a <= '1' when assert_a = '1' else '0';
      data_b <= 'Z' when float_b = '1' else '0';  
      data_inout <= data_a when choose_a = '1' else data_b;
      

      在我的失败案例中,综合为 data_inout 生成了一个 OBUF。我本来希望 IOBUF 来处理 choose_a='0' 和 float_b='1' 的情况,因为这应该将 'Z' 分配给 data_inout,但这不是我得到的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多