Используя когда... остальное в карте портов

Я не могу найти что-либо об использовании когда... остальное в карте портов. Кажется, это правильная форма, но когда я компилирую, я вижу такую ​​ошибку:

Ошибка (10500): синтаксическая ошибка VHDL в Device.vhd(68) рядом с текстом "когда"; ожидая ")" или ","

Это, вероятно, глупая ошибка, потому что я все еще свеж в 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 ответа

Решение

Во-первых, ваша стрелка указывает в неправильном направлении. Для ассоциаций портов всегда используйте =>независимо от портов ввода или вывода.

Второе: конструкция when / else не является выражением типа a?x:y находится в C. Это относится к назначению сигнала когда / еще: 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
    );

Возьмите один сигнал temp<= SDA, когда RD='1', иначе 'Z'; затем назначьте sda_read_data <= temp;

Другие вопросы по тегам