VHDL:如何在inout端口上设置一个值?

时间:2009-10-02 16:32:32

标签: vhdl

我正在尝试测试一个VHDL组件,但我似乎无法在这个端口中获取任何行为。我已经尝试将端口设置为从“1”到“ - ”的所有内容,但它仍然在模拟中显示为“U”。任何可能错误的消化?

4 个答案:

答案 0 :(得分:11)

对于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”驱动数据,然后内部信号可以将其值输入数据。

答案 1 :(得分:6)

你需要一个明确的'Z'驱动程序。

答案 2 :(得分:1)

  

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

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

答案 3 :(得分:0)

当使用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能够处理select_a ='0'和float_b ='1'的情况,因为那应该已经将'Z'分配给data_inout,但这不是我得到的。