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

Ошибка (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 
        );
0
flanela_man 29 Янв 2015 в 15:47

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
    );
3
Philippe 29 Янв 2015 в 14:16

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

0
Raj 31 Янв 2015 в 11:23