VHDL时序条件信号赋值语句错误

VHDL sequential conditional signal assignment statement error

在我的 VHDL 代码中 sig_out_real <= X"00" & sig_in when sig_in(7)='0' else X"ff" & sig_in; 有一个错误。

我认为这不是语法错误。但是 Quartus 在那个时候显示错误。

我不明白为什么会出错。

谁能提供资料:

-- 错误--

Error (10500): VHDL syntax error at S8BT16B.vhd(35) near text "when"; expecting ";"

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; 

您的代码没有 Minimal, Complete, and Verifiable example

可能包含 complex 类型声明的包 fft_package 不存在。

signed_converted_input 的声明也不存在。

顺序条件信号赋值语句仅在 VHDL-2008 中可用。

Synopsys 包 std_logic_arith 和 std_logic_signed 与 IEEE 标准 1076-2008 定义的包 std_logic_1164 不兼容是有道理的。有可能它们已经被重写以适应 std_logic_vector 和 std_ulogic 向量的新定义,尽管如果它们在没有 -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 不能绝对保证语法和语义有效性(伪包和您修改后的代码彼此一致)。