Vhdl 在端口映射中使用when…else语句

Vhdl 在端口映射中使用when…else语句,vhdl,fpga,Vhdl,Fpga,我在港口地图上找不到关于使用when…else Station的任何信息。这似乎是一个正确的形式,但当我编译时,我看到如下错误: 错误(10500):设备上的VHDL语法错误。vhd(68)靠近文本“when”; 应为“),或“,” 这可能是一个愚蠢的错误,因为我对vhdl还不熟悉。你能给我一个提示吗?我将非常感谢任何帮助。 以下是代码,SDA端口为inout类型: com : I2C_com port map ( reset_en => reset_en,

我在港口地图上找不到关于使用when…else Station的任何信息。这似乎是一个正确的形式,但当我编译时,我看到如下错误:

错误(10500):设备上的VHDL语法错误。vhd(68)靠近文本“when”; 应为“),或“,”

这可能是一个愚蠢的错误,因为我对vhdl还不熟悉。你能给我一个提示吗?我将非常感谢任何帮助。 以下是代码,SDA端口为inout类型:

com : I2C_com port map (

             reset_en => reset_en,
             I2C_clock_port => SCL,
             clk => clk,
             sda_read_data <= SDA when RD ='1' else 'Z',
             sda_write_data => SDA 
        );
com:I2C\u com端口映射(
重置\u en=>重置\u en,
I2C_时钟_端口=>SCL,
时钟=>clk,
sda\u读取数据sda
);

首先,你的箭头指向错误的方向。对于端口关联,无论输入或输出端口如何,始终使用
=>

第二:when/else构造不是一个类似于
a?x:y
的表达式,它是特定于when/else信号赋值的:

您需要使用中间信号或适配器功能:

com : I2C_com port map(
        reset_en       => reset_en,
        I2C_clock_port => SCL,
        clk            => clk,
        sda_read_data  => SDA_or_z,
        sda_write_data => SDA
    );
SDA_or_z <= SDA when RD = '1' else 'Z';

首先,你的箭头指向错误的方向。对于端口关联,无论输入或输出端口如何,始终使用
=>

第二:when/else构造不是一个类似于
a?x:y
的表达式,它是特定于when/else信号赋值的:

您需要使用中间信号或适配器功能:

com : I2C_com port map(
        reset_en       => reset_en,
        I2C_clock_port => SCL,
        clk            => clk,
        sda_read_data  => SDA_or_z,
        sda_write_data => SDA
    );
SDA_or_z <= SDA when RD = '1' else 'Z';

使用一个信号温度使用一个信号温度使用一个中间信号。@Brian Drummond谢谢!使用中间信号。@Brian Drummond谢谢!谢谢你的帮助!谢谢你的帮助!