Ошибка оператора последовательного условного назначения сигнала VHDL

В моем коде VHDL у меня есть ошибка в sig_out_real <= X"00" & sig_in when sig_in(7)='0' else X"ff" & sig_in;.

Я не думаю, что это синтаксическая ошибка. Но Quartus показывает ошибку в этот момент.

Я не понимаю, почему это ошибка.

Кто-нибудь может предоставить информацию:

-- Ошибка--

Ошибка (10500): синтаксическая ошибка VHDL в S8BT16B.vhd(35) рядом с текстом «когда»; ожидание ";"

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_arith.all;
use work.fft_package.all;

entity S8BT16B is
port( 
    clk_50 : in std_logic;
    clk_baud : in std_logic;
    main_reset : in std_logic;
    enable : in std_logic;
    sig_in : in signed (7 downto 0);
    sig_out : out complex;
    valid_output : out std_logic
  );
end S8BT16B; 

architecture Behavioral of S8BT16B is
type state is (idle,start);
signal state_reg, next_state_reg : state;
signal sig_out_real : signed(15 downto 0);  
begin           
state_change : process(clk_50, main_reset)
begin
    if (main_reset = '1' or enable = '0') then
        state_reg <= idle;
    elsif (main_reset ='0' and enable = '1') then
        state_reg <= next_state_reg;
    end if;
end process;

S8BT16B_active : process(clk_baud, state_reg)
begin       
    if (state_reg = idle) then
        sig_out_real <="0000000000000000";
        sig_out <=(sig_out_real,"0000000000000000");
        next_state_reg <= start;
        valid_output <= '0';
    elsif (state_reg = start and enable = '1') then         
        sig_out_real <= X"00" & sig_in when sig_in(7)='0' else X"ff" & sig_in;
        sig_out <= (signed_converted_input, "0000000000000000");
        next_state_reg <= idle;
        valid_output <= '1';
    end if;     
end process;
end Behavioral; 

person Kim    schedule 14.02.2016    source источник
comment
Будьте осторожны при использовании функций VHDL'08, таких как when...else, в операторах процесса. Это поддерживается в Quartus, когда вы включаете VHDL'08 для синтеза в своем проекте. Но другие функции VHDL'08 могут не поддерживаться, что приводит к сообщениям об ошибках. Также всегда старайтесь создать минимальный, полный и проверяемый пример, когда спрашиваете здесь.   -  person Martin Zabel    schedule 14.02.2016


Ответы (1)


Ваш код не представляет собой минимальный, полный и проверяемый пример.

Пакет fft_package, предположительно содержащий объявление типа для complex, отсутствует.

Декларации для signed_converted_input тоже нет.

Оператор последовательного условного назначения сигнала доступен только в VHDL-2008.

Есть хороший аргумент в пользу того, что пакеты Synopsys std_logic_arith и std_logic_signed несовместимы с определенным пакетом IEEE Std 1076-2008 std_logic_1164. Возможно, они были переписаны, чтобы соответствовать новым определениям std_logic_vector и std_ulogic vector, хотя нет, если они работают без совместимости с -2008, без какой-либо серьезной автоматической магии со стороны ALDEC.

Если передача флага совместимости -2008 не исправит ситуацию, самое простое, что вы можете сделать, это заменить оператор последовательного условного присваивания сигнала двумя простыми операторами присваивания сигнала внутри оператора if:

library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;
use ieee.std_logic_arith.all;

package fft_package is
    type complex is record
        sig_real:       signed (15 downto 0);
        sig_imaginary:  signed (15 downto 0);
    end record;
    constant signed_converted_input:    signed (15 downto 0) := (others => '0');
end package;

library ieee;
use ieee.std_logic_1164.all;
-- use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use work.fft_package.all;

entity S8BT16B is
port( 
    clk_50:      in  std_logic;
    clk_baud:    in  std_logic;
    main_reset:  in  std_logic;
    enable:      in  std_logic;
    sig_in:      in  signed (7 downto 0);
    sig_out:     out complex;
    valid_output:  out std_logic
  );
end S8BT16B; 

architecture Behavioral of S8BT16B is
    type state is (idle,start);
    signal state_reg, next_state_reg:   state;
    signal sig_out_real:                signed(15 downto 0);  
begin  

state_change:  
process(clk_50, main_reset)
    begin
        if (main_reset = '1' or enable = '0') then
            state_reg <= idle;
        elsif (main_reset ='0' and enable = '1') then
            state_reg <= next_state_reg;
        end if;
    end process;

S8BT16B_active:  
    process(clk_baud, state_reg)
    begin       
        if state_reg = idle then
            sig_out_real <= "0000000000000000";
            sig_out <=(sig_out_real,"0000000000000000");
            next_state_reg <= start;
            valid_output <= '0';
        elsif state_reg = start and enable = '1' then         
            -- sig_out_real <= X"00" & sig_in when sig_in(7)='0' else
            --                 X"ff" & sig_in;
            if sig_in(7) = '0' then
                sig_out_real <= X"00" & sig_in;
            else 
                sig_out_real <= X"ff" & sig_in;
            end if;

            sig_out <= (signed_converted_input, "0000000000000000");
            next_state_reg <= idle;
            valid_output <= '1';
        end if;     
    end process;
end Behavioral; 

Этот код анализирует, дорабатывает и моделирует (чтобы показать отсутствие несоответствий длины без учета sig_in(7) = '0'), в то время как никаких претензий к его функциональности не делается. Длина выглядит правильно в назначениях sig_out_real.

И, конечно же, не видя фактического содержимого вашего пакета, fft_package не может быть абсолютно уверен в правильности синтаксиса и семантики (фальшивый пакет и ваш модифицированный код согласуются друг с другом).

person Community    schedule 14.02.2016