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

fla*_*man 0 fpga vhdl

我在端口映射中找不到有关使用when...else 语句的任何内容。这似乎是正确的形式,但当我编译时,我看到这样的错误:

错误 (10500):Device.vhd(68) 文本“when”附近的 VHDL 语法错误;期待“)”或“,”

这可能是一个愚蠢的错误,因为我对 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 
        );
Run Code Online (Sandbox Code Playgroud)

Phi*_*ppe 5

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

第二:when/else结构不是像a?x:yC中那样的表达式。它特定于when/else信号分配:http://www.sigasi.com/content/signal-assignments-vhdl-withselect-whenelse-and -案件

您需要使用中间信号,或使用适配器函数:

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';
Run Code Online (Sandbox Code Playgroud)

或者:

com : I2C_com port map(
        reset_en       => reset_en,
        I2C_clock_port => SCL,
        clk            => clk,
        sda_read_data  => myFunction(SDA,RD),
        sda_write_data => SDA
    );
Run Code Online (Sandbox Code Playgroud)