8

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

4

4 回答 4

19

对于 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”驱动,然后内部信号才能将其值放入数据。
于 2012-07-04T04:44:04.323 回答
7

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

于 2009-10-02T17:30:14.110 回答
1

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

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

于 2013-07-03T20:11:31.870 回答
0

当使用输入输出端口时,当 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,但这不是我得到的。

于 2019-01-03T18:47:48.583 回答