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

时间:2015-01-29 12:47:14

标签: vhdl fpga

我无法找到有关在端口映射中使用... else语句的任何信息。它似乎是一个正确的形式,但当我编译时,我看到这样的错误:

  

错误(10500):在文本附近的Device.vhd(68)处的VHDL语法错误"当&#34 ;;   期待")",或","

这可能是一个愚蠢的错误,因为我仍然对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 
        );

2 个答案:

答案 0 :(得分:2)

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

第二:when / else构造不是像a?x:y这样的表达式在C中。它特定于when / else信号赋值:http://www.sigasi.com/content/signal-assignments-vhdl-withselect-whenelse-and-case

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

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';

或:

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
    );

答案 1 :(得分:0)

当RD =&#39; 1&#39;时,取一个信号temp&lt; = SDA别的&#39; Z&#39 ;; 然后分配sda_read_data&lt; = temp;